mirror of
https://git.proxmox.com/git/efi-boot-shim
synced 2025-08-15 22:28:09 +00:00
shim: Rework pause functions and add read_counter()
Signed-off-by: Peter Jones <pjones@redhat.com> Upstream-commit-id: fc6b0bca84e
This commit is contained in:
parent
10d6e3d90f
commit
1b382ef850
59
include/asm.h
Normal file
59
include/asm.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* asm.h
|
||||||
|
* Copyright 2018 Peter Jones <pjones@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SHIM_ASM_H_
|
||||||
|
#define SHIM_ASM_H_
|
||||||
|
|
||||||
|
#define __stringify_1(x...) #x
|
||||||
|
#define __stringify(x...) __stringify_1(x)
|
||||||
|
|
||||||
|
static inline uint64_t read_counter(void)
|
||||||
|
{
|
||||||
|
uint64_t val;
|
||||||
|
#if defined (__x86_64__)
|
||||||
|
unsigned long low, high;
|
||||||
|
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
|
||||||
|
val = (low) | (high) << 32;
|
||||||
|
#elif defined(__i386__) || defined(__i686__)
|
||||||
|
__asm__ __volatile__("rdtsc" : "=A" (val));
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
__asm__ __volatile__ ("mrs %0, pmccntr_el0" : "=r" (val));
|
||||||
|
#elif defined(__arm__)
|
||||||
|
__asm__ __volatile__ ("mrc p15, 0, %0, c9, c13, 0" : "=r" (val));
|
||||||
|
#else
|
||||||
|
#error unsupported arch
|
||||||
|
#endif
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__i386__) || defined(__i686__)
|
||||||
|
static inline void pause(void)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__("pause");
|
||||||
|
}
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
static inline void pause(void)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__("wfi");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void pause(void)
|
||||||
|
{
|
||||||
|
uint64_t a, b;
|
||||||
|
int x;
|
||||||
|
extern void msleep(unsigned long msecs);
|
||||||
|
|
||||||
|
a = read_counter();
|
||||||
|
for (x = 0; x < 1000; x++) {
|
||||||
|
msleep(1000);
|
||||||
|
b = read_counter();
|
||||||
|
if (a != b)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !SHIM_ASM_H_ */
|
||||||
|
// vim:fenc=utf-8:tw=75:et
|
156
include/compiler.h
Normal file
156
include/compiler.h
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/*
|
||||||
|
* compiler.h
|
||||||
|
* Copyright 2019 Peter Jones <pjones@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMPILER_H_
|
||||||
|
#define COMPILER_H_
|
||||||
|
|
||||||
|
#ifndef UNUSED
|
||||||
|
#define UNUSED __attribute__((__unused__))
|
||||||
|
#endif
|
||||||
|
#ifndef HIDDEN
|
||||||
|
#define HIDDEN __attribute__((__visibility__ ("hidden")))
|
||||||
|
#endif
|
||||||
|
#ifndef PUBLIC
|
||||||
|
#define PUBLIC __attribute__((__visibility__ ("default")))
|
||||||
|
#endif
|
||||||
|
#ifndef DESTRUCTOR
|
||||||
|
#define DESTRUCTOR __attribute__((destructor))
|
||||||
|
#endif
|
||||||
|
#ifndef CONSTRUCTOR
|
||||||
|
#define CONSTRUCTOR __attribute__((constructor))
|
||||||
|
#endif
|
||||||
|
#ifndef ALIAS
|
||||||
|
#define ALIAS(x) __attribute__((weak, alias (#x)))
|
||||||
|
#endif
|
||||||
|
#ifndef NONNULL
|
||||||
|
#endif
|
||||||
|
#define NONNULL(first, args...) __attribute__((__nonnull__(first, ## args)))
|
||||||
|
#ifndef PRINTF
|
||||||
|
#define PRINTF(first, args...) __attribute__((__format__(printf, first, ## args)))
|
||||||
|
#endif
|
||||||
|
#ifndef FLATTEN
|
||||||
|
#define FLATTEN __attribute__((__flatten__))
|
||||||
|
#endif
|
||||||
|
#ifndef PACKED
|
||||||
|
#define PACKED __attribute__((__packed__))
|
||||||
|
#endif
|
||||||
|
#ifndef VERSION
|
||||||
|
#define VERSION(sym, ver) __asm__(".symver " # sym "," # ver)
|
||||||
|
#endif
|
||||||
|
#ifndef NORETURN
|
||||||
|
#define NORETURN __attribute__((__noreturn__))
|
||||||
|
#endif
|
||||||
|
#ifndef ALIGNED
|
||||||
|
#define ALIGNED(n) __attribute__((__aligned__(n)))
|
||||||
|
#endif
|
||||||
|
#ifndef CLEANUP_FUNC
|
||||||
|
#define CLEANUP_FUNC(x) __attribute__((__cleanup__(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef USED
|
||||||
|
#define USED __attribute__((__used__))
|
||||||
|
#endif
|
||||||
|
#ifndef SECTION
|
||||||
|
#define SECTION(x) __attribute__((__section__(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef OPTIMIZE
|
||||||
|
#define OPTIMIZE(x) __attribute__((__optimize__(x)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CONCAT
|
||||||
|
#define __CONCAT3(a, b, c) a ## b ## c
|
||||||
|
#endif
|
||||||
|
#ifndef CAT
|
||||||
|
#define CAT(a, b) __CONCAT(a, b)
|
||||||
|
#endif
|
||||||
|
#ifndef CAT3
|
||||||
|
#define CAT3(a, b, c) __CONCAT3(a, b, c)
|
||||||
|
#endif
|
||||||
|
#ifndef STRING
|
||||||
|
#define STRING(x) __STRING(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WRITE_ONCE
|
||||||
|
#define WRITE_ONCE(var, val) \
|
||||||
|
(*((volatile typeof(val) *)(&(var))) = (val))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef READ_ONCE
|
||||||
|
#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef likely
|
||||||
|
#define likely(x) __builtin_expect(!!(x), 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef unlikely
|
||||||
|
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Are two types/vars the same type (ignoring qualifiers)? */
|
||||||
|
#ifndef __same_type
|
||||||
|
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Compile time object size, -1 for unknown */
|
||||||
|
#ifndef __compiletime_object_size
|
||||||
|
# define __compiletime_object_size(obj) -1
|
||||||
|
#endif
|
||||||
|
#ifndef __compiletime_warning
|
||||||
|
# define __compiletime_warning(message)
|
||||||
|
#endif
|
||||||
|
#ifndef __compiletime_error
|
||||||
|
# define __compiletime_error(message)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __compiletime_assert
|
||||||
|
#define __compiletime_assert(condition, msg, prefix, suffix) \
|
||||||
|
do { \
|
||||||
|
extern void prefix ## suffix(void) __compiletime_error(msg); \
|
||||||
|
if (!(condition)) \
|
||||||
|
prefix ## suffix(); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _compiletime_assert
|
||||||
|
#define _compiletime_assert(condition, msg, prefix, suffix) \
|
||||||
|
__compiletime_assert(condition, msg, prefix, suffix)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compiletime_assert - break build and emit msg if condition is false
|
||||||
|
* @condition: a compile-time constant condition to check
|
||||||
|
* @msg: a message to emit if condition is false
|
||||||
|
*
|
||||||
|
* In tradition of POSIX assert, this macro will break the build if the
|
||||||
|
* supplied condition is *false*, emitting the supplied error message if the
|
||||||
|
* compiler has support to do so.
|
||||||
|
*/
|
||||||
|
#ifndef compiletime_assert
|
||||||
|
#define compiletime_assert(condition, msg) \
|
||||||
|
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied
|
||||||
|
* error message.
|
||||||
|
* @condition: the condition which the compiler should know is false.
|
||||||
|
*
|
||||||
|
* See BUILD_BUG_ON for description.
|
||||||
|
*/
|
||||||
|
#ifndef BUILD_BUG_ON_MSG
|
||||||
|
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ALIGN
|
||||||
|
#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
||||||
|
#define __ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1)
|
||||||
|
#define ALIGN(x, a) __ALIGN((x), (a))
|
||||||
|
#endif
|
||||||
|
#ifndef ALIGN_DOWN
|
||||||
|
#define ALIGN_DOWN(x, a) __ALIGN((x) - ((a) - 1), (a))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !COMPILER_H_ */
|
||||||
|
// vim:fenc=utf-8:tw=75:et
|
4
shim.c
4
shim.c
@ -2543,16 +2543,14 @@ debug_hook(void)
|
|||||||
#if defined(__x86_64__) || defined(__i386__) || defined(__i686__)
|
#if defined(__x86_64__) || defined(__i386__) || defined(__i686__)
|
||||||
if (x > 4294967294ULL)
|
if (x > 4294967294ULL)
|
||||||
break;
|
break;
|
||||||
__asm__ __volatile__("pause");
|
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
if (x > 1000)
|
if (x > 1000)
|
||||||
break;
|
break;
|
||||||
__asm__ __volatile__("wfi");
|
|
||||||
#else
|
#else
|
||||||
if (x > 12000)
|
if (x > 12000)
|
||||||
break;
|
break;
|
||||||
msleep(5000);
|
|
||||||
#endif
|
#endif
|
||||||
|
pause();
|
||||||
}
|
}
|
||||||
x = 1;
|
x = 1;
|
||||||
}
|
}
|
||||||
|
1
shim.h
1
shim.h
@ -97,6 +97,7 @@
|
|||||||
#define FALLBACK L"\\fb" EFI_ARCH L".efi"
|
#define FALLBACK L"\\fb" EFI_ARCH L".efi"
|
||||||
#define MOK_MANAGER L"\\mm" EFI_ARCH L".efi"
|
#define MOK_MANAGER L"\\mm" EFI_ARCH L".efi"
|
||||||
|
|
||||||
|
#include "include/asm.h"
|
||||||
#include "include/configtable.h"
|
#include "include/configtable.h"
|
||||||
#include "include/console.h"
|
#include "include/console.h"
|
||||||
#include "include/crypt_blowfish.h"
|
#include "include/crypt_blowfish.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user