diff options
| author | Brian Gerst <brgerst@gmail.com> | 2010-07-31 12:48:23 -0400 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2010-08-01 19:05:23 -0400 |
| commit | 72c511dd596cff88d6523f231a0fbb8f73006d51 (patch) | |
| tree | 030e17e0947ec0a3c00d04099568e242abf00ea7 /arch | |
| parent | c15a5958a0b6dbf06b3c05972694f04a0c50a4cf (diff) | |
x86-32, asm: Directly access per-cpu GDT
Use a direct per-cpu reference for the GDT instead of using a scratch
register.
Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1280594903-6341-2-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index cd49141cf153..233c5829e7ac 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -611,14 +611,14 @@ ldt_ss: | |||
| 611 | * compensating for the offset by changing to the ESPFIX segment with | 611 | * compensating for the offset by changing to the ESPFIX segment with |
| 612 | * a base address that matches for the difference. | 612 | * a base address that matches for the difference. |
| 613 | */ | 613 | */ |
| 614 | #define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8) | ||
| 614 | mov %esp, %edx /* load kernel esp */ | 615 | mov %esp, %edx /* load kernel esp */ |
| 615 | mov PT_OLDESP(%esp), %eax /* load userspace esp */ | 616 | mov PT_OLDESP(%esp), %eax /* load userspace esp */ |
| 616 | mov %dx, %ax /* eax: new kernel esp */ | 617 | mov %dx, %ax /* eax: new kernel esp */ |
| 617 | sub %eax, %edx /* offset (low word is 0) */ | 618 | sub %eax, %edx /* offset (low word is 0) */ |
| 618 | PER_CPU(gdt_page, %ebx) | ||
| 619 | shr $16, %edx | 619 | shr $16, %edx |
| 620 | mov %dl, GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx) /* bits 16..23 */ | 620 | mov %dl, GDT_ESPFIX_SS + 4 /* bits 16..23 */ |
| 621 | mov %dh, GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx) /* bits 24..31 */ | 621 | mov %dh, GDT_ESPFIX_SS + 7 /* bits 24..31 */ |
| 622 | pushl $__ESPFIX_SS | 622 | pushl $__ESPFIX_SS |
| 623 | CFI_ADJUST_CFA_OFFSET 4 | 623 | CFI_ADJUST_CFA_OFFSET 4 |
| 624 | push %eax /* new kernel esp */ | 624 | push %eax /* new kernel esp */ |
| @@ -791,9 +791,8 @@ ptregs_clone: | |||
| 791 | * normal stack and adjusts ESP with the matching offset. | 791 | * normal stack and adjusts ESP with the matching offset. |
| 792 | */ | 792 | */ |
| 793 | /* fixup the stack */ | 793 | /* fixup the stack */ |
| 794 | PER_CPU(gdt_page, %ebx) | 794 | mov GDT_ESPFIX_SS + 4, %al /* bits 16..23 */ |
| 795 | mov GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx), %al /* bits 16..23 */ | 795 | mov GDT_ESPFIX_SS + 7, %ah /* bits 24..31 */ |
| 796 | mov GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx), %ah /* bits 24..31 */ | ||
| 797 | shl $16, %eax | 796 | shl $16, %eax |
| 798 | addl %esp, %eax /* the adjusted stack pointer */ | 797 | addl %esp, %eax /* the adjusted stack pointer */ |
| 799 | pushl $__KERNEL_DS | 798 | pushl $__KERNEL_DS |
