diff options
author | Brian Gerst <brgerst@gmail.com> | 2009-10-12 10:18:23 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-12 12:29:46 -0400 |
commit | ae24ffe5ecec17c956ac25371d7c2e12b4b36e53 (patch) | |
tree | dac0241dcc85e8ec6e8fe25705fce8bf7f4ea57e /arch/x86/kernel/entry_64.S | |
parent | f3834b9ef68067199486740b31f691afb14dbdf5 (diff) |
x86, 64-bit: Move K8 B step iret fixup to fault entry asm
Move the handling of truncated %rip from an iret fault to the fault
entry path.
This allows x86-64 to use the standard search_extable() function.
Signed-off-by: Brian Gerst <brgerst@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jan Beulich <jbeulich@novell.com>
LKML-Reference: <1255357103-5418-1-git-send-email-brgerst@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
-rw-r--r-- | arch/x86/kernel/entry_64.S | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index b5c061f8f358..af0f4b226dbe 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -1491,12 +1491,17 @@ error_kernelspace: | |||
1491 | leaq irq_return(%rip),%rcx | 1491 | leaq irq_return(%rip),%rcx |
1492 | cmpq %rcx,RIP+8(%rsp) | 1492 | cmpq %rcx,RIP+8(%rsp) |
1493 | je error_swapgs | 1493 | je error_swapgs |
1494 | movl %ecx,%ecx /* zero extend */ | 1494 | movl %ecx,%eax /* zero extend */ |
1495 | cmpq %rcx,RIP+8(%rsp) | 1495 | cmpq %rax,RIP+8(%rsp) |
1496 | je error_swapgs | 1496 | je bstep_iret |
1497 | cmpq $gs_change,RIP+8(%rsp) | 1497 | cmpq $gs_change,RIP+8(%rsp) |
1498 | je error_swapgs | 1498 | je error_swapgs |
1499 | jmp error_sti | 1499 | jmp error_sti |
1500 | |||
1501 | bstep_iret: | ||
1502 | /* Fix truncated RIP */ | ||
1503 | movq %rcx,RIP+8(%rsp) | ||
1504 | je error_swapgs | ||
1500 | END(error_entry) | 1505 | END(error_entry) |
1501 | 1506 | ||
1502 | 1507 | ||