Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #ifndef _ASM_X86_SEGMENT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #define _ASM_X86_SEGMENT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <linux/const.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <asm/alternative.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * Constructor for a conventional segment GDT (or LDT) entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * This is a macro so it can be used in initializers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define GDT_ENTRY(flags, base, limit)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	((((base)  & _AC(0xff000000,ULL)) << (56-24)) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	 (((flags) & _AC(0x0000f0ff,ULL)) << 40) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	 (((limit) & _AC(0x000f0000,ULL)) << (48-16)) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	 (((base)  & _AC(0x00ffffff,ULL)) << 16) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	 (((limit) & _AC(0x0000ffff,ULL))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) /* Simple and small GDT entries for booting only: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define GDT_ENTRY_BOOT_CS	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define GDT_ENTRY_BOOT_DS	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define GDT_ENTRY_BOOT_TSS	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define __BOOT_CS		(GDT_ENTRY_BOOT_CS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define __BOOT_DS		(GDT_ENTRY_BOOT_DS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #define __BOOT_TSS		(GDT_ENTRY_BOOT_TSS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * Bottom two bits of selector give the ring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  * privilege level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define SEGMENT_RPL_MASK	0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * When running on Xen PV, the actual privilege level of the kernel is 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * not 0. Testing the Requested Privilege Level in a segment selector to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * determine whether the context is user mode or kernel mode with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * SEGMENT_RPL_MASK is wrong because the PV kernel's privilege level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  * matches the 0x3 mask.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  * Testing with USER_SEGMENT_RPL_MASK is valid for both native and Xen PV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * kernels because privilege level 2 is never used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define USER_SEGMENT_RPL_MASK	0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) /* User mode is privilege level 3: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define USER_RPL		0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /* Bit 2 is Table Indicator (TI): selects between LDT or GDT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define SEGMENT_TI_MASK		0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) /* LDT segment has TI set ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #define SEGMENT_LDT		0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) /* ... GDT has it cleared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) #define SEGMENT_GDT		0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define GDT_ENTRY_INVALID_SEG	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  * The layout of the per-CPU GDT under Linux:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)  *   0 - null								<=== cacheline #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)  *   1 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)  *   2 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)  *   3 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)  *   4 - unused								<=== cacheline #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  *   5 - unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  *  ------- start of TLS (Thread-Local Storage) segments:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  *   6 - TLS segment #1			[ glibc's TLS segment ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  *   7 - TLS segment #2			[ Wine's %fs Win32 segment ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  *   8 - TLS segment #3							<=== cacheline #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  *   9 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  *  10 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  *  11 - reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  *  ------- start of kernel segments:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  *  12 - kernel code segment						<=== cacheline #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  *  13 - kernel data segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  *  14 - default user CS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  *  15 - default user DS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  *  16 - TSS								<=== cacheline #5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  *  17 - LDT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  *  18 - PNPBIOS support (16->32 gate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88)  *  19 - PNPBIOS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  *  20 - PNPBIOS support						<=== cacheline #6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  *  21 - PNPBIOS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  *  22 - PNPBIOS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  *  23 - APM BIOS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)  *  24 - APM BIOS support						<=== cacheline #7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  *  25 - APM BIOS support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  *  26 - ESPFIX small SS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  *  27 - per-cpu			[ offset to per-cpu data area ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)  *  28 - stack_canary-20		[ for stack protector ]		<=== cacheline #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  *  29 - unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  *  30 - unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)  *  31 - TSS for double fault handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define GDT_ENTRY_TLS_MIN		6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define GDT_ENTRY_TLS_MAX 		(GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define GDT_ENTRY_KERNEL_CS		12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define GDT_ENTRY_KERNEL_DS		13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define GDT_ENTRY_DEFAULT_USER_CS	14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define GDT_ENTRY_DEFAULT_USER_DS	15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define GDT_ENTRY_TSS			16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define GDT_ENTRY_LDT			17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define GDT_ENTRY_PNPBIOS_CS32		18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define GDT_ENTRY_PNPBIOS_CS16		19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define GDT_ENTRY_PNPBIOS_DS		20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define GDT_ENTRY_PNPBIOS_TS1		21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define GDT_ENTRY_PNPBIOS_TS2		22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define GDT_ENTRY_APMBIOS_BASE		23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define GDT_ENTRY_ESPFIX_SS		26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define GDT_ENTRY_PERCPU		27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define GDT_ENTRY_STACK_CANARY		28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define GDT_ENTRY_DOUBLEFAULT_TSS	31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)  * Number of entries in the GDT table:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define GDT_ENTRIES			32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)  * Segment selector values corresponding to the above entries:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define __KERNEL_CS			(GDT_ENTRY_KERNEL_CS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define __KERNEL_DS			(GDT_ENTRY_KERNEL_DS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define __USER_DS			(GDT_ENTRY_DEFAULT_USER_DS*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define __USER_CS			(GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define __ESPFIX_SS			(GDT_ENTRY_ESPFIX_SS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* segment for calling fn: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define PNP_CS32			(GDT_ENTRY_PNPBIOS_CS32*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* code segment for BIOS: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define PNP_CS16			(GDT_ENTRY_PNPBIOS_CS16*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* "Is this PNP code selector (PNP_CS32 or PNP_CS16)?" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SEGMENT_IS_PNP_CODE(x)		(((x) & 0xf4) == PNP_CS32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* data segment for BIOS: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define PNP_DS				(GDT_ENTRY_PNPBIOS_DS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* transfer data segment: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define PNP_TS1				(GDT_ENTRY_PNPBIOS_TS1*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* another data segment: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define PNP_TS2				(GDT_ENTRY_PNPBIOS_TS2*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) # define __KERNEL_PERCPU		(GDT_ENTRY_PERCPU*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) # define __KERNEL_PERCPU		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #ifdef CONFIG_STACKPROTECTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) # define __KERNEL_STACK_CANARY		(GDT_ENTRY_STACK_CANARY*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) # define __KERNEL_STACK_CANARY		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #else /* 64-bit: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define GDT_ENTRY_KERNEL32_CS		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define GDT_ENTRY_KERNEL_CS		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define GDT_ENTRY_KERNEL_DS		3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)  * We cannot use the same code segment descriptor for user and kernel mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)  * not even in long flat mode, because of different DPL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)  * GDT layout to get 64-bit SYSCALL/SYSRET support right. SYSRET hardcodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)  * selectors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)  *   if returning to 32-bit userspace: cs = STAR.SYSRET_CS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)  *   if returning to 64-bit userspace: cs = STAR.SYSRET_CS+16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)  * ss = STAR.SYSRET_CS+8 (in either case)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)  * thus USER_DS should be between 32-bit and 64-bit code selectors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define GDT_ENTRY_DEFAULT_USER32_CS	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define GDT_ENTRY_DEFAULT_USER_DS	5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define GDT_ENTRY_DEFAULT_USER_CS	6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* Needs two entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define GDT_ENTRY_TSS			8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* Needs two entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define GDT_ENTRY_LDT			10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define GDT_ENTRY_TLS_MIN		12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define GDT_ENTRY_TLS_MAX		14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define GDT_ENTRY_CPUNODE		15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)  * Number of entries in the GDT table:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define GDT_ENTRIES			16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)  * Segment selector values corresponding to the above entries:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)  * Note, selectors also need to have a correct RPL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)  * expressed with the +3 value for user-space selectors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define __KERNEL32_CS			(GDT_ENTRY_KERNEL32_CS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define __KERNEL_CS			(GDT_ENTRY_KERNEL_CS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define __KERNEL_DS			(GDT_ENTRY_KERNEL_DS*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define __USER32_CS			(GDT_ENTRY_DEFAULT_USER32_CS*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define __USER_DS			(GDT_ENTRY_DEFAULT_USER_DS*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define __USER32_DS			__USER_DS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define __USER_CS			(GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define __CPUNODE_SEG			(GDT_ENTRY_CPUNODE*8 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define IDT_ENTRIES			256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define NUM_EXCEPTION_VECTORS		32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* Bitmask of exception vectors which push an error code on the stack: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define EXCEPTION_ERRCODE_MASK		0x20027d00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define GDT_SIZE			(GDT_ENTRIES*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define GDT_ENTRY_TLS_ENTRIES		3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define TLS_SIZE			(GDT_ENTRY_TLS_ENTRIES* 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /* Bit size and mask of CPU number stored in the per CPU data (and TSC_AUX) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define VDSO_CPUNODE_BITS		12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define VDSO_CPUNODE_MASK		0xfff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* Helper functions to store/load CPU and node numbers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static inline unsigned long vdso_encode_cpunode(int cpu, unsigned long node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	return (node << VDSO_CPUNODE_BITS) | cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	unsigned int p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	 * Load CPU and node number from the GDT.  LSL is faster than RDTSCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	 * and works on all CPUs.  This is volatile so that it orders
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	 * correctly with respect to barrier() and to keep GCC from cleverly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	 * hoisting it out of the calling function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	 * If RDPID is available, use it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	alternative_io ("lsl %[seg],%[p]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 			".byte 0xf3,0x0f,0xc7,0xf8", /* RDPID %eax/rax */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 			X86_FEATURE_RDPID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 			[p] "=a" (p), [seg] "r" (__CPUNODE_SEG));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	if (cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 		*cpu = (p & VDSO_CPUNODE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	if (node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 		*node = (p >> VDSO_CPUNODE_BITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #endif /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #endif /* CONFIG_X86_64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)  * early_idt_handler_array is an array of entry points referenced in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)  * early IDT.  For simplicity, it's a real array with one entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  * every nine bytes.  That leaves room for an optional 'push $0' if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)  * vector has no error code (two bytes), a 'push $vector_number' (two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)  * bytes), and a jump to the common entry code (up to five bytes).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) #define EARLY_IDT_HANDLER_SIZE 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)  * xen_early_idt_handler_array is for Xen pv guests: for each entry in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)  * early_idt_handler_array it contains a prequel in the form of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)  * pop %rcx; pop %r11; jmp early_idt_handler_array[i]; summing up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)  * max 8 bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define XEN_EARLY_IDT_HANDLER_SIZE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS][EARLY_IDT_HANDLER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) extern void early_ignore_irq(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #ifdef CONFIG_XEN_PV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) extern const char xen_early_idt_handler_array[NUM_EXCEPTION_VECTORS][XEN_EARLY_IDT_HANDLER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)  * Load a segment. Fall back on loading the zero segment if something goes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)  * wrong.  This variant assumes that loading zero fully clears the segment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)  * This is always the case on Intel CPUs and, even on 64-bit AMD CPUs, any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)  * failure to fully clear the cached descriptor is only observable for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)  * FS and GS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define __loadsegment_simple(seg, value)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) do {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	unsigned short __val = (value);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	asm volatile("						\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 		     "1:	movl %k0,%%" #seg "		\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		     ".section .fixup,\"ax\"			\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 		     "2:	xorl %k0,%k0			\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 		     "		jmp 1b				\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		     ".previous					\n"	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 		     _ASM_EXTABLE(1b, 2b)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		     : "+r" (__val) : : "memory");			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #define __loadsegment_ss(value) __loadsegment_simple(ss, (value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define __loadsegment_ds(value) __loadsegment_simple(ds, (value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define __loadsegment_es(value) __loadsegment_simple(es, (value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)  * On 32-bit systems, the hidden parts of FS and GS are unobservable if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)  * the selector is NULL, so there's no funny business here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define __loadsegment_fs(value) __loadsegment_simple(fs, (value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define __loadsegment_gs(value) __loadsegment_simple(gs, (value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) static inline void __loadsegment_fs(unsigned short value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	asm volatile("						\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		     "1:	movw %0, %%fs			\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 		     "2:					\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		     _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_clear_fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 		     : : "rm" (value) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /* __loadsegment_gs is intentionally undefined.  Use load_gs_index instead. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define loadsegment(seg, value) __loadsegment_ ## seg (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)  * Save a segment register away:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define savesegment(seg, value)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	asm("mov %%" #seg ",%0":"=r" (value) : : "memory")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)  * x86-32 user GS accessors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) # ifdef CONFIG_X86_32_LAZY_GS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #  define get_user_gs(regs)		(u16)({ unsigned long v; savesegment(gs, v); v; })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #  define set_user_gs(regs, v)		loadsegment(gs, (unsigned long)(v))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #  define task_user_gs(tsk)		((tsk)->thread.gs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #  define lazy_save_gs(v)		savesegment(gs, (v))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #  define lazy_load_gs(v)		loadsegment(gs, (v))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) # else	/* X86_32_LAZY_GS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #  define get_user_gs(regs)		(u16)((regs)->gs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #  define set_user_gs(regs, v)		do { (regs)->gs = (v); } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #  define task_user_gs(tsk)		(task_pt_regs(tsk)->gs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #  define lazy_save_gs(v)		do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #  define lazy_load_gs(v)		do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) # endif	/* X86_32_LAZY_GS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #endif	/* X86_32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #endif /* !__ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #endif /* __KERNEL__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) #endif /* _ASM_X86_SEGMENT_H */