summaryrefslogtreecommitdiff
path: root/debian/patches/sysenter0008-document-check-for-sysenter-at-the-right-location.patch
diff options
context:
space:
mode:
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.patch71
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
+