linux/i386: Improve critical region handling code

- use symbolics instead of raw numbers (going to help the 2.6.20 port,
as those numbers change there)
- fold instructions where possible
- move fixup table into .rodata

Signed-off-by: Jan Beulich <jbeulich@novell.com>
This commit is contained in:
kfraser@localhost.localdomain committed 2007-02-06 23:36:53 +00:00
1 parent e471d8c8bf
commit 00aabc5c80
1 file changed
+10 -12
@@ -747,7 +747,7 @@ ENTRY(hypervisor_callback)
jb 11f
cmpl $sysexit_ecrit,%eax
ja 11f
addl $0x34,%esp # Remove cs...ebx from stack frame.
addl $OLDESP,%esp # Remove eflags...ebx from stack frame.
11: push %esp
call evtchn_do_upcall
add $4,%esp
@@ -777,18 +777,13 @@ ecrit: /**** END OF CRITICAL REGION ****/
# provides the number of bytes which have already been popped from the
# interrupted stack frame.
critical_region_fixup:
addl $critical_fixup_table-scrit,%eax
movzbl (%eax),%eax # %eax contains num bytes popped
cmpb $0xff,%al # 0xff => vcpu_info critical region
movzbl critical_fixup_table-scrit(%eax),%ecx # %eax contains num bytes popped
cmpb $0xff,%cl # 0xff => vcpu_info critical region
jne 15f
GET_THREAD_INFO(%ebp)
xorl %eax,%eax
15: mov %esp,%esi
add %eax,%esi # %esi points at end of src region
mov %esp,%edi
add $0x34,%edi # %edi points at end of dst region
mov %eax,%ecx
shr $2,%ecx # convert words to bytes
xorl %ecx,%ecx
15: leal (%esp,%ecx),%esi # %esi points at end of src region
leal OLDESP(%esp),%edi # %edi points at end of dst region
shrl $2,%ecx # convert words to bytes
je 17f # skip loop if nothing to copy
16: subl $4,%esi # pre-decrementing copy loop
subl $4,%edi
@@ -798,6 +793,7 @@ critical_region_fixup:
17: movl %edi,%esp # final %edi is top of merged stack
jmp 11b
.section .rodata,"a"
critical_fixup_table:
.byte 0xff,0xff,0xff # testb $0xff,(%esi) = __TEST_PENDING
.byte 0xff,0xff # jnz 14f
@@ -814,6 +810,7 @@ critical_fixup_table:
.byte 0x28 # iret
.byte 0xff,0xff,0xff,0xff # movb $1,1(%esi)
.byte 0x00,0x00 # jmp 11b
.previous
# Hypervisor uses this for application faults while it executes.
# We get here for two reasons:
@@ -1194,6 +1191,7 @@ ENTRY(fixup_4gb_segment)
jmp error_code
.section .rodata,"a"
.align 4
#include "syscall_table.S"
syscall_table_size=(.-sys_call_table)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.