Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/include/asm.h

    rd99c1d2 rf77e591d  
    3838#include <config.h>
    3939#include <typedefs.h>
    40 
    41 extern void asm_delay_loop(uint32_t t);
    42 extern void asm_fake_loop(uint32_t t);
     40#include <arch/cpu.h>
     41#include <trace.h>
    4342
    4443/** Return base address of current stack.
     
    4948 *
    5049 */
    51 static inline uintptr_t get_stack_base(void)
     50NO_TRACE static inline uintptr_t get_stack_base(void)
    5251{
    5352        uintptr_t v;
     
    5655                "andq %%rsp, %[v]\n"
    5756                : [v] "=r" (v)
    58                 : "0" (~((uint64_t) STACK_SIZE-1))
     57                : "0" (~((uint64_t) STACK_SIZE - 1))
    5958        );
    6059       
     
    6261}
    6362
    64 static inline void cpu_sleep(void)
    65 {
    66         asm volatile ("hlt\n");
    67 }
    68 
    69 static inline void __attribute__((noreturn)) cpu_halt(void)
     63NO_TRACE static inline void cpu_sleep(void)
     64{
     65        asm volatile (
     66                "hlt\n"
     67        );
     68}
     69
     70NO_TRACE static inline void __attribute__((noreturn)) cpu_halt(void)
    7071{
    7172        while (true) {
     
    7677}
    7778
    78 
    7979/** Byte from port
    8080 *
     
    8585 *
    8686 */
    87 static inline uint8_t pio_read_8(ioport8_t *port)
     87NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
    8888{
    8989        uint8_t val;
     
    106106 *
    107107 */
    108 static inline uint16_t pio_read_16(ioport16_t *port)
     108NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
    109109{
    110110        uint16_t val;
     
    127127 *
    128128 */
    129 static inline uint32_t pio_read_32(ioport32_t *port)
     129NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
    130130{
    131131        uint32_t val;
     
    148148 *
    149149 */
    150 static inline void pio_write_8(ioport8_t *port, uint8_t val)
     150NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t val)
    151151{
    152152        asm volatile (
    153153                "outb %b[val], %w[port]\n"
    154                 :: [val] "a" (val), [port] "d" (port)
     154                :: [val] "a" (val),
     155                   [port] "d" (port)
    155156        );
    156157}
     
    164165 *
    165166 */
    166 static inline void pio_write_16(ioport16_t *port, uint16_t val)
     167NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val)
    167168{
    168169        asm volatile (
    169170                "outw %w[val], %w[port]\n"
    170                 :: [val] "a" (val), [port] "d" (port)
     171                :: [val] "a" (val),
     172                   [port] "d" (port)
    171173        );
    172174}
     
    180182 *
    181183 */
    182 static inline void pio_write_32(ioport32_t *port, uint32_t val)
     184NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val)
    183185{
    184186        asm volatile (
    185187                "outl %[val], %w[port]\n"
    186                 :: [val] "a" (val), [port] "d" (port)
     188                :: [val] "a" (val),
     189                   [port] "d" (port)
    187190        );
    188191}
    189192
    190193/** Swap Hidden part of GS register with visible one */
    191 static inline void swapgs(void)
    192 {
    193         asm volatile("swapgs");
     194NO_TRACE static inline void swapgs(void)
     195{
     196        asm volatile (
     197                "swapgs"
     198        );
    194199}
    195200
     
    202207 *
    203208 */
    204 static inline ipl_t interrupts_enable(void) {
     209NO_TRACE static inline ipl_t interrupts_enable(void) {
    205210        ipl_t v;
    206211       
     
    223228 *
    224229 */
    225 static inline ipl_t interrupts_disable(void) {
     230NO_TRACE static inline ipl_t interrupts_disable(void) {
    226231        ipl_t v;
    227232       
     
    243248 *
    244249 */
    245 static inline void interrupts_restore(ipl_t ipl) {
     250NO_TRACE static inline void interrupts_restore(ipl_t ipl) {
    246251        asm volatile (
    247252                "pushq %[ipl]\n"
     
    258263 *
    259264 */
    260 static inline ipl_t interrupts_read(void) {
     265NO_TRACE static inline ipl_t interrupts_read(void) {
    261266        ipl_t v;
    262267       
     
    270275}
    271276
     277/** Check interrupts state.
     278 *
     279 * @return True if interrupts are disabled.
     280 *
     281 */
     282NO_TRACE static inline bool interrupts_disabled(void)
     283{
     284        ipl_t v;
     285       
     286        asm volatile (
     287                "pushfq\n"
     288                "popq %[v]\n"
     289                : [v] "=r" (v)
     290        );
     291       
     292        return ((v & RFLAGS_IF) == 0);
     293}
     294
    272295/** Write to MSR */
    273 static inline void write_msr(uint32_t msr, uint64_t value)
     296NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value)
    274297{
    275298        asm volatile (
     
    281304}
    282305
    283 static inline unative_t read_msr(uint32_t msr)
     306NO_TRACE static inline unative_t read_msr(uint32_t msr)
    284307{
    285308        uint32_t ax, dx;
     
    294317}
    295318
    296 
    297319/** Enable local APIC
    298320 *
     
    300322 *
    301323 */
    302 static inline void enable_l_apic_in_msr()
     324NO_TRACE static inline void enable_l_apic_in_msr()
    303325{
    304326        asm volatile (
     
    308330                "orl $(0xfee00000),%%eax\n"
    309331                "wrmsr\n"
    310                 ::: "%eax","%ecx","%edx"
    311         );
    312 }
    313 
    314 static inline uintptr_t * get_ip()
    315 {
    316         uintptr_t *ip;
    317        
    318         asm volatile (
    319                 "mov %%rip, %[ip]"
    320                 : [ip] "=r" (ip)
    321         );
    322        
    323         return ip;
     332                ::: "%eax", "%ecx", "%edx"
     333        );
    324334}
    325335
     
    329339 *
    330340 */
    331 static inline void invlpg(uintptr_t addr)
     341NO_TRACE static inline void invlpg(uintptr_t addr)
    332342{
    333343        asm volatile (
     
    342352 *
    343353 */
    344 static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
     354NO_TRACE static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
    345355{
    346356        asm volatile (
     
    355365 *
    356366 */
    357 static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
     367NO_TRACE static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
    358368{
    359369        asm volatile (
     
    368378 *
    369379 */
    370 static inline void idtr_load(ptr_16_64_t *idtr_reg)
     380NO_TRACE static inline void idtr_load(ptr_16_64_t *idtr_reg)
    371381{
    372382        asm volatile (
     
    380390 *
    381391 */
    382 static inline void tr_load(uint16_t sel)
     392NO_TRACE static inline void tr_load(uint16_t sel)
    383393{
    384394        asm volatile (
     
    388398}
    389399
    390 #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) \
    391401        { \
    392402                unative_t res; \
     
    398408        }
    399409
    400 #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) \
    401411        { \
    402412                asm volatile ( \
     
    425435GEN_WRITE_REG(dr7)
    426436
    427 extern size_t interrupt_handler_size;
    428 extern void interrupt_handlers(void);
     437extern void asm_delay_loop(uint32_t);
     438extern void asm_fake_loop(uint32_t);
     439
     440extern uintptr_t int_0;
     441extern uintptr_t int_1;
     442extern uintptr_t int_2;
     443extern uintptr_t int_3;
     444extern uintptr_t int_4;
     445extern uintptr_t int_5;
     446extern uintptr_t int_6;
     447extern uintptr_t int_7;
     448extern uintptr_t int_8;
     449extern uintptr_t int_9;
     450extern uintptr_t int_10;
     451extern uintptr_t int_11;
     452extern uintptr_t int_12;
     453extern uintptr_t int_13;
     454extern uintptr_t int_14;
     455extern uintptr_t int_15;
     456extern uintptr_t int_16;
     457extern uintptr_t int_17;
     458extern uintptr_t int_18;
     459extern uintptr_t int_19;
     460extern uintptr_t int_20;
     461extern uintptr_t int_21;
     462extern uintptr_t int_22;
     463extern uintptr_t int_23;
     464extern uintptr_t int_24;
     465extern uintptr_t int_25;
     466extern uintptr_t int_26;
     467extern uintptr_t int_27;
     468extern uintptr_t int_28;
     469extern uintptr_t int_29;
     470extern uintptr_t int_30;
     471extern uintptr_t int_31;
     472extern uintptr_t int_32;
     473extern uintptr_t int_33;
     474extern uintptr_t int_34;
     475extern uintptr_t int_35;
     476extern uintptr_t int_36;
     477extern uintptr_t int_37;
     478extern uintptr_t int_38;
     479extern uintptr_t int_39;
     480extern uintptr_t int_40;
     481extern uintptr_t int_41;
     482extern uintptr_t int_42;
     483extern uintptr_t int_43;
     484extern uintptr_t int_44;
     485extern uintptr_t int_45;
     486extern uintptr_t int_46;
     487extern uintptr_t int_47;
     488extern uintptr_t int_48;
     489extern uintptr_t int_49;
     490extern uintptr_t int_50;
     491extern uintptr_t int_51;
     492extern uintptr_t int_52;
     493extern uintptr_t int_53;
     494extern uintptr_t int_54;
     495extern uintptr_t int_55;
     496extern uintptr_t int_56;
     497extern uintptr_t int_57;
     498extern uintptr_t int_58;
     499extern uintptr_t int_59;
     500extern uintptr_t int_60;
     501extern uintptr_t int_61;
     502extern uintptr_t int_62;
     503extern uintptr_t int_63;
    429504
    430505#endif
Note: See TracChangeset for help on using the changeset viewer.