Skip to content

Commit b74dd0b

Browse files
committed
Use the global bit to avoid flushing read-only pages
1 parent 288246d commit b74dd0b

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

lib/tinykvm/amd64/paging.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,12 @@ uint64_t setup_amd64_paging(vMemory& memory,
178178
lowpage[0] = 0; /* Null-page at PHYS+0x0 */
179179
/* GDT, IDT and TSS */
180180
lowpage[1] = PDE64_PRESENT | PDE64_RW | PDE64_NX | (memory.physbase + 0x1000);
181-
lowpage[6] = PDE64_PRESENT | PDE64_NX | (memory.physbase + VSYS_ADDR);
182-
lowpage[7] = PDE64_PRESENT | PDE64_NX | (memory.physbase + TSS_SMP_ADDR);
181+
lowpage[6] = PDE64_PRESENT | PDE64_G | PDE64_NX | (memory.physbase + VSYS_ADDR);
182+
lowpage[7] = PDE64_PRESENT | PDE64_G | PDE64_NX | (memory.physbase + TSS_SMP_ADDR);
183183

184184
/* Kernel code: Exceptions, system calls */
185185
const uint64_t except_page = INTR_ASM_ADDR >> 12;
186-
lowpage[except_page] = PDE64_PRESENT | (memory.physbase + INTR_ASM_ADDR);
186+
lowpage[except_page] = PDE64_PRESENT | PDE64_G | (memory.physbase + INTR_ASM_ADDR);
187187

188188
/* Exception (IST) stack */
189189
const uint64_t ist_page = IST_ADDR >> 12;
@@ -192,7 +192,7 @@ uint64_t setup_amd64_paging(vMemory& memory,
192192

193193
/* Usercode page: Entry, exit */
194194
const uint64_t user_page = USER_ASM_ADDR >> 12;
195-
lowpage[user_page] = PDE64_PRESENT | PDE64_USER | (memory.physbase + USER_ASM_ADDR);
195+
lowpage[user_page] = PDE64_PRESENT | PDE64_USER | PDE64_G | (memory.physbase + USER_ASM_ADDR);
196196

197197
/* Initial userspace area (no execute) */
198198
pd[base_2mb_page+1] = PDE64_PRESENT | PDE64_USER | PDE64_RW | free_page;
@@ -263,6 +263,7 @@ uint64_t setup_amd64_paging(vMemory& memory,
263263
ptentry = PDE64_PRESENT | PDE64_USER | PDE64_NX | PDE64_PS | addr2m;
264264
if (!read) ptentry &= ~PDE64_PRESENT; // A weird one, but... AMD64.
265265
if (write) ptentry |= PDE64_RW;
266+
else ptentry |= PDE64_G; // Global bit for read-only pages
266267
if (exec) ptentry &= ~PDE64_NX;
267268
// Increment whole 2MB page
268269
addr += (1UL << 21);
@@ -302,7 +303,10 @@ uint64_t setup_amd64_paging(vMemory& memory,
302303
else
303304
ptentry |= PDE64_NX;
304305
if (!read) ptentry &= ~PDE64_PRESENT;
305-
if (!write) ptentry &= ~PDE64_RW;
306+
if (!write) {
307+
ptentry &= ~PDE64_RW;
308+
ptentry |= PDE64_G; // Global bit for read-only pages
309+
}
306310
addr += 0x1000;
307311
}
308312
}

0 commit comments

Comments
 (0)