Changeset 7a0359b in mainline for kernel/arch/ia32
- 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/ia32/include
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/include/asm.h
re3ee9b9 r7a0359b 41 41 #include <typedefs.h> 42 42 #include <config.h> 43 #include <trace.h> 43 44 44 45 extern uint32_t interrupt_handler_size; 45 46 46 extern void paging_on(void);47 48 extern void interrupt_handlers(void);49 50 extern void enable_l_apic_in_msr(void);51 52 53 extern void asm_delay_loop(uint32_t t);54 extern void asm_fake_loop(uint32_t t);55 56 57 47 /** Halt CPU 58 48 * … … 60 50 * 61 51 */ 62 static inline __attribute__((noreturn)) void cpu_halt(void)52 NO_TRACE static inline __attribute__((noreturn)) void cpu_halt(void) 63 53 { 64 54 while (true) { … … 69 59 } 70 60 71 static inline void cpu_sleep(void) 72 { 73 asm volatile ("hlt\n"); 74 } 75 76 #define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ 61 NO_TRACE static inline void cpu_sleep(void) 62 { 63 asm volatile ( 64 "hlt\n" 65 ); 66 } 67 68 #define GEN_READ_REG(reg) NO_TRACE static inline unative_t read_ ##reg (void) \ 77 69 { \ 78 70 unative_t res; \ … … 84 76 } 85 77 86 #define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \78 #define GEN_WRITE_REG(reg) NO_TRACE static inline void write_ ##reg (unative_t regn) \ 87 79 { \ 88 80 asm volatile ( \ … … 119 111 * 120 112 */ 121 static inline void pio_write_8(ioport8_t *port, uint8_t val)113 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t val) 122 114 { 123 115 asm volatile ( 124 116 "outb %b[val], %w[port]\n" 125 :: [val] "a" (val), [port] "d" (port) 117 :: [val] "a" (val), 118 [port] "d" (port) 126 119 ); 127 120 } … … 135 128 * 136 129 */ 137 static inline void pio_write_16(ioport16_t *port, uint16_t val)130 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val) 138 131 { 139 132 asm volatile ( 140 133 "outw %w[val], %w[port]\n" 141 :: [val] "a" (val), [port] "d" (port) 134 :: [val] "a" (val), 135 [port] "d" (port) 142 136 ); 143 137 } … … 151 145 * 152 146 */ 153 static inline void pio_write_32(ioport32_t *port, uint32_t val)147 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val) 154 148 { 155 149 asm volatile ( 156 150 "outl %[val], %w[port]\n" 157 :: [val] "a" (val), [port] "d" (port) 151 :: [val] "a" (val), 152 [port] "d" (port) 158 153 ); 159 154 } … … 167 162 * 168 163 */ 169 static inline uint8_t pio_read_8(ioport8_t *port)164 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port) 170 165 { 171 166 uint8_t val; … … 188 183 * 189 184 */ 190 static inline uint16_t pio_read_16(ioport16_t *port)185 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port) 191 186 { 192 187 uint16_t val; … … 209 204 * 210 205 */ 211 static inline uint32_t pio_read_32(ioport32_t *port)206 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port) 212 207 { 213 208 uint32_t val; … … 230 225 * 231 226 */ 232 static inline ipl_t interrupts_enable(void)227 NO_TRACE static inline ipl_t interrupts_enable(void) 233 228 { 234 229 ipl_t v; … … 252 247 * 253 248 */ 254 static inline ipl_t interrupts_disable(void)249 NO_TRACE static inline ipl_t interrupts_disable(void) 255 250 { 256 251 ipl_t v; … … 273 268 * 274 269 */ 275 static inline void interrupts_restore(ipl_t ipl)270 NO_TRACE static inline void interrupts_restore(ipl_t ipl) 276 271 { 277 272 asm volatile ( … … 287 282 * 288 283 */ 289 static inline ipl_t interrupts_read(void)284 NO_TRACE static inline ipl_t interrupts_read(void) 290 285 { 291 286 ipl_t v; … … 305 300 * 306 301 */ 307 static inline bool interrupts_disabled(void)302 NO_TRACE static inline bool interrupts_disabled(void) 308 303 { 309 304 ipl_t v; … … 319 314 320 315 /** Write to MSR */ 321 static inline void write_msr(uint32_t msr, uint64_t value)316 NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value) 322 317 { 323 318 asm volatile ( 324 319 "wrmsr" 325 :: "c" (msr), "a" ((uint32_t) (value)), 320 :: "c" (msr), 321 "a" ((uint32_t) (value)), 326 322 "d" ((uint32_t) (value >> 32)) 327 323 ); 328 324 } 329 325 330 static inline uint64_t read_msr(uint32_t msr)326 NO_TRACE static inline uint64_t read_msr(uint32_t msr) 331 327 { 332 328 uint32_t ax, dx; … … 334 330 asm volatile ( 335 331 "rdmsr" 336 : "=a" (ax), "=d" (dx) 332 : "=a" (ax), 333 "=d" (dx) 337 334 : "c" (msr) 338 335 ); … … 349 346 * 350 347 */ 351 static inline uintptr_t get_stack_base(void)348 NO_TRACE static inline uintptr_t get_stack_base(void) 352 349 { 353 350 uintptr_t v; … … 367 364 * 368 365 */ 369 static inline void invlpg(uintptr_t addr)366 NO_TRACE static inline void invlpg(uintptr_t addr) 370 367 { 371 368 asm volatile ( … … 380 377 * 381 378 */ 382 static inline void gdtr_load(ptr_16_32_t *gdtr_reg)379 NO_TRACE static inline void gdtr_load(ptr_16_32_t *gdtr_reg) 383 380 { 384 381 asm volatile ( … … 393 390 * 394 391 */ 395 static inline void gdtr_store(ptr_16_32_t *gdtr_reg)392 NO_TRACE static inline void gdtr_store(ptr_16_32_t *gdtr_reg) 396 393 { 397 394 asm volatile ( … … 406 403 * 407 404 */ 408 static inline void idtr_load(ptr_16_32_t *idtr_reg)405 NO_TRACE static inline void idtr_load(ptr_16_32_t *idtr_reg) 409 406 { 410 407 asm volatile ( … … 419 416 * 420 417 */ 421 static inline void tr_load(uint16_t sel)418 NO_TRACE static inline void tr_load(uint16_t sel) 422 419 { 423 420 asm volatile ( … … 427 424 } 428 425 426 extern void paging_on(void); 427 extern void interrupt_handlers(void); 428 extern void enable_l_apic_in_msr(void); 429 430 extern void asm_delay_loop(uint32_t); 431 extern void asm_fake_loop(uint32_t); 432 429 433 #endif 430 434 -
kernel/arch/ia32/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 /** ia32 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; -
kernel/arch/ia32/include/barrier.h
re3ee9b9 r7a0359b 36 36 #define KERN_ia32_BARRIER_H_ 37 37 38 #include <trace.h> 39 38 40 /* 39 41 * NOTE: … … 50 52 #define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") 51 53 52 static inline void cpuid_serialization(void)54 NO_TRACE static inline void cpuid_serialization(void) 53 55 { 54 56 asm volatile ( -
kernel/arch/ia32/include/cycle.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup ia32 29 /** @addtogroup ia32 30 30 * @{ 31 31 */ … … 36 36 #define KERN_ia32_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 uint64_t v; -
kernel/arch/ia32/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 typedef struct istate { … … 79 80 uint32_t ebp; 80 81 81 uint32_t ebp_frame; 82 uint32_t eip_frame; 83 82 uint32_t ebp_frame; /* imitation of frame pointer linkage */ 83 uint32_t eip_frame; /* imitation of return address linkage */ 84 84 85 uint32_t gs; 85 86 uint32_t fs; 86 87 uint32_t es; 87 88 uint32_t ds; 88 89 uint32_t error_word; 89 90 uint32_t error_word; /* real or fake error word */ 90 91 uint32_t eip; 91 92 uint32_t cs; 92 93 uint32_t eflags; 93 uint32_t esp; 94 uint32_t ss; 94 uint32_t esp; /* only if istate_t is from uspace */ 95 uint32_t ss; /* only if istate_t is from uspace */ 95 96 } istate_t; 96 97 97 98 /** Return true if exception happened while in userspace */ 98 static inline int istate_from_uspace(istate_t *istate)99 NO_TRACE static inline int istate_from_uspace(istate_t *istate) 99 100 { 100 101 return !(istate->eip & 0x80000000); 101 102 } 102 103 103 static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) 104 NO_TRACE static inline void istate_set_retaddr(istate_t *istate, 105 uintptr_t retaddr) 104 106 { 105 107 istate->eip = retaddr; 106 108 } 107 109 108 static inline unative_t istate_get_pc(istate_t *istate)110 NO_TRACE static inline unative_t istate_get_pc(istate_t *istate) 109 111 { 110 112 return istate->eip; 111 113 } 112 114 113 static inline unative_t istate_get_fp(istate_t *istate)115 NO_TRACE static inline unative_t istate_get_fp(istate_t *istate) 114 116 { 115 117 return istate->ebp; 116 118 } 117 119 118 extern void (* disable_irqs_function)(uint16_t irqmask);119 extern void (* enable_irqs_function)(uint16_t irqmask);120 extern void (* disable_irqs_function)(uint16_t); 121 extern void (* enable_irqs_function)(uint16_t); 120 122 extern void (* eoi_function)(void); 121 123 122 124 extern void interrupt_init(void); 123 extern void trap_virtual_enable_irqs(uint16_t irqmask);124 extern void trap_virtual_disable_irqs(uint16_t irqmask);125 extern void trap_virtual_enable_irqs(uint16_t); 126 extern void trap_virtual_disable_irqs(uint16_t); 125 127 126 128 #endif -
kernel/arch/ia32/include/mm/page.h
re3ee9b9 r7a0359b 37 37 38 38 #include <arch/mm/frame.h> 39 #include <trace.h> 39 40 40 41 #define PAGE_WIDTH FRAME_WIDTH … … 161 162 } __attribute__ ((packed)) pte_t; 162 163 163 static inline unsigned int get_pt_flags(pte_t *pt, size_t i)164 NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i) 164 165 { 165 166 pte_t *p = &pt[i]; … … 174 175 } 175 176 176 static inline void set_pt_flags(pte_t *pt, size_t i, int flags)177 NO_TRACE static inline void set_pt_flags(pte_t *pt, size_t i, int flags) 177 178 { 178 179 pte_t *p = &pt[i];
Note:
See TracChangeset
for help on using the changeset viewer.