summaryrefslogtreecommitdiff
path: root/sys/src/9/pc64/mmu.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-08-27 03:55:12 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-08-27 03:55:12 +0200
commit1e773c97e79d74983edd9b46694956f76b0c7fd5 (patch)
tree11ca8f835528c02337e7d376916ef3dabf1050e2 /sys/src/9/pc64/mmu.c
parent49411b2ca15b94b6631fd54d2576c5aeff63eb67 (diff)
pc64: implement NX bit discovery, map kernel mappings no-execute
Diffstat (limited to 'sys/src/9/pc64/mmu.c')
-rw-r--r--sys/src/9/pc64/mmu.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c
index dfb165ef5..6db61bf00 100644
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -116,23 +116,18 @@ mmuinit(void)
taskswitch((uintptr)m + MACHSIZE);
ltr(TSSSEL);
- wrmsr(0xc0000100, 0ull); /* 64 bit fsbase */
- wrmsr(0xc0000101, (uvlong)&machp[m->machno]); /* 64 bit gsbase */
- wrmsr(0xc0000102, 0ull); /* kernel gs base */
+ wrmsr(FSbase, 0ull);
+ wrmsr(GSbase, (uvlong)&machp[m->machno]);
+ wrmsr(KernelGSbase, 0ull);
/* enable syscall extension */
- rdmsr(0xc0000080, &v);
+ rdmsr(Efer, &v);
v |= 1ull;
- wrmsr(0xc0000080, v);
+ wrmsr(Efer, v);
- /* IA32_STAR */
- wrmsr(0xc0000081, ((uvlong)UE32SEL << 48) | ((uvlong)KESEL << 32));
-
- /* IA32_LSTAR */
- wrmsr(0xc0000082, (uvlong)syscallentry);
-
- /* SYSCALL flags mask */
- wrmsr(0xc0000084, 0x200);
+ wrmsr(Star, ((uvlong)UE32SEL << 48) | ((uvlong)KESEL << 32));
+ wrmsr(Lstar, (uvlong)syscallentry);
+ wrmsr(Sfmask, 0x200);
/* IA32_PAT write combining */
if((MACHP(0)->cpuiddx & Pat) != 0
@@ -443,7 +438,7 @@ putmmu(uintptr va, uintptr pa, Page *)
if(pte == 0)
panic("putmmu: bug: va=%#p pa=%#p", va, pa);
old = *pte;
- *pte = pa | PTEVALID|PTEUSER;
+ *pte = pa | PTEUSER;
splx(x);
if(old & PTEVALID)
invlpg(va);
@@ -487,7 +482,7 @@ kmap(Page *page)
pte = mmuwalk(m->pml4, va, 0, 1);
if(pte == 0 || (*pte & PTEVALID) != 0)
panic("kmap: pa=%#p va=%#p", pa, va);
- *pte = pa | PTEWRITE|PTEVALID;
+ *pte = pa | PTEWRITE|PTENOEXEC|PTEVALID;
splx(x);
invlpg(va);
return (KMap*)va;
@@ -533,7 +528,7 @@ vmap(uintptr pa, int size)
pa -= o;
va -= o;
size += o;
- pmap(m->pml4, pa | PTEUNCACHED|PTEWRITE|PTEVALID, va, size);
+ pmap(m->pml4, pa | PTEUNCACHED|PTEWRITE|PTENOEXEC|PTEVALID, va, size);
return (void*)(va+o);
}
@@ -616,7 +611,7 @@ preallocpages(void)
pm->npage = (top - pm->base)/BY2PG;
va = base + VMAP;
- pmap(m->pml4, base | PTEGLOBAL|PTEWRITE|PTEVALID, va, psize);
+ pmap(m->pml4, base | PTEGLOBAL|PTEWRITE|PTENOEXEC|PTEVALID, va, psize);
palloc.pages = (void*)(va + tsize);