All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <jbeulich@novell.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Keir Fraser <Keir.Fraser@cl.cam.ac.uk>,
	Xen-devel <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@XenSource.com>
Subject: Re: 32-on-64 sysenter for pvops
Date: Tue, 04 Mar 2008 08:38:09 +0000	[thread overview]
Message-ID: <47CD1881.76E4.0078.0@novell.com> (raw)
In-Reply-To: <47CCA07A.50902@goop.org>

>Anyway, a couple of questions.  It seems that the stack frame that Xen's 
>sysenter generates is not exactly the same as the one the kernel 
>expects, so the direct access to the threadinfo structure doesn't work 
>properly.  What's the difference in the frames?

The frame is a normal interrupt frame (but not completely/properly filled
in - the implication of course is that the stack has been switched, other
than native sysenter would do), which is why the code in our kernels just
is a special preamble to system_call:

...
ENDPROC(ia32_sysenter_target)

	# pv sysenter call handler stub
ENTRY(ia32pv_sysenter_target)
	RING0_INT_FRAME
	movl $__USER_DS,16(%esp)
	movl %ebp,12(%esp)
	movl $__USER_CS,4(%esp)
	addl $4,%esp
	CFI_ADJUST_CFA_OFFSET -4
	/* +5*4 is SS:ESP,EFLAGS,CS:EIP. +8 is esp0 setting. */
	pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
	CFI_ADJUST_CFA_OFFSET 4
/*
 * Load the potential sixth argument from user stack.
 * Careful about security.
 */
	cmpl $__PAGE_OFFSET-3,%ebp
	jae syscall_fault
1:	movl (%ebp),%ebp
.section __ex_table,"a"
	.align 4
	.long 1b,syscall_fault
.previous
	/* fall through */
	CFI_ENDPROC
ENDPROC(ia32pv_sysenter_target)

	# system call handler stub
ENTRY(system_call)
...

>I guess the other reason for the separate PV Xen sysenter entrypoint is 
>to deal with sysexit not working.  I addressed this by implementing a 
>sysexit pvop using iret, though I think I could just set the TIF_IRET 
>flag in threadinfo.

Either should work, but as pointed out above letting it just fall through
to system_call seems even easier.

>Anyway, could you look at these changes and see if anything problematic 
>leaps out.

This description

>The sysenter path tries to enable interrupts immediately.  Unfortunately
>this doesn't work in a paravirt environment, because not enough kernel
>state has been set up at that point (namely, pointing %fs to the kernel
>percpu data segment).  To fix this, defer ENABLE_INTERRUPTS until after
>the kernel state has been set up.

seems bogus: The sysenter handler in our kernels gets called with
interrupts enabled, which is as safe as int $80 going through a trap gate
(i.e. the rest of the kernel needs to be prepared to deal with interrupts
being enabled here anyway).

Jan

  reply	other threads:[~2008-03-04  8:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-04  1:06 32-on-64 sysenter for pvops Jeremy Fitzhardinge
2008-03-04  8:38 ` Jan Beulich [this message]
2008-03-04 15:38   ` Jeremy Fitzhardinge
2008-03-04  8:52 ` Keir Fraser

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47CD1881.76E4.0078.0@novell.com \
    --to=jbeulich@novell.com \
    --cc=Ian.Campbell@XenSource.com \
    --cc=Keir.Fraser@cl.cam.ac.uk \
    --cc=jeremy@goop.org \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.