lkml.org 
[lkml]   [2012]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: Compat 32-bit syscall entry from 64-bit task!?
    On Thu, Jan 19, 2012 at 8:01 AM, Jamie Lokier <jamie@shareable.org> wrote:
    > Andrew Lutomirski wrote:
    >> It's reasonable, obvious, and even more wrong than it appears.  On
    >> Xen, there's an extra 64-bit GDT entry, and it gets used by default.
    >> (I got bitten by this in some iteration of the vsyscall emulation
    >> patches -- see user_64bit_mode for the correct and
    >> unusable-from-user-mode way to do this.)
    >
    > Here it is:
    >
    >        static inline bool user_64bit_mode(struct pt_regs *regs)
    >        {
    >        #ifndef CONFIG_PARAVIRT
    >                /*
    >                 * On non-paravirt systems, this is the only long mode CPL 3
    >                 * selector.  We do not allow long mode selectors in the LDT.
    >                 */
    >                return regs->cs == __USER_CS;
    >        #else
    >                /* Headers are too twisted for this to go in paravirt.h. */
    >                return regs->cs == __USER_CS || regs->cs == pv_info.extra_user_64bit_cs;
    >        #endif
    >        }
    >
    > Perhaps userspace can do that.
    > Would it be right for a ptracer to say:
    >
    >   CS == 0x23 -> 32-bit
    >   (CS & 4)   -> 32-bit (LDT, "we do not allow long mode selectors in the LDT")
    >   else       -> 64-bit (__USER_CS or some other GDT entry which must be pv_info's)
    >
    > I.e. assume that no other *GDT* CS values are available to userspace?
    > There are other 32-bit GDT entries, but are they not all for data or kernel use only?

    I suspect not. asm/xen/interface_64.h has:

    #define FLAT_RING3_CS32 0xe023 /* GDT index 260 */
    #define FLAT_RING3_CS64 0xe033 /* GDT index 261 */
    #define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
    #define FLAT_RING3_DS64 0x0000 /* NULL selector */
    #define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
    #define FLAT_RING3_SS64 0xe02b /* GDT index 262 */

    which sounds like there's an extra 32-bit selector as well. I haven't
    checked, though.

    --Andy
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-01-19 17:15    [W:0.024 / U:31.548 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site