svn commit: r249225 - projects/amd64_xen_pv/sys/amd64/xen
Cherry G. Mathew
cherry at FreeBSD.org
Sun Apr 7 10:07:19 UTC 2013
Author: cherry
Date: Sun Apr 7 10:07:18 2013
New Revision: 249225
URL: http://svnweb.freebsd.org/changeset/base/249225
Log:
Normalise stackframe exit layout for both errorcode bearing exceptions
and others. This makes INTR_EXIT() work as expected.
Fixes: Return to guest from events, exceptions and traps.
Approved by: gibbs(implicit)
Modified:
projects/amd64_xen_pv/sys/amd64/xen/exception.S
Modified: projects/amd64_xen_pv/sys/amd64/xen/exception.S
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/exception.S Sun Apr 7 06:47:44 2013 (r249224)
+++ projects/amd64_xen_pv/sys/amd64/xen/exception.S Sun Apr 7 10:07:18 2013 (r249225)
@@ -105,8 +105,29 @@
#define RESTORE_SEGMENT_REGS \
call restore_segment_regs
-/* stackframe management for trap() */
-/* Undo the work of the Xen template code */
+/* stackframe management for trap()
+ *
+ * Xen creates a "bounce frame" in the following format:
+ * { RCX, R11, [DS-GS,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS }
+ *
+ * Erratum: Comments in the Xen sources talk about [CR2] saved on the
+ * stackframe, but the code for this is not to be found.
+ * c.f: xen/arch/x86/x86_64/entry.S
+ *
+ * [DS-GS,] is only saved for the failsafe callback.
+ *
+ * [ERRCODE], is optional, depending on the type of (hardware) exception.
+ * See: the "AMD64 Architecture Programmer's Manuel, Volume 2:
+ * System Programming: Section 8.2 for individual error code
+ * reporting status
+ *
+ */
+/*
+ * Prepare the frame for a non-failsafe entry point.
+ * We frob the stack so it looks like the native entry point.
+ * See: "hardware defined" part of x86/frame.h struct trapframe;
+ */
+
#define TRAP_FRAME_PREPARE \
movq (%rsp), %rcx ; \
movq 8(%rsp), %r11 ; \
@@ -130,11 +151,21 @@
TRAP_FRAME_PREPARE ; \
subq $TF_ERR, %rsp
+/*
+ * Setting up the exit stackframe involves resetting the stack layout
+ * identically to that of an exception without error code. The reason
+ * for this is that in order to "iret", we make a hypervisor call, and
+ * this hypervisor call is a syscall which expects an 'error code' on
+ * the stack. We accomplish this by pushing quadword '0' onto the
+ * stack in the INTR_EXIT() stub.
+ *
+ */
+
#define TRAP_FRAME_EXIT_NOERR \
addq $TF_RIP, %rsp
#define TRAP_FRAME_EXIT_ERR \
- addq $TF_ERR, %rsp
+ addq $TF_RIP, %rsp
#define TRAP_PROLOGUE(a) \
movl $(a), TF_TRAPNO(%rsp) ; \
More information about the svn-src-projects
mailing list