The new entry will be equivalent to that of x86-64 which stores CPU number. The entry is placed in segment 23 in GDT by bumping down 23-28 by one, which are all kernel-internal segments and so have no impact on user space.
CPU_NUMBER segment will always be at '%ss (USER_DS) + 80' for the default (flat, initial) user space %ss. %ss is specified than %ds because it is less likely to be changed as 64-bit has %ss defined. Suggested-by: H. Peter <[email protected]> Signed-off-by: Chang S. Bae <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> --- arch/x86/include/asm/segment.h | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 492e3d1..fca55d7 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -77,14 +77,14 @@ * 20 - PNPBIOS support <=== cacheline #6 * 21 - PNPBIOS support * 22 - PNPBIOS support - * 23 - APM BIOS support + * 23 - CPU number * 24 - APM BIOS support <=== cacheline #7 * 25 - APM BIOS support * - * 26 - ESPFIX small SS - * 27 - per-cpu [ offset to per-cpu data area ] - * 28 - stack_canary-20 [ for stack protector ] <=== cacheline #8 - * 29 - unused + * 26 - APM BIOS support + * 27 - ESPFIX small SS + * 28 - per-cpu [ offset to per-cpu data area ] <=== cacheline #8 + * 29 - stack_canary-20 [ for stack protector ] * 30 - unused * 31 - TSS for double fault handler */ @@ -102,11 +102,12 @@ #define GDT_ENTRY_PNPBIOS_DS 20 #define GDT_ENTRY_PNPBIOS_TS1 21 #define GDT_ENTRY_PNPBIOS_TS2 22 -#define GDT_ENTRY_APMBIOS_BASE 23 +#define GDT_ENTRY_CPU_NUMBER 23 +#define GDT_ENTRY_APMBIOS_BASE 24 -#define GDT_ENTRY_ESPFIX_SS 26 -#define GDT_ENTRY_PERCPU 27 -#define GDT_ENTRY_STACK_CANARY 28 +#define GDT_ENTRY_ESPFIX_SS 27 +#define GDT_ENTRY_PERCPU 28 +#define GDT_ENTRY_STACK_CANARY 29 #define GDT_ENTRY_DOUBLEFAULT_TSS 31 @@ -140,6 +141,13 @@ /* another data segment: */ #define PNP_TS2 (GDT_ENTRY_PNPBIOS_TS2*8) +/* + * CPU_NUMBER segment is at '%ss + 80' for the default (flat, initial) + * user space %ss (for 64-bit as well). Using %ss than %ds for less + * likely to be changed as defined in 64-bit too. + */ +#define __CPU_NUMBER_SEG (GDT_ENTRY_CPU_NUMBER*8 + 3) + #ifdef CONFIG_SMP # define __KERNEL_PERCPU (GDT_ENTRY_PERCPU*8) #else @@ -206,6 +214,10 @@ #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3) #define __USER32_DS __USER_DS #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3) +/* + * CPU_NUMBER segment at '%ss (USER_DS) + 80', + * like 32-bit for the same reason + */ #define __CPU_NUMBER_SEG (GDT_ENTRY_CPU_NUMBER*8 + 3) #endif -- 2.7.4

