Changes in kernel/arch/amd64/src/asm.S [4236b18:e98f1c3e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/asm.S
r4236b18 re98f1c3e 27 27 */ 28 28 29 #include <abi/asmtool.h> 29 30 #include <arch/pm.h> 30 31 #include <arch/mm/page.h> 31 32 #include <arch/istate_struct.h> 33 #include <arch/kseg_struct.h> 34 #include <arch/cpu.h> 35 #include <arch/smp/apic.h> 32 36 33 37 .text 34 .global interrupt_handlers35 .global syscall_entry36 .global cpuid37 .global has_cpuid38 .global read_efer_flag39 .global set_efer_flag40 .global memcpy_from_uspace41 .global memcpy_to_uspace42 .global memcpy_from_uspace_failover_address43 .global memcpy_to_uspace_failover_address44 .global early_putchar45 38 46 39 #define MEMCPY_DST %rdi … … 64 57 * 65 58 */ 66 memcpy_from_uspace: 67 memcpy_to_uspace: 59 FUNCTION_BEGIN(memcpy_from_uspace) 60 FUNCTION_BEGIN(memcpy_to_uspace) 68 61 movq MEMCPY_DST, %rax 69 62 … … 81 74 0: 82 75 ret /* return MEMCPY_SRC, success */ 83 84 memcpy_from_uspace_failover_address: 85 memcpy_to_uspace_failover_address: 76 FUNCTION_END(memcpy_from_uspace) 77 FUNCTION_END(memcpy_to_uspace) 78 79 SYMBOL(memcpy_from_uspace_failover_address) 80 SYMBOL(memcpy_to_uspace_failover_address) 86 81 xorl %eax, %eax /* return 0, failure */ 87 82 ret … … 92 87 * 93 88 */ 94 has_cpuid: 89 FUNCTION_BEGIN(has_cpuid) 95 90 /* Load RFLAGS */ 96 91 pushfq … … 99 94 100 95 /* Flip the ID bit */ 101 btcl $21, %edx96 xorl $RFLAGS_ID, %edx 102 97 103 98 /* Store RFLAGS */ … … 108 103 /* Get the ID bit again */ 109 104 popq %rdx 110 andl $ (1 << 21), %eax111 andl $ (1 << 21), %edx105 andl $RFLAGS_ID, %eax 106 andl $RFLAGS_ID, %edx 112 107 113 108 /* 0 if not supported, 1 if supported */ 114 109 xorl %edx, %eax 115 110 ret 116 117 cpuid: 111 FUNCTION_END(has_cpuid) 112 113 FUNCTION_BEGIN(cpuid) 118 114 /* Preserve %rbx across function calls */ 119 115 movq %rbx, %r10 … … 130 126 movq %r10, %rbx 131 127 ret 132 133 set_efer_flag: 134 movl $0xc0000080, %ecx 128 FUNCTION_END(cpuid) 129 130 /** Enable local APIC 131 * 132 * Enable local APIC in MSR. 133 * 134 */ 135 FUNCTION_BEGIN(enable_l_apic_in_msr) 136 movl $AMD_MSR_APIC_BASE, %ecx 135 137 rdmsr 136 btsl %edi, %eax138 orl $(L_APIC_BASE | AMD_APIC_BASE_GE), %eax 137 139 wrmsr 138 140 ret 139 140 read_efer_flag: 141 movl $0xc0000080, %ecx 142 rdmsr 143 ret 141 FUNCTION_END(enable_l_apic_in_msr) 144 142 145 143 /* … … 157 155 158 156 .macro handler i 159 .global int_\i 160 int_\i: 157 SYMBOL(int_\i) 161 158 162 159 /* … … 204 201 205 202 /* 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 /* 206 219 * Imitate a regular stack frame linkage. 207 220 * Stop stack traces here if we came from userspace. 208 221 */ 209 xorl %edx, %edx 210 cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp) 222 0: movl $0x0, %edx 211 223 cmovnzq %rdx, %rbp 212 224 … … 249 261 53,54,55,56,57,58,59,60,61,62,63 250 262 251 interrupt_handlers: 263 SYMBOL(interrupt_handlers) 252 264 .irp cnt, LIST_0_63 253 265 handler \cnt … … 273 285 * 274 286 */ 275 syscall_entry: 287 SYMBOL(syscall_entry) 276 288 /* Switch to hidden %gs */ 277 289 swapgs 278 290 279 /* 280 * %gs:0 Scratch space for this thread's user RSP 281 * %gs:8 Address to be used as this thread's kernel RSP 282 */ 283 284 movq %rsp, %gs:0 /* save this thread's user RSP */ 285 movq %gs:8, %rsp /* set this thread's kernel RSP */ 286 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 287 294 /* 288 295 * Note that the space needed for the imitated istate structure has been … … 313 320 314 321 /* 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 /* 315 331 * Save the return address and the userspace stack on locations that 316 332 * would normally be taken by them. 317 333 */ 318 movq %gs: 0, %rax334 movq %gs:KSEG_OFFSET_USTACK_RSP, %rax 319 335 movq %rax, ISTATE_OFFSET_RSP(%rsp) 320 336 movq %rcx, ISTATE_OFFSET_RIP(%rsp) … … 396 412 * 397 413 */ 398 early_putchar: 399 414 FUNCTION_BEGIN(early_putchar) 400 415 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB))) 401 416 … … 525 540 526 541 ret 527 542 FUNCTION_END(early_putchar)
Note:
See TracChangeset
for help on using the changeset viewer.