Ignore:
File:
1 edited

Legend:

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

    r96b02eb9 r99d6fd0  
    3737
    3838#include <config.h>
     39#include <arch/types.h>
    3940#include <typedefs.h>
    40 #include <arch/cpu.h>
    41 #include <trace.h>
     41
     42extern void asm_delay_loop(uint32_t t);
     43extern void asm_fake_loop(uint32_t t);
    4244
    4345/** Return base address of current stack.
     
    4850 *
    4951 */
    50 NO_TRACE static inline uintptr_t get_stack_base(void)
     52static inline uintptr_t get_stack_base(void)
    5153{
    5254        uintptr_t v;
     
    5557                "andq %%rsp, %[v]\n"
    5658                : [v] "=r" (v)
    57                 : "0" (~((uint64_t) STACK_SIZE - 1))
     59                : "0" (~((uint64_t) STACK_SIZE-1))
    5860        );
    5961       
     
    6163}
    6264
    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 {
    72         while (true) {
    73                 asm volatile (
    74                         "hlt\n"
    75                 );
    76         }
    77 }
     65static inline void cpu_sleep(void)
     66{
     67        asm volatile ("hlt\n");
     68}
     69
     70static inline void cpu_halt(void)
     71{
     72        asm volatile (
     73                "0:\n"
     74                "       hlt\n"
     75                "       jmp 0b\n"
     76        );
     77}
     78
    7879
    7980/** Byte from port
     
    8586 *
    8687 */
    87 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
     88static inline uint8_t pio_read_8(ioport8_t *port)
    8889{
    8990        uint8_t val;
     
    106107 *
    107108 */
    108 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
     109static inline uint16_t pio_read_16(ioport16_t *port)
    109110{
    110111        uint16_t val;
     
    127128 *
    128129 */
    129 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
     130static inline uint32_t pio_read_32(ioport32_t *port)
    130131{
    131132        uint32_t val;
     
    148149 *
    149150 */
    150 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t val)
     151static inline void pio_write_8(ioport8_t *port, uint8_t val)
    151152{
    152153        asm volatile (
    153154                "outb %b[val], %w[port]\n"
    154                 :: [val] "a" (val),
    155                    [port] "d" (port)
     155                :: [val] "a" (val), [port] "d" (port)
    156156        );
    157157}
     
    165165 *
    166166 */
    167 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val)
     167static inline void pio_write_16(ioport16_t *port, uint16_t val)
    168168{
    169169        asm volatile (
    170170                "outw %w[val], %w[port]\n"
    171                 :: [val] "a" (val),
    172                    [port] "d" (port)
     171                :: [val] "a" (val), [port] "d" (port)
    173172        );
    174173}
     
    182181 *
    183182 */
    184 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val)
     183static inline void pio_write_32(ioport32_t *port, uint32_t val)
    185184{
    186185        asm volatile (
    187186                "outl %[val], %w[port]\n"
    188                 :: [val] "a" (val),
    189                    [port] "d" (port)
     187                :: [val] "a" (val), [port] "d" (port)
    190188        );
    191189}
    192190
    193191/** Swap Hidden part of GS register with visible one */
    194 NO_TRACE static inline void swapgs(void)
    195 {
    196         asm volatile (
    197                 "swapgs"
    198         );
     192static inline void swapgs(void)
     193{
     194        asm volatile("swapgs");
    199195}
    200196
     
    207203 *
    208204 */
    209 NO_TRACE static inline ipl_t interrupts_enable(void) {
     205static inline ipl_t interrupts_enable(void) {
    210206        ipl_t v;
    211207       
     
    228224 *
    229225 */
    230 NO_TRACE static inline ipl_t interrupts_disable(void) {
     226static inline ipl_t interrupts_disable(void) {
    231227        ipl_t v;
    232228       
     
    248244 *
    249245 */
    250 NO_TRACE static inline void interrupts_restore(ipl_t ipl) {
     246static inline void interrupts_restore(ipl_t ipl) {
    251247        asm volatile (
    252248                "pushq %[ipl]\n"
     
    263259 *
    264260 */
    265 NO_TRACE static inline ipl_t interrupts_read(void) {
     261static inline ipl_t interrupts_read(void) {
    266262        ipl_t v;
    267263       
     
    275271}
    276272
    277 /** Check interrupts state.
    278  *
    279  * @return True if interrupts are disabled.
    280  *
    281  */
    282 NO_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 
    295273/** Write to MSR */
    296 NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value)
     274static inline void write_msr(uint32_t msr, uint64_t value)
    297275{
    298276        asm volatile (
     
    304282}
    305283
    306 NO_TRACE static inline sysarg_t read_msr(uint32_t msr)
     284static inline unative_t read_msr(uint32_t msr)
    307285{
    308286        uint32_t ax, dx;
     
    317295}
    318296
     297
    319298/** Enable local APIC
    320299 *
     
    322301 *
    323302 */
    324 NO_TRACE static inline void enable_l_apic_in_msr()
     303static inline void enable_l_apic_in_msr()
    325304{
    326305        asm volatile (
     
    330309                "orl $(0xfee00000),%%eax\n"
    331310                "wrmsr\n"
    332                 ::: "%eax", "%ecx", "%edx"
    333         );
     311                ::: "%eax","%ecx","%edx"
     312        );
     313}
     314
     315static inline uintptr_t * get_ip()
     316{
     317        uintptr_t *ip;
     318       
     319        asm volatile (
     320                "mov %%rip, %[ip]"
     321                : [ip] "=r" (ip)
     322        );
     323       
     324        return ip;
    334325}
    335326
     
    339330 *
    340331 */
    341 NO_TRACE static inline void invlpg(uintptr_t addr)
     332static inline void invlpg(uintptr_t addr)
    342333{
    343334        asm volatile (
    344335                "invlpg %[addr]\n"
    345                 :: [addr] "m" (*((sysarg_t *) addr))
     336                :: [addr] "m" (*((unative_t *) addr))
    346337        );
    347338}
     
    352343 *
    353344 */
    354 NO_TRACE static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
     345static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
    355346{
    356347        asm volatile (
     
    365356 *
    366357 */
    367 NO_TRACE static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
     358static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
    368359{
    369360        asm volatile (
     
    378369 *
    379370 */
    380 NO_TRACE static inline void idtr_load(ptr_16_64_t *idtr_reg)
     371static inline void idtr_load(ptr_16_64_t *idtr_reg)
    381372{
    382373        asm volatile (
     
    390381 *
    391382 */
    392 NO_TRACE static inline void tr_load(uint16_t sel)
     383static inline void tr_load(uint16_t sel)
    393384{
    394385        asm volatile (
     
    398389}
    399390
    400 #define GEN_READ_REG(reg) NO_TRACE static inline sysarg_t read_ ##reg (void) \
     391#define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \
    401392        { \
    402                 sysarg_t res; \
     393                unative_t res; \
    403394                asm volatile ( \
    404395                        "movq %%" #reg ", %[res]" \
     
    408399        }
    409400
    410 #define GEN_WRITE_REG(reg) NO_TRACE static inline void write_ ##reg (sysarg_t regn) \
     401#define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \
    411402        { \
    412403                asm volatile ( \
     
    435426GEN_WRITE_REG(dr7)
    436427
    437 extern void asm_delay_loop(uint32_t);
    438 extern void asm_fake_loop(uint32_t);
    439 
    440 extern uintptr_t int_0;
    441 extern uintptr_t int_1;
    442 extern uintptr_t int_2;
    443 extern uintptr_t int_3;
    444 extern uintptr_t int_4;
    445 extern uintptr_t int_5;
    446 extern uintptr_t int_6;
    447 extern uintptr_t int_7;
    448 extern uintptr_t int_8;
    449 extern uintptr_t int_9;
    450 extern uintptr_t int_10;
    451 extern uintptr_t int_11;
    452 extern uintptr_t int_12;
    453 extern uintptr_t int_13;
    454 extern uintptr_t int_14;
    455 extern uintptr_t int_15;
    456 extern uintptr_t int_16;
    457 extern uintptr_t int_17;
    458 extern uintptr_t int_18;
    459 extern uintptr_t int_19;
    460 extern uintptr_t int_20;
    461 extern uintptr_t int_21;
    462 extern uintptr_t int_22;
    463 extern uintptr_t int_23;
    464 extern uintptr_t int_24;
    465 extern uintptr_t int_25;
    466 extern uintptr_t int_26;
    467 extern uintptr_t int_27;
    468 extern uintptr_t int_28;
    469 extern uintptr_t int_29;
    470 extern uintptr_t int_30;
    471 extern uintptr_t int_31;
    472 extern uintptr_t int_32;
    473 extern uintptr_t int_33;
    474 extern uintptr_t int_34;
    475 extern uintptr_t int_35;
    476 extern uintptr_t int_36;
    477 extern uintptr_t int_37;
    478 extern uintptr_t int_38;
    479 extern uintptr_t int_39;
    480 extern uintptr_t int_40;
    481 extern uintptr_t int_41;
    482 extern uintptr_t int_42;
    483 extern uintptr_t int_43;
    484 extern uintptr_t int_44;
    485 extern uintptr_t int_45;
    486 extern uintptr_t int_46;
    487 extern uintptr_t int_47;
    488 extern uintptr_t int_48;
    489 extern uintptr_t int_49;
    490 extern uintptr_t int_50;
    491 extern uintptr_t int_51;
    492 extern uintptr_t int_52;
    493 extern uintptr_t int_53;
    494 extern uintptr_t int_54;
    495 extern uintptr_t int_55;
    496 extern uintptr_t int_56;
    497 extern uintptr_t int_57;
    498 extern uintptr_t int_58;
    499 extern uintptr_t int_59;
    500 extern uintptr_t int_60;
    501 extern uintptr_t int_61;
    502 extern uintptr_t int_62;
    503 extern uintptr_t int_63;
     428extern size_t interrupt_handler_size;
     429extern void interrupt_handlers(void);
    504430
    505431#endif
Note: See TracChangeset for help on using the changeset viewer.