#ifndef UTIL_H_
#define UTIL_H_
+#include <stdlib.h>
#include "inttypes.h"
#ifdef __GNUC__
#ifdef __GNUC__
#if defined(__i386__) || defined(__x86_64__)
-#define memset16(dest, val, count) asm volatile ( \
- "cld\n\t" \
- "test $1, %2\n\t" \
- "jz 0f\n\t" \
- "rep stosw\n\t" \
- "jmp 1f\n\t" \
- "0:\n\t" \
- "shr $1, %2\n\t" \
- "push %%ax\n\t" \
- "shl $16, %%eax\n\t" \
- "pop %%ax\n\t" \
- "rep stosl\n\t" \
- "1:\n\t"\
- :: "D"(dest), "a"((uint16_t)(val)), "c"(count) \
- : "memory")
+#define memset16(dest, val, count) \
+ do { \
+ uint32_t dummy1, dummy2; \
+ asm volatile ( \
+ "cld\n\t" \
+ "test $1, %%ecx\n\t" \
+ "jz 0f\n\t" \
+ "rep stosw\n\t" \
+ "jmp 1f\n\t" \
+ "0:\n\t" \
+ "shr $1, %%ecx\n\t" \
+ "push %%ax\n\t" \
+ "shl $16, %%eax\n\t" \
+ "pop %%ax\n\t" \
+ "rep stosl\n\t" \
+ "1:\n\t"\
+ : "=D"(dummy1), "=c"(dummy2) \
+ : "0"(dest), "a"((uint16_t)(val)), "1"(count) \
+ : "flags", "memory"); \
+ } while(0)
#else
static void INLINE memset16(void *dest, uint16_t val, int count)
{
: "%eax", "%ebx", "%ecx", "%edx")
#define debug_break() \
- asm volatile ("int $3")
+ asm volatile("int $3")
#define halt() \
asm volatile("hlt")
#endif
#ifdef _MSC_VER
-void __inline memset16(void *dest, uint16_t val, int count)
+static void __inline memset16(void *dest, uint16_t val, int count)
{
__asm {
cld
do { \
__asm { int 3 } \
} while(0)
+
+static unsigned int __inline get_cs(void)
+{
+ unsigned int res;
+ __asm {
+ xor eax, eax
+ mov ax, cs
+ mov [res], ax
+ }
+ return res;
+}
#endif
+unsigned int get_cs(void);
+#define get_cpl() ((int)(get_cs() & 3))
+
+void get_msr(uint32_t msr, uint32_t *low, uint32_t *high);
+void set_msr(uint32_t msr, uint32_t low, uint32_t high);
+
+
+/* Non-failing versions of malloc/calloc/realloc. They never return 0, they call
+ * demo_abort on failure. Use the macros, don't call the *_impl functions.
+ */
+#define malloc_nf(sz) malloc_nf_impl(sz, __FILE__, __LINE__)
+void *malloc_nf_impl(size_t sz, const char *file, int line);
+#define calloc_nf(n, sz) calloc_nf_impl(n, sz, __FILE__, __LINE__)
+void *calloc_nf_impl(size_t num, size_t sz, const char *file, int line);
+#define realloc_nf(p, sz) realloc_nf_impl(p, sz, __FILE__, __LINE__)
+void *realloc_nf_impl(void *p, size_t sz, const char *file, int line);
+
+
+
#endif /* UTIL_H_ */