[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: 32-on-64 sysenter for pvops



>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


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.