Rev 1702 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1702 | Rev 1780 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | 37 | ||
38 | #include <arch/pm.h> |
38 | #include <arch/pm.h> |
39 | #include <arch/types.h> |
39 | #include <arch/types.h> |
40 | #include <config.h> |
40 | #include <config.h> |
41 | 41 | ||
42 | extern void asm_delay_loop(__u32 t); |
42 | extern void asm_delay_loop(uint32_t t); |
43 | extern void asm_fake_loop(__u32 t); |
43 | extern void asm_fake_loop(uint32_t t); |
44 | 44 | ||
45 | /** Return base address of current stack. |
45 | /** Return base address of current stack. |
46 | * |
46 | * |
47 | * Return the base address of the current stack. |
47 | * Return the base address of the current stack. |
48 | * The stack is assumed to be STACK_SIZE bytes long. |
48 | * The stack is assumed to be STACK_SIZE bytes long. |
49 | * The stack must start on page boundary. |
49 | * The stack must start on page boundary. |
50 | */ |
50 | */ |
51 | static inline __address get_stack_base(void) |
51 | static inline uintptr_t get_stack_base(void) |
52 | { |
52 | { |
53 | __address v; |
53 | uintptr_t v; |
54 | 54 | ||
55 | __asm__ volatile ("andq %%rsp, %0\n" : "=r" (v) : "0" (~((__u64)STACK_SIZE-1))); |
55 | __asm__ volatile ("andq %%rsp, %0\n" : "=r" (v) : "0" (~((uint64_t)STACK_SIZE-1))); |
56 | 56 | ||
57 | return v; |
57 | return v; |
58 | } |
58 | } |
59 | 59 | ||
60 | static inline void cpu_sleep(void) { __asm__ volatile ("hlt\n"); }; |
60 | static inline void cpu_sleep(void) { __asm__ volatile ("hlt\n"); }; |
Line 66... | Line 66... | ||
66 | * Get byte from port |
66 | * Get byte from port |
67 | * |
67 | * |
68 | * @param port Port to read from |
68 | * @param port Port to read from |
69 | * @return Value read |
69 | * @return Value read |
70 | */ |
70 | */ |
71 | static inline __u8 inb(__u16 port) { __u8 val; __asm__ volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port) ); return val; } |
71 | static inline uint8_t inb(uint16_t port) { uint8_t val; __asm__ volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port) ); return val; } |
72 | 72 | ||
73 | /** Byte to port |
73 | /** Byte to port |
74 | * |
74 | * |
75 | * Output byte to port |
75 | * Output byte to port |
76 | * |
76 | * |
77 | * @param port Port to write to |
77 | * @param port Port to write to |
78 | * @param val Value to write |
78 | * @param val Value to write |
79 | */ |
79 | */ |
80 | static inline void outb(__u16 port, __u8 val) { __asm__ volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port) ); } |
80 | static inline void outb(uint16_t port, uint8_t val) { __asm__ volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port) ); } |
81 | 81 | ||
82 | /** Swap Hidden part of GS register with visible one */ |
82 | /** Swap Hidden part of GS register with visible one */ |
83 | static inline void swapgs(void) { __asm__ volatile("swapgs"); } |
83 | static inline void swapgs(void) { __asm__ volatile("swapgs"); } |
84 | 84 | ||
85 | /** Enable interrupts. |
85 | /** Enable interrupts. |
Line 147... | Line 147... | ||
147 | ); |
147 | ); |
148 | return v; |
148 | return v; |
149 | } |
149 | } |
150 | 150 | ||
151 | /** Write to MSR */ |
151 | /** Write to MSR */ |
152 | static inline void write_msr(__u32 msr, __u64 value) |
152 | static inline void write_msr(uint32_t msr, uint64_t value) |
153 | { |
153 | { |
154 | __asm__ volatile ( |
154 | __asm__ volatile ( |
155 | "wrmsr;" : : "c" (msr), |
155 | "wrmsr;" : : "c" (msr), |
156 | "a" ((__u32)(value)), |
156 | "a" ((uint32_t)(value)), |
157 | "d" ((__u32)(value >> 32)) |
157 | "d" ((uint32_t)(value >> 32)) |
158 | ); |
158 | ); |
159 | } |
159 | } |
160 | 160 | ||
161 | static inline __native read_msr(__u32 msr) |
161 | static inline unative_t read_msr(uint32_t msr) |
162 | { |
162 | { |
163 | __u32 ax, dx; |
163 | uint32_t ax, dx; |
164 | 164 | ||
165 | __asm__ volatile ( |
165 | __asm__ volatile ( |
166 | "rdmsr;" : "=a"(ax), "=d"(dx) : "c" (msr) |
166 | "rdmsr;" : "=a"(ax), "=d"(dx) : "c" (msr) |
167 | ); |
167 | ); |
168 | return ((__u64)dx << 32) | ax; |
168 | return ((uint64_t)dx << 32) | ax; |
169 | } |
169 | } |
170 | 170 | ||
171 | 171 | ||
172 | /** Enable local APIC |
172 | /** Enable local APIC |
173 | * |
173 | * |
Line 185... | Line 185... | ||
185 | : |
185 | : |
186 | :"%eax","%ecx","%edx" |
186 | :"%eax","%ecx","%edx" |
187 | ); |
187 | ); |
188 | } |
188 | } |
189 | 189 | ||
190 | static inline __address * get_ip() |
190 | static inline uintptr_t * get_ip() |
191 | { |
191 | { |
192 | __address *ip; |
192 | uintptr_t *ip; |
193 | 193 | ||
194 | __asm__ volatile ( |
194 | __asm__ volatile ( |
195 | "mov %%rip, %0" |
195 | "mov %%rip, %0" |
196 | : "=r" (ip) |
196 | : "=r" (ip) |
197 | ); |
197 | ); |
Line 200... | Line 200... | ||
200 | 200 | ||
201 | /** Invalidate TLB Entry. |
201 | /** Invalidate TLB Entry. |
202 | * |
202 | * |
203 | * @param addr Address on a page whose TLB entry is to be invalidated. |
203 | * @param addr Address on a page whose TLB entry is to be invalidated. |
204 | */ |
204 | */ |
205 | static inline void invlpg(__address addr) |
205 | static inline void invlpg(uintptr_t addr) |
206 | { |
206 | { |
207 | __asm__ volatile ("invlpg %0\n" :: "m" (*((__native *)addr))); |
207 | __asm__ volatile ("invlpg %0\n" :: "m" (*((unative_t *)addr))); |
208 | } |
208 | } |
209 | 209 | ||
210 | /** Load GDTR register from memory. |
210 | /** Load GDTR register from memory. |
211 | * |
211 | * |
212 | * @param gdtr_reg Address of memory from where to load GDTR. |
212 | * @param gdtr_reg Address of memory from where to load GDTR. |
Line 236... | Line 236... | ||
236 | 236 | ||
237 | /** Load TR from descriptor table. |
237 | /** Load TR from descriptor table. |
238 | * |
238 | * |
239 | * @param sel Selector specifying descriptor of TSS segment. |
239 | * @param sel Selector specifying descriptor of TSS segment. |
240 | */ |
240 | */ |
241 | static inline void tr_load(__u16 sel) |
241 | static inline void tr_load(uint16_t sel) |
242 | { |
242 | { |
243 | __asm__ volatile ("ltr %0" : : "r" (sel)); |
243 | __asm__ volatile ("ltr %0" : : "r" (sel)); |
244 | } |
244 | } |
245 | 245 | ||
246 | #define GEN_READ_REG(reg) static inline __native read_ ##reg (void) \ |
246 | #define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ |
247 | { \ |
247 | { \ |
248 | __native res; \ |
248 | unative_t res; \ |
249 | __asm__ volatile ("movq %%" #reg ", %0" : "=r" (res) ); \ |
249 | __asm__ volatile ("movq %%" #reg ", %0" : "=r" (res) ); \ |
250 | return res; \ |
250 | return res; \ |
251 | } |
251 | } |
252 | 252 | ||
253 | #define GEN_WRITE_REG(reg) static inline void write_ ##reg (__native regn) \ |
253 | #define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \ |
254 | { \ |
254 | { \ |
255 | __asm__ volatile ("movq %0, %%" #reg : : "r" (regn)); \ |
255 | __asm__ volatile ("movq %0, %%" #reg : : "r" (regn)); \ |
256 | } |
256 | } |
257 | 257 | ||
258 | GEN_READ_REG(cr0); |
258 | GEN_READ_REG(cr0); |