lkml.org 
[lkml]   [2009]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: x86: asm doubt
    Sergio Luis wrote:
    > Hi there,
    >
    > taking a look at arch/x86/power/cpu_(32|64).c, I saw the 32.c one
    > using the following macros
    >
    > #define savesegment(seg, value) \
    > asm("mov %%" #seg ",%0":"=r" (value) : : "memory")
    >
    >
    > #define loadsegment(seg, value) \
    > asm volatile("\n" \
    > "1:\t" \
    > "movl %k0,%%" #seg "\n" \
    > "2:\n" \
    > ".section .fixup,\"ax\"\n" \
    > "3:\t" \
    > "movl %k1, %%" #seg "\n\t" \
    > "jmp 2b\n" \
    > ".previous\n" \
    > _ASM_EXTABLE(1b,3b) \
    > : :"r" (value), "r" (0) : "memory")
    >
    >
    > saving and loading segment registers as in
    >
    > savesegment(es, ctxt->es);
    > loadsegment(es, ctxt->es);
    >
    > the code in cpu_64.c doesn't make use of such macros, doing the following:
    >
    > saving:
    > asm volatile ("movw %%es, %0" : "=m" (ctxt->es));
    >
    > loading:
    > asm volatile ("movw %0, %%es" :: "r" (ctxt->es));
    >
    > So, my question is... what's the actual difference between both
    > versions? Aren't the macros suitable for the 64 version as well?
    >

    In 32-bit mode, moving to a segment register can fault if the underlying
    GDT/LDT entry is invalid. In 64-bit mode, segment registers are mostly
    decorative and have no function, and moving arbitrary values into them
    doesn't fault, making the exception catching unnecessary.

    But it would be good to use the same syntax to load segment registers
    for both architectures to help with unification.

    J


    \
     
     \ /
      Last update: 2009-03-15 17:43    [W:0.031 / U:0.316 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site