Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/asm: Always set A (accessed) flag in GDT descriptors

We have no known use for having the CPU track whether GDT descriptors
have been accessed or not.

Simplify the code by adding the flag to the common flags and removing
it everywhere else.

Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20231219151200.2878271-5-vegard.nossum@oracle.com

authored by

Vegard Nossum and committed by
Ingo Molnar
3b184b71 1445f6e1

+16 -16
+2 -2
arch/x86/boot/pm.c
··· 68 68 being 8-byte unaligned. Intel recommends 16 byte alignment. */ 69 69 static const u64 boot_gdt[] __attribute__((aligned(16))) = { 70 70 /* CS: code, read/execute, 4 GB, base 0 */ 71 - [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(DESC_CODE32 | _DESC_ACCESSED, 0, 0xfffff), 71 + [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(DESC_CODE32, 0, 0xfffff), 72 72 /* DS: data, read/write, 4 GB, base 0 */ 73 - [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(DESC_DATA32 | _DESC_ACCESSED, 0, 0xfffff), 73 + [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(DESC_DATA32, 0, 0xfffff), 74 74 /* TSS: 32-bit tss, 104 bytes, base 4096 */ 75 75 /* We only have a TSS here to keep Intel VT happy; 76 76 we don't actually use it for anything. */
+2 -2
arch/x86/include/asm/desc_defs.h
··· 37 37 * of flags 38 38 */ 39 39 40 - #define _DESC_DATA (_DESC_S | _DESC_PRESENT | \ 40 + #define _DESC_DATA (_DESC_S | _DESC_PRESENT | _DESC_ACCESSED | \ 41 41 _DESC_DATA_WRITABLE) 42 - #define _DESC_CODE (_DESC_S | _DESC_PRESENT | \ 42 + #define _DESC_CODE (_DESC_S | _DESC_PRESENT | _DESC_ACCESSED | \ 43 43 _DESC_CODE_READABLE | _DESC_CODE_EXECUTABLE) 44 44 45 45 #define DESC_DATA16 (_DESC_DATA)
+6 -6
arch/x86/kernel/cpu/common.c
··· 188 188 * TLS descriptors are currently at a different place compared to i386. 189 189 * Hopefully nobody expects them at a fixed place (Wine?) 190 190 */ 191 - [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32 | _DESC_ACCESSED, 0, 0xfffff), 192 - [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64 | _DESC_ACCESSED, 0, 0xfffff), 193 - [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA64 | _DESC_ACCESSED, 0, 0xfffff), 194 - [GDT_ENTRY_DEFAULT_USER32_CS] = GDT_ENTRY_INIT(DESC_CODE32 | DESC_USER | _DESC_ACCESSED, 0, 0xfffff), 195 - [GDT_ENTRY_DEFAULT_USER_DS] = GDT_ENTRY_INIT(DESC_DATA64 | DESC_USER | _DESC_ACCESSED, 0, 0xfffff), 196 - [GDT_ENTRY_DEFAULT_USER_CS] = GDT_ENTRY_INIT(DESC_CODE64 | DESC_USER | _DESC_ACCESSED, 0, 0xfffff), 191 + [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff), 192 + [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64, 0, 0xfffff), 193 + [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA64, 0, 0xfffff), 194 + [GDT_ENTRY_DEFAULT_USER32_CS] = GDT_ENTRY_INIT(DESC_CODE32 | DESC_USER, 0, 0xfffff), 195 + [GDT_ENTRY_DEFAULT_USER_DS] = GDT_ENTRY_INIT(DESC_DATA64 | DESC_USER, 0, 0xfffff), 196 + [GDT_ENTRY_DEFAULT_USER_CS] = GDT_ENTRY_INIT(DESC_CODE64 | DESC_USER, 0, 0xfffff), 197 197 #else 198 198 [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff), 199 199 [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA32, 0, 0xfffff),
+3 -3
arch/x86/kernel/head64.c
··· 71 71 * GDT used on the boot CPU before switching to virtual addresses. 72 72 */ 73 73 static struct desc_struct startup_gdt[GDT_ENTRIES] __initdata = { 74 - [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32 | _DESC_ACCESSED, 0, 0xfffff), 75 - [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64 | _DESC_ACCESSED, 0, 0xfffff), 76 - [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA64 | _DESC_ACCESSED, 0, 0xfffff), 74 + [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff), 75 + [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64, 0, 0xfffff), 76 + [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA64, 0, 0xfffff), 77 77 }; 78 78 79 79 /*
+1 -1
arch/x86/realmode/rm/reboot.S
··· 154 154 * base value 0x100; since this is consistent with real mode 155 155 * semantics we don't have to reload the segments once CR0.PE = 0. 156 156 */ 157 - .quad GDT_ENTRY(DESC_DATA16 | _DESC_ACCESSED, 0x100, 0xffff) 157 + .quad GDT_ENTRY(DESC_DATA16, 0x100, 0xffff) 158 158 SYM_DATA_END(machine_real_restart_gdt)
+2 -2
drivers/firmware/efi/libstub/x86-5lvl.c
··· 13 13 static void (*la57_toggle)(void *cr3); 14 14 15 15 static const struct desc_struct gdt[] = { 16 - [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32 | _DESC_ACCESSED, 0, 0xfffff), 17 - [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64 | _DESC_ACCESSED, 0, 0xfffff), 16 + [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff), 17 + [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE64, 0, 0xfffff), 18 18 }; 19 19 20 20 /*