diff options
Diffstat (limited to 'debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch')
-rw-r--r-- | debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch b/debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch new file mode 100644 index 0000000..8386235 --- /dev/null +++ b/debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch @@ -0,0 +1,71 @@ +From 2a53b2da8c31676ddf53564ac95a01fcb78f2d20 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Tue, 5 May 2015 20:34:50 +0200 +Subject: [PATCH gnumach 08/10] document, check for sysenter at the right + location + +--- + i386/i386/locore.S | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +diff --git a/i386/i386/locore.S b/i386/i386/locore.S +index 4c2a253..8b4d766 100644 +--- a/i386/i386/locore.S ++++ b/i386/i386/locore.S +@@ -521,6 +521,9 @@ _return_to_user: + */ + + _return_from_kernel: ++ cmpl $0x7fffffff, R_TRAPNO(%esp) /* YYY */ ++ je return_from_sysenter ++ + _kret_popl_gs: + popl %gs /* restore segment registers */ + _kret_popl_fs: +@@ -592,8 +595,6 @@ ENTRY(thread_syscall_return) + or $(KERNEL_STACK_SIZE-1),%ecx + movl -3-IKS_SIZE(%ecx),%esp /* switch back to PCB stack */ + movl %eax,R_EAX(%esp) /* save return value */ +- cmpl $0x7fffffff, R_TRAPNO(%esp) /* YYY */ +- je return_from_sysenter + jmp _return_from_trap + + ENTRY(call_continuation) +@@ -1231,6 +1232,7 @@ user_sysenter_stub_end: + * Control enters at `sysenter_entry' with %esp pointing to the + * per-cpu sysenter stack. We store all arguments here. We keep %ebp + * pointing to the top of this structure to copy the arguments. ++ + * + * sysenter stack layout: + * +@@ -1291,11 +1293,10 @@ ENTRY(sysenter_entry) + + /* Populate trap save area. */ + pushl $0x7fffffff /* trap number */ +- pushl $0x12345678 /* unused */ +- pushl SE_STACK_POINTER(%ebp) /* ecx */ +- pushl SE_RETURN_ADDRESS(%ebp) /* edx */ +- subl $(5 * 4), %esp /* Unused. We save the +- arguments in userspace. */ ++ pushl %eax /* %eax: unused */ ++ pushl SE_STACK_POINTER(%ebp) /* %ecx: for sysexit */ ++ pushl SE_RETURN_ADDRESS(%ebp) /* %edx: for sysexit */ ++ subl $(5 * 4), %esp /* unused */ + pushl SE_DS(%ebp) /* copy the segment registers */ + pushl SE_ES(%ebp) + pushl SE_FS(%ebp) +@@ -1363,8 +1364,8 @@ se_args_0: + movl %ebx, %esp /* clean parameters from stack */ + popl %esp /* switch to pcb stack */ + movl %eax, R_EAX(%esp) /* save return value */ +-return_from_sysenter: +- /* xxx: process ast */ ++ jmp _return_from_trap /* check for AST, then... */ ++return_from_sysenter: /* return here */ + popl %gs /* restore segment registers */ + popl %fs + popl %es +-- +2.1.4 + |