Changeset 7a0359b in mainline for kernel/arch/amd64
- Timestamp:
- 2010-07-02T15:42:19Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bbfdf62
- Parents:
- e3ee9b9
- Location:
- kernel/arch/amd64/include
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/asm.h
re3ee9b9 r7a0359b 39 39 #include <typedefs.h> 40 40 #include <arch/cpu.h> 41 42 extern void asm_delay_loop(uint32_t t); 43 extern void asm_fake_loop(uint32_t t); 41 #include <trace.h> 44 42 45 43 /** Return base address of current stack. … … 50 48 * 51 49 */ 52 static inline uintptr_t get_stack_base(void)50 NO_TRACE static inline uintptr_t get_stack_base(void) 53 51 { 54 52 uintptr_t v; … … 57 55 "andq %%rsp, %[v]\n" 58 56 : [v] "=r" (v) 59 : "0" (~((uint64_t) STACK_SIZE -1))57 : "0" (~((uint64_t) STACK_SIZE - 1)) 60 58 ); 61 59 … … 63 61 } 64 62 65 static inline void cpu_sleep(void) 66 { 67 asm volatile ("hlt\n"); 68 } 69 70 static inline void __attribute__((noreturn)) cpu_halt(void) 63 NO_TRACE static inline void cpu_sleep(void) 64 { 65 asm volatile ( 66 "hlt\n" 67 ); 68 } 69 70 NO_TRACE static inline void __attribute__((noreturn)) cpu_halt(void) 71 71 { 72 72 while (true) { … … 77 77 } 78 78 79 80 79 /** Byte from port 81 80 * … … 86 85 * 87 86 */ 88 static inline uint8_t pio_read_8(ioport8_t *port)87 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port) 89 88 { 90 89 uint8_t val; … … 107 106 * 108 107 */ 109 static inline uint16_t pio_read_16(ioport16_t *port)108 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port) 110 109 { 111 110 uint16_t val; … … 128 127 * 129 128 */ 130 static inline uint32_t pio_read_32(ioport32_t *port)129 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port) 131 130 { 132 131 uint32_t val; … … 149 148 * 150 149 */ 151 static inline void pio_write_8(ioport8_t *port, uint8_t val)150 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t val) 152 151 { 153 152 asm volatile ( 154 153 "outb %b[val], %w[port]\n" 155 :: [val] "a" (val), [port] "d" (port) 154 :: [val] "a" (val), 155 [port] "d" (port) 156 156 ); 157 157 } … … 165 165 * 166 166 */ 167 static inline void pio_write_16(ioport16_t *port, uint16_t val)167 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val) 168 168 { 169 169 asm volatile ( 170 170 "outw %w[val], %w[port]\n" 171 :: [val] "a" (val), [port] "d" (port) 171 :: [val] "a" (val), 172 [port] "d" (port) 172 173 ); 173 174 } … … 181 182 * 182 183 */ 183 static inline void pio_write_32(ioport32_t *port, uint32_t val)184 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val) 184 185 { 185 186 asm volatile ( 186 187 "outl %[val], %w[port]\n" 187 :: [val] "a" (val), [port] "d" (port) 188 :: [val] "a" (val), 189 [port] "d" (port) 188 190 ); 189 191 } 190 192 191 193 /** Swap Hidden part of GS register with visible one */ 192 static inline void swapgs(void) 193 { 194 asm volatile("swapgs"); 194 NO_TRACE static inline void swapgs(void) 195 { 196 asm volatile ( 197 "swapgs" 198 ); 195 199 } 196 200 … … 203 207 * 204 208 */ 205 static inline ipl_t interrupts_enable(void) {209 NO_TRACE static inline ipl_t interrupts_enable(void) { 206 210 ipl_t v; 207 211 … … 224 228 * 225 229 */ 226 static inline ipl_t interrupts_disable(void) {230 NO_TRACE static inline ipl_t interrupts_disable(void) { 227 231 ipl_t v; 228 232 … … 244 248 * 245 249 */ 246 static inline void interrupts_restore(ipl_t ipl) {250 NO_TRACE static inline void interrupts_restore(ipl_t ipl) { 247 251 asm volatile ( 248 252 "pushq %[ipl]\n" … … 259 263 * 260 264 */ 261 static inline ipl_t interrupts_read(void) {265 NO_TRACE static inline ipl_t interrupts_read(void) { 262 266 ipl_t v; 263 267 … … 276 280 * 277 281 */ 278 static inline bool interrupts_disabled(void)282 NO_TRACE static inline bool interrupts_disabled(void) 279 283 { 280 284 ipl_t v; … … 289 293 } 290 294 291 292 295 /** Write to MSR */ 293 static inline void write_msr(uint32_t msr, uint64_t value)296 NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value) 294 297 { 295 298 asm volatile ( … … 301 304 } 302 305 303 static inline unative_t read_msr(uint32_t msr)306 NO_TRACE static inline unative_t read_msr(uint32_t msr) 304 307 { 305 308 uint32_t ax, dx; … … 314 317 } 315 318 316 317 319 /** Enable local APIC 318 320 * … … 320 322 * 321 323 */ 322 static inline void enable_l_apic_in_msr()324 NO_TRACE static inline void enable_l_apic_in_msr() 323 325 { 324 326 asm volatile ( … … 328 330 "orl $(0xfee00000),%%eax\n" 329 331 "wrmsr\n" 330 ::: "%eax", "%ecx","%edx"332 ::: "%eax", "%ecx", "%edx" 331 333 ); 332 334 } … … 337 339 * 338 340 */ 339 static inline void invlpg(uintptr_t addr)341 NO_TRACE static inline void invlpg(uintptr_t addr) 340 342 { 341 343 asm volatile ( … … 350 352 * 351 353 */ 352 static inline void gdtr_load(ptr_16_64_t *gdtr_reg)354 NO_TRACE static inline void gdtr_load(ptr_16_64_t *gdtr_reg) 353 355 { 354 356 asm volatile ( … … 363 365 * 364 366 */ 365 static inline void gdtr_store(ptr_16_64_t *gdtr_reg)367 NO_TRACE static inline void gdtr_store(ptr_16_64_t *gdtr_reg) 366 368 { 367 369 asm volatile ( … … 376 378 * 377 379 */ 378 static inline void idtr_load(ptr_16_64_t *idtr_reg)380 NO_TRACE static inline void idtr_load(ptr_16_64_t *idtr_reg) 379 381 { 380 382 asm volatile ( … … 388 390 * 389 391 */ 390 static inline void tr_load(uint16_t sel)392 NO_TRACE static inline void tr_load(uint16_t sel) 391 393 { 392 394 asm volatile ( … … 396 398 } 397 399 398 #define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \400 #define GEN_READ_REG(reg) NO_TRACE static inline unative_t read_ ##reg (void) \ 399 401 { \ 400 402 unative_t res; \ … … 406 408 } 407 409 408 #define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \410 #define GEN_WRITE_REG(reg) NO_TRACE static inline void write_ ##reg (unative_t regn) \ 409 411 { \ 410 412 asm volatile ( \ … … 436 438 extern void interrupt_handlers(void); 437 439 440 extern void asm_delay_loop(uint32_t); 441 extern void asm_fake_loop(uint32_t); 442 438 443 #endif 439 444 -
kernel/arch/amd64/include/atomic.h
re3ee9b9 r7a0359b 39 39 #include <arch/barrier.h> 40 40 #include <preemption.h> 41 #include <trace.h> 41 42 42 static inline void atomic_inc(atomic_t *val)43 NO_TRACE static inline void atomic_inc(atomic_t *val) 43 44 { 44 45 #ifdef CONFIG_SMP … … 55 56 } 56 57 57 static inline void atomic_dec(atomic_t *val)58 NO_TRACE static inline void atomic_dec(atomic_t *val) 58 59 { 59 60 #ifdef CONFIG_SMP … … 70 71 } 71 72 72 static inline atomic_count_t atomic_postinc(atomic_t *val)73 NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val) 73 74 { 74 75 atomic_count_t r = 1; … … 83 84 } 84 85 85 static inline atomic_count_t atomic_postdec(atomic_t *val)86 NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val) 86 87 { 87 88 atomic_count_t r = -1; … … 99 100 #define atomic_predec(val) (atomic_postdec(val) - 1) 100 101 101 static inline atomic_count_t test_and_set(atomic_t *val)102 NO_TRACE static inline atomic_count_t test_and_set(atomic_t *val) 102 103 { 103 104 atomic_count_t v = 1; … … 113 114 114 115 /** amd64 specific fast spinlock */ 115 static inline void atomic_lock_arch(atomic_t *val)116 NO_TRACE static inline void atomic_lock_arch(atomic_t *val) 116 117 { 117 118 atomic_count_t tmp; … … 120 121 asm volatile ( 121 122 "0:\n" 122 " pause\n"123 " mov %[count], %[tmp]\n"124 " testq %[tmp], %[tmp]\n"125 " jnz 0b\n" /* lightweight looping on locked spinlock */123 " pause\n" 124 " mov %[count], %[tmp]\n" 125 " testq %[tmp], %[tmp]\n" 126 " jnz 0b\n" /* lightweight looping on locked spinlock */ 126 127 127 " incq %[tmp]\n" /* now use the atomic operation */128 " xchgq %[count], %[tmp]\n"129 " testq %[tmp], %[tmp]\n"130 " jnz 0b\n"128 " incq %[tmp]\n" /* now use the atomic operation */ 129 " xchgq %[count], %[tmp]\n" 130 " testq %[tmp], %[tmp]\n" 131 " jnz 0b\n" 131 132 : [count] "+m" (val->count), 132 133 [tmp] "=&r" (tmp) -
kernel/arch/amd64/include/cycle.h
re3ee9b9 r7a0359b 36 36 #define KERN_amd64_CYCLE_H_ 37 37 38 static inline uint64_t get_cycle(void) 38 #include <trace.h> 39 40 NO_TRACE static inline uint64_t get_cycle(void) 39 41 { 40 42 uint32_t lower; -
kernel/arch/amd64/include/interrupt.h
re3ee9b9 r7a0359b 38 38 #include <typedefs.h> 39 39 #include <arch/pm.h> 40 #include <trace.h> 40 41 41 #define IVT_ITEMS 42 #define IVT_FIRST 42 #define IVT_ITEMS IDT_ITEMS 43 #define IVT_FIRST 0 43 44 44 #define EXC_COUNT 45 #define IRQ_COUNT 45 #define EXC_COUNT 32 46 #define IRQ_COUNT 16 46 47 47 #define IVT_EXCBASE 48 #define IVT_IRQBASE 49 #define IVT_FREEBASE 48 #define IVT_EXCBASE 0 49 #define IVT_IRQBASE (IVT_EXCBASE + EXC_COUNT) 50 #define IVT_FREEBASE (IVT_IRQBASE + IRQ_COUNT) 50 51 51 #define IRQ_CLK 52 #define IRQ_KBD 53 #define IRQ_PIC1 54 #define IRQ_PIC_SPUR 55 #define IRQ_MOUSE 56 #define IRQ_DP8390 52 #define IRQ_CLK 0 53 #define IRQ_KBD 1 54 #define IRQ_PIC1 2 55 #define IRQ_PIC_SPUR 7 56 #define IRQ_MOUSE 12 57 #define IRQ_DP8390 9 57 58 58 /* this one must have four least significant bits set to ones */59 #define VECTOR_APIC_SPUR 59 /* This one must have four least significant bits set to ones */ 60 #define VECTOR_APIC_SPUR (IVT_ITEMS - 1) 60 61 61 62 #if (((VECTOR_APIC_SPUR + 1) % 16) || VECTOR_APIC_SPUR >= IVT_ITEMS) … … 63 64 #endif 64 65 65 #define VECTOR_DEBUG 66 #define VECTOR_CLK 67 #define VECTOR_PIC_SPUR 68 #define VECTOR_SYSCALL 69 #define VECTOR_TLB_SHOOTDOWN_IPI 70 #define VECTOR_DEBUG_IPI 66 #define VECTOR_DEBUG 1 67 #define VECTOR_CLK (IVT_IRQBASE + IRQ_CLK) 68 #define VECTOR_PIC_SPUR (IVT_IRQBASE + IRQ_PIC_SPUR) 69 #define VECTOR_SYSCALL IVT_FREEBASE 70 #define VECTOR_TLB_SHOOTDOWN_IPI (IVT_FREEBASE + 1) 71 #define VECTOR_DEBUG_IPI (IVT_FREEBASE + 2) 71 72 72 73 /** This is passed to interrupt handlers */ … … 86 87 uint64_t cs; 87 88 uint64_t rflags; 88 uint64_t stack[]; /* Additional data on stack */89 uint64_t stack[]; /* Additional data on stack */ 89 90 } istate_t; 90 91 91 92 /** Return true if exception happened while in userspace */ 92 static inline int istate_from_uspace(istate_t *istate)93 NO_TRACE static inline int istate_from_uspace(istate_t *istate) 93 94 { 94 95 return !(istate->rip & 0x8000000000000000); 95 96 } 96 97 97 static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) 98 NO_TRACE static inline void istate_set_retaddr(istate_t *istate, 99 uintptr_t retaddr) 98 100 { 99 101 istate->rip = retaddr; 100 102 } 101 static inline unative_t istate_get_pc(istate_t *istate) 103 104 NO_TRACE static inline unative_t istate_get_pc(istate_t *istate) 102 105 { 103 106 return istate->rip; 104 107 } 105 static inline unative_t istate_get_fp(istate_t *istate) 108 109 NO_TRACE static inline unative_t istate_get_fp(istate_t *istate) 106 110 { 107 111 return istate->rbp; 108 112 } 109 113 110 extern void (* disable_irqs_function)(uint16_t irqmask);111 extern void (* enable_irqs_function)(uint16_t irqmask);114 extern void (* disable_irqs_function)(uint16_t); 115 extern void (* enable_irqs_function)(uint16_t); 112 116 extern void (* eoi_function)(void); 113 117 114 118 extern void interrupt_init(void); 115 extern void trap_virtual_enable_irqs(uint16_t irqmask);116 extern void trap_virtual_disable_irqs(uint16_t irqmask);119 extern void trap_virtual_enable_irqs(uint16_t); 120 extern void trap_virtual_disable_irqs(uint16_t); 117 121 118 122 #endif -
kernel/arch/amd64/include/mm/frame.h
re3ee9b9 r7a0359b 36 36 #define KERN_amd64_FRAME_H_ 37 37 38 #ifndef __ASM__39 #include <typedefs.h>40 #endif /* __ASM__ */41 42 38 #define FRAME_WIDTH 12 /* 4K */ 43 39 #define FRAME_SIZE (1 << FRAME_WIDTH) 44 40 41 #ifdef KERNEL 45 42 #ifndef __ASM__ 43 44 #include <typedefs.h> 45 46 46 extern uintptr_t last_frame; 47 47 extern void frame_arch_init(void); 48 48 extern void physmem_print(void); 49 49 50 #endif /* __ASM__ */ 51 #endif /* KERNEL */ 50 52 51 53 #endif -
kernel/arch/amd64/include/mm/page.h
re3ee9b9 r7a0359b 46 46 47 47 #include <arch/mm/frame.h> 48 #include <trace.h> 48 49 49 50 #define PAGE_WIDTH FRAME_WIDTH … … 187 188 } __attribute__ ((packed)) pte_t; 188 189 189 static inline unsigned int get_pt_flags(pte_t *pt, size_t i)190 NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i) 190 191 { 191 192 pte_t *p = &pt[i]; … … 200 201 } 201 202 202 static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a)203 NO_TRACE static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a) 203 204 { 204 205 pte_t *p = &pt[i]; … … 208 209 } 209 210 210 static inline void set_pt_flags(pte_t *pt, size_t i, int flags)211 NO_TRACE static inline void set_pt_flags(pte_t *pt, size_t i, int flags) 211 212 { 212 213 pte_t *p = &pt[i];
Note:
See TracChangeset
for help on using the changeset viewer.