On Wed, Jan 18, 2012 at 11:31 AM, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > The actually used code just does > > /* Check CS register value. On x86-64 linux it is: > * 0x33 for long mode (64 bit) > * 0x23 for compatibility mode (32 bit) > * It takes only one ptrace and thus doesn't need > * to be cached. > */ > if (upeek(tcp, 8*CS, &val) < 0) > return -1; > switch (val) { > case 0x23: currpers = 1; break; > case 0x33: currpers = 0; break; > > which is the reasonable and obvious approach. *sigh* 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.) --Andy -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html