19 #define STACK_SIZE 512
24 #include <linux/types.h>
25 #include <linux/edd.h>
27 #include <asm/setup.h>
29 #include <asm/cpufeature.h>
34 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
36 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
41 #define cpu_relax() asm volatile("rep; nop")
46 asm volatile(
"outb %0,%1" : :
"a" (
v),
"dN" (port));
51 asm volatile(
"inb %1,%0" :
"=a" (
v) :
"dN" (port));
57 asm volatile(
"outw %0,%1" : :
"a" (
v),
"dN" (port));
62 asm volatile(
"inw %1,%0" :
"=a" (
v) :
"dN" (port));
68 asm volatile(
"outl %0,%1" : :
"a" (
v),
"dN" (port));
73 asm volatile(
"inl %1,%0" :
"=a" (
v) :
"dN" (port));
77 static inline void io_delay(
void)
79 const u16 DELAY_PORT = 0x80;
80 asm volatile(
"outb %%al,%0" : :
"dN" (DELAY_PORT));
85 static inline u16 ds(
void)
88 asm(
"movw %%ds,%0" :
"=rm" (
seg));
94 asm volatile(
"movw %0,%%fs" : :
"rm" (
seg));
96 static inline u16 fs(
void)
99 asm volatile(
"movw %%fs,%0" :
"=rm" (
seg));
103 static inline void set_gs(
u16 seg)
105 asm volatile(
"movw %0,%%gs" : :
"rm" (
seg));
107 static inline u16 gs(
void)
110 asm volatile(
"movw %%gs,%0" :
"=rm" (
seg));
116 static inline u8 rdfs8(addr_t
addr)
119 asm volatile(
"movb %%fs:%1,%0" :
"=q" (
v) :
"m" (*(
u8 *)
addr));
122 static inline u16 rdfs16(addr_t
addr)
125 asm volatile(
"movw %%fs:%1,%0" :
"=r" (
v) :
"m" (*(
u16 *)
addr));
128 static inline u32 rdfs32(addr_t addr)
131 asm volatile(
"movl %%fs:%1,%0" :
"=r" (
v) :
"m" (*(
u32 *)
addr));
135 static inline void wrfs8(
u8 v, addr_t addr)
137 asm volatile(
"movb %1,%%fs:%0" :
"+m" (*(
u8 *)addr) :
"qi" (
v));
139 static inline void wrfs16(
u16 v, addr_t addr)
141 asm volatile(
"movw %1,%%fs:%0" :
"+m" (*(
u16 *)addr) :
"ri" (
v));
143 static inline void wrfs32(
u32 v, addr_t addr)
145 asm volatile(
"movl %1,%%fs:%0" :
"+m" (*(
u32 *)addr) :
"ri" (
v));
148 static inline u8 rdgs8(addr_t addr)
151 asm volatile(
"movb %%gs:%1,%0" :
"=q" (
v) :
"m" (*(
u8 *)
addr));
154 static inline u16 rdgs16(addr_t addr)
157 asm volatile(
"movw %%gs:%1,%0" :
"=r" (
v) :
"m" (*(
u16 *)
addr));
160 static inline u32 rdgs32(addr_t addr)
163 asm volatile(
"movl %%gs:%1,%0" :
"=r" (
v) :
"m" (*(
u32 *)
addr));
167 static inline void wrgs8(
u8 v, addr_t addr)
169 asm volatile(
"movb %1,%%gs:%0" :
"+m" (*(
u8 *)addr) :
"qi" (
v));
171 static inline void wrgs16(
u16 v, addr_t addr)
173 asm volatile(
"movw %1,%%gs:%0" :
"+m" (*(
u16 *)addr) :
"ri" (
v));
175 static inline void wrgs32(
u32 v, addr_t addr)
177 asm volatile(
"movl %1,%%gs:%0" :
"+m" (*(
u32 *)addr) :
"ri" (
v));
181 static inline int memcmp(
const void *
s1,
const void *
s2,
size_t len)
184 asm(
"repe; cmpsb; setnz %0"
185 :
"=qm" (diff),
"+D" (s1),
"+S" (
s2),
"+c" (len));
189 static inline int memcmp_fs(
const void *s1, addr_t s2,
size_t len)
192 asm volatile(
"fs; repe; cmpsb; setnz %0"
193 :
"=qm" (diff),
"+D" (s1),
"+S" (
s2),
"+c" (len));
196 static inline int memcmp_gs(
const void *s1, addr_t s2,
size_t len)
199 asm volatile(
"gs; repe; cmpsb; setnz %0"
200 :
"=qm" (diff),
"+D" (s1),
"+S" (
s2),
"+c" (len));
208 #define RESET_HEAP() ((void *)( HEAP = _end ))
209 static inline char *__get_heap(
size_t s,
size_t a,
size_t n)
213 HEAP = (
char *)(((
size_t)HEAP+(a-1)) & ~(a-1));
218 #define GET_HEAP(type, n) \
219 ((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
221 static inline bool heap_free(
size_t n)
223 return (
int)(heap_end-
HEAP) >= (
int)
n;
235 #define memcpy(d,s,l) __builtin_memcpy(d,s,l)
236 #define memset(d,c,l) __builtin_memset(d,c,l)
295 static inline int cmdline_find_option_bool(
const char *
option)
308 int check_cpu(
int *cpu_level_ptr,
int *req_level_ptr,
u32 **err_flags_ptr);
345 size_t strnlen(
const char *
s,
size_t maxlen);