summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/devvmx.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-06-25 22:57:47 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-06-25 22:57:47 +0200
commit63b8965b42aa0ba7909494e13de6913dc88bd93e (patch)
tree7152ab4275fd39338b7e18d4d278213ff00e79d6 /sys/src/9/pc/devvmx.c
parentaab4e32ce05a26bff7386bb86ffc24589cbe601c (diff)
devvmx: add support for SG_STICKY segments
Diffstat (limited to 'sys/src/9/pc/devvmx.c')
-rw-r--r--sys/src/9/pc/devvmx.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/sys/src/9/pc/devvmx.c b/sys/src/9/pc/devvmx.c
index 4e6e7412d..530ad54db 100644
--- a/sys/src/9/pc/devvmx.c
+++ b/sys/src/9/pc/devvmx.c
@@ -621,18 +621,26 @@ eptfree(uvlong *tab, int level)
static void
epttranslate(VmMem *mp)
{
- uvlong p, hpa;
+ uvlong p, v;
- if(mp->seg != nil && (mp->seg->type & SG_TYPE) != SG_FIXED || (mp->lo & 0xfff) != 0 || (mp->hi & 0xfff) != 0 || (uint)mp->attr >= 0x1000)
+ if((mp->lo & 0xfff) != 0 || (mp->hi & 0xfff) != 0 || (uint)mp->attr >= 0x1000)
error(Egreg);
if(mp->seg != nil){
+ switch(mp->seg->type & SG_TYPE){
+ default:
+ error(Egreg);
+ case SG_FIXED:
+ case SG_STICKY:
+ break;
+ }
if(mp->seg->base + mp->off + (mp->hi - mp->lo) > mp->seg->top)
error(Egreg);
- hpa = mp->seg->map[0]->pages[0]->pa + mp->off;
- }else
- hpa = 0;
- for(p = mp->lo; p < mp->hi; p += BY2PG)
- *eptwalk(p) = hpa + (p - mp->lo) + mp->attr;
+ for(p = mp->lo, v = mp->off; p < mp->hi; p += BY2PG, v += BY2PG)
+ *eptwalk(p) = mp->seg->map[v/PTEMAPMEM]->pages[(v & PTEMAPMEM-1)/BY2PG]->pa | mp->attr;
+ }else {
+ for(p = mp->lo; p < mp->hi; p += BY2PG)
+ *eptwalk(p) = mp->attr;
+ }
vmx.onentry |= FLUSHEPT;
}