@@ -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