Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/asm.S

    r45f7449 re98f1c3e  
    2727 */
    2828
     29#include <abi/asmtool.h>
    2930#include <arch/pm.h>
    3031#include <arch/mm/page.h>
     32#include <arch/istate_struct.h>
     33#include <arch/kseg_struct.h>
     34#include <arch/cpu.h>
     35#include <arch/smp/apic.h>
    3136
    3237.text
    33 .global interrupt_handlers
    34 .global syscall_entry
    35 .global cpuid
    36 .global has_cpuid
    37 .global read_efer_flag
    38 .global set_efer_flag
    39 .global memcpy_from_uspace
    40 .global memcpy_to_uspace
    41 .global memcpy_from_uspace_failover_address
    42 .global memcpy_to_uspace_failover_address
    43 .global early_putchar
    4438
    4539#define MEMCPY_DST   %rdi
     
    6357 *
    6458 */
    65 memcpy_from_uspace:
    66 memcpy_to_uspace:
     59FUNCTION_BEGIN(memcpy_from_uspace)
     60FUNCTION_BEGIN(memcpy_to_uspace)
    6761        movq MEMCPY_DST, %rax
    6862       
     
    8074        0:
    8175                ret                 /* return MEMCPY_SRC, success */
    82 
    83 memcpy_from_uspace_failover_address:
    84 memcpy_to_uspace_failover_address:
     76FUNCTION_END(memcpy_from_uspace)
     77FUNCTION_END(memcpy_to_uspace)
     78
     79SYMBOL(memcpy_from_uspace_failover_address)
     80SYMBOL(memcpy_to_uspace_failover_address)
    8581        xorl %eax, %eax         /* return 0, failure */
    8682        ret
     
    9187*
    9288*/
    93 has_cpuid:
     89FUNCTION_BEGIN(has_cpuid)
    9490        /* Load RFLAGS */
    9591        pushfq
     
    9894       
    9995        /* Flip the ID bit */
    100         btcl $21, %edx
     96        xorl $RFLAGS_ID, %edx
    10197       
    10298        /* Store RFLAGS */
     
    107103        /* Get the ID bit again */
    108104        popq %rdx
    109         andl $(1 << 21), %eax
    110         andl $(1 << 21), %edx
     105        andl $RFLAGS_ID, %eax
     106        andl $RFLAGS_ID, %edx
    111107       
    112108        /* 0 if not supported, 1 if supported */
    113109        xorl %edx, %eax
    114110        ret
    115 
    116 cpuid:
     111FUNCTION_END(has_cpuid)
     112
     113FUNCTION_BEGIN(cpuid)
    117114        /* Preserve %rbx across function calls */
    118115        movq %rbx, %r10
     
    129126        movq %r10, %rbx
    130127        ret
    131 
    132 set_efer_flag:
    133         movl $0xc0000080, %ecx
     128FUNCTION_END(cpuid)
     129
     130/** Enable local APIC
     131 *
     132 * Enable local APIC in MSR.
     133 *
     134 */
     135FUNCTION_BEGIN(enable_l_apic_in_msr)
     136        movl $AMD_MSR_APIC_BASE, %ecx
    134137        rdmsr
    135         btsl %edi, %eax
     138        orl $(L_APIC_BASE | AMD_APIC_BASE_GE), %eax
    136139        wrmsr
    137140        ret
    138 
    139 read_efer_flag:
    140         movl $0xc0000080, %ecx
    141         rdmsr
    142         ret
    143 
    144 #define ISTATE_OFFSET_RAX               0
    145 #define ISTATE_OFFSET_RBX               8
    146 #define ISTATE_OFFSET_RCX               16
    147 #define ISTATE_OFFSET_RDX               24
    148 #define ISTATE_OFFSET_RSI               32
    149 #define ISTATE_OFFSET_RDI               40
    150 #define ISTATE_OFFSET_RBP               48
    151 #define ISTATE_OFFSET_R8                56
    152 #define ISTATE_OFFSET_R9                64
    153 #define ISTATE_OFFSET_R10               72
    154 #define ISTATE_OFFSET_R11               80
    155 #define ISTATE_OFFSET_R12               88     
    156 #define ISTATE_OFFSET_R13               96
    157 #define ISTATE_OFFSET_R14               104
    158 #define ISTATE_OFFSET_R15               112
    159 #define ISTATE_OFFSET_ALIGNMENT         120
    160 #define ISTATE_OFFSET_RBP_FRAME         128
    161 #define ISTATE_OFFSET_RIP_FRAME         136
    162 #define ISTATE_OFFSET_ERROR_WORD        144
    163 #define ISTATE_OFFSET_RIP               152
    164 #define ISTATE_OFFSET_CS                160
    165 #define ISTATE_OFFSET_RFLAGS            168
    166 #define ISTATE_OFFSET_RSP               176
    167 #define ISTATE_OFFSET_SS                184
     141FUNCTION_END(enable_l_apic_in_msr)
    168142
    169143/*
     
    171145 * error word.
    172146 */
    173 #define ISTATE_SOFT_SIZE        144
     147#define ISTATE_SOFT_SIZE        ISTATE_SIZE - (6 * 8)
    174148
    175149/**
     
    181155
    182156.macro handler i
    183 .global int_\i
    184 int_\i:
     157SYMBOL(int_\i)
    185158
    186159        /*
     
    228201
    229202        /*
     203         * Is this trap from the kernel?
     204         */
     205        cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
     206        jz 0f
     207
     208        /*
     209         * Switch to kernel FS base.
     210         */
     211        swapgs
     212        movl $AMD_MSR_FS, %ecx
     213        movl %gs:KSEG_OFFSET_FSBASE, %eax
     214        movl %gs:KSEG_OFFSET_FSBASE+4, %edx
     215        wrmsr
     216        swapgs
     217
     218        /*
    230219         * Imitate a regular stack frame linkage.
    231220         * Stop stack traces here if we came from userspace.
    232221         */
    233         xorl %edx, %edx
    234         cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
     2220:      movl $0x0, %edx
    235223        cmovnzq %rdx, %rbp
    236224
     
    273261        53,54,55,56,57,58,59,60,61,62,63
    274262
    275 interrupt_handlers:
     263SYMBOL(interrupt_handlers)
    276264.irp cnt, LIST_0_63
    277265        handler \cnt
     
    297285 *
    298286 */
    299 syscall_entry:
     287SYMBOL(syscall_entry)
    300288        /* Switch to hidden %gs */
    301289        swapgs
    302290       
    303         /*
    304          * %gs:0 Scratch space for this thread's user RSP
    305          * %gs:8 Address to be used as this thread's kernel RSP
    306          */
    307        
    308         movq %rsp, %gs:0  /* save this thread's user RSP */
    309         movq %gs:8, %rsp  /* set this thread's kernel RSP */
    310        
     291        movq %rsp, %gs:KSEG_OFFSET_USTACK_RSP  /* save this thread's user RSP */
     292        movq %gs:KSEG_OFFSET_KSTACK_RSP, %rsp  /* set this thread's kernel RSP */
     293
    311294        /*
    312295         * Note that the space needed for the imitated istate structure has been
     
    337320
    338321        /*
     322         * Switch to kernel FS base.
     323         */
     324        movl $AMD_MSR_FS, %ecx
     325        movl %gs:KSEG_OFFSET_FSBASE, %eax
     326        movl %gs:KSEG_OFFSET_FSBASE+4, %edx
     327        wrmsr
     328        movq ISTATE_OFFSET_RDX(%rsp), %rdx      /* restore 3rd argument */
     329
     330        /*
    339331         * Save the return address and the userspace stack on locations that
    340332         * would normally be taken by them.
    341333         */
    342         movq %gs:0, %rax
     334        movq %gs:KSEG_OFFSET_USTACK_RSP, %rax
    343335        movq %rax, ISTATE_OFFSET_RSP(%rsp)
    344336        movq %rcx, ISTATE_OFFSET_RIP(%rsp)
     
    420412 *
    421413 */
    422 early_putchar:
    423        
     414FUNCTION_BEGIN(early_putchar)
    424415#if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
    425416       
     
    549540       
    550541        ret
    551 
     542FUNCTION_END(early_putchar)
Note: See TracChangeset for help on using the changeset viewer.