diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-08-27 03:55:12 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-08-27 03:55:12 +0200 |
commit | 1e773c97e79d74983edd9b46694956f76b0c7fd5 (patch) | |
tree | 11ca8f835528c02337e7d376916ef3dabf1050e2 /sys/src/9/pc64/mmu.c | |
parent | 49411b2ca15b94b6631fd54d2576c5aeff63eb67 (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.c | 29 |
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); |