Skip to content

Commit 3b184b7

Browse files
vegardingomolnar
authored andcommitted
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
1 parent 1445f6e commit 3b184b7

6 files changed

Lines changed: 16 additions & 16 deletions

File tree

arch/x86/boot/pm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ static void setup_gdt(void)
6868
being 8-byte unaligned. Intel recommends 16 byte alignment. */
6969
static const u64 boot_gdt[] __attribute__((aligned(16))) = {
7070
/* 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),
7272
/* 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),
7474
/* TSS: 32-bit tss, 104 bytes, base 4096 */
7575
/* We only have a TSS here to keep Intel VT happy;
7676
we don't actually use it for anything. */

arch/x86/include/asm/desc_defs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
* of flags
3838
*/
3939

40-
#define _DESC_DATA (_DESC_S | _DESC_PRESENT | \
40+
#define _DESC_DATA (_DESC_S | _DESC_PRESENT | _DESC_ACCESSED | \
4141
_DESC_DATA_WRITABLE)
42-
#define _DESC_CODE (_DESC_S | _DESC_PRESENT | \
42+
#define _DESC_CODE (_DESC_S | _DESC_PRESENT | _DESC_ACCESSED | \
4343
_DESC_CODE_READABLE | _DESC_CODE_EXECUTABLE)
4444

4545
#define DESC_DATA16 (_DESC_DATA)

arch/x86/kernel/cpu/common.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
188188
* TLS descriptors are currently at a different place compared to i386.
189189
* Hopefully nobody expects them at a fixed place (Wine?)
190190
*/
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),
197197
#else
198198
[GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(DESC_CODE32, 0, 0xfffff),
199199
[GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(DESC_DATA32, 0, 0xfffff),

arch/x86/kernel/head64.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ EXPORT_SYMBOL(vmemmap_base);
7171
* GDT used on the boot CPU before switching to virtual addresses.
7272
*/
7373
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),
7777
};
7878

7979
/*

arch/x86/realmode/rm/reboot.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,5 @@ SYM_DATA_START(machine_real_restart_gdt)
154154
* base value 0x100; since this is consistent with real mode
155155
* semantics we don't have to reload the segments once CR0.PE = 0.
156156
*/
157-
.quad GDT_ENTRY(DESC_DATA16 | _DESC_ACCESSED, 0x100, 0xffff)
157+
.quad GDT_ENTRY(DESC_DATA16, 0x100, 0xffff)
158158
SYM_DATA_END(machine_real_restart_gdt)

drivers/firmware/efi/libstub/x86-5lvl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ bool efi_no5lvl;
1313
static void (*la57_toggle)(void *cr3);
1414

1515
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),
1818
};
1919

2020
/*

0 commit comments

Comments
 (0)