X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Futil.h;h=ec87a4d043eb5ae1d9a0fcf2f7b96f6797f6b755;hb=08b558c53638b18e9b60c8aaebf71475eaada68a;hp=8a46036494309bfdb97ab586c461c57433dbf230;hpb=b49854e0980a030cc8338a7f4ee779ecde1aae38;p=dosdemo diff --git a/src/util.h b/src/util.h index 8a46036..ec87a4d 100644 --- a/src/util.h +++ b/src/util.h @@ -1,6 +1,7 @@ #ifndef UTIL_H_ #define UTIL_H_ +#include #include "inttypes.h" #ifdef __GNUC__ @@ -110,21 +111,26 @@ void halt(void); #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) { @@ -168,14 +174,14 @@ 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 @@ -221,6 +227,36 @@ void __inline memset16(void *dest, uint16_t val, int count) 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_ */