pc64: check if vmap() range fits in VMAPLEN window, remove unneeded vmapsync(), rename fault386() to faultamd64()
This commit is contained in:
parent
78d2a52577
commit
1a782fda3e
3 changed files with 10 additions and 35 deletions
|
@ -180,7 +180,6 @@ void upafree(uintptr, int);
|
|||
void upareserve(uintptr, int);
|
||||
void vectortable(void);
|
||||
void* vmap(uintptr, int);
|
||||
int vmapsync(uintptr);
|
||||
void vunmap(void*, int);
|
||||
void wbinvd(void);
|
||||
int wrmsr(int, vlong);
|
||||
|
|
|
@ -506,6 +506,9 @@ kunmap(KMap *k)
|
|||
|
||||
/*
|
||||
* Add a device mapping to the vmap range.
|
||||
* note that the VMAP and KZERO PDPs are shared
|
||||
* between processors (see mpstartap) so no
|
||||
* synchronization is being done.
|
||||
*/
|
||||
void*
|
||||
vmap(uintptr pa, int size)
|
||||
|
@ -513,6 +516,8 @@ vmap(uintptr pa, int size)
|
|||
uintptr va;
|
||||
int o;
|
||||
|
||||
if(pa+size > VMAPSIZE)
|
||||
return 0;
|
||||
va = pa+VMAP;
|
||||
/*
|
||||
* might be asking for less than a page.
|
||||
|
@ -530,30 +535,3 @@ vunmap(void *v, int)
|
|||
{
|
||||
paddr(v); /* will panic on error */
|
||||
}
|
||||
|
||||
/*
|
||||
* vmapsync() is currently unused as the VMAP and KZERO PDPs
|
||||
* are shared between processors. (see mpstartap)
|
||||
*/
|
||||
int
|
||||
vmapsync(uintptr va)
|
||||
{
|
||||
uintptr *pte1, *pte2;
|
||||
int level;
|
||||
|
||||
if(va < VMAP || m->machno == 0)
|
||||
return 0;
|
||||
|
||||
for(level=0; level<2; level++){
|
||||
pte1 = mmuwalk(MACHP(0)->pml4, va, level, 0);
|
||||
if(pte1 && *pte1 & PTEVALID){
|
||||
pte2 = mmuwalk(m->pml4, va, level, 1);
|
||||
if(pte2 == 0)
|
||||
break;
|
||||
if(pte1 != pte2)
|
||||
*pte2 = *pte1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ static int trapinited;
|
|||
void noted(Ureg*, ulong);
|
||||
|
||||
static void debugbpt(Ureg*, void*);
|
||||
static void fault386(Ureg*, void*);
|
||||
static void faultamd64(Ureg*, void*);
|
||||
static void doublefault(Ureg*, void*);
|
||||
static void unexpected(Ureg*, void*);
|
||||
static void _dumpstack(Ureg*);
|
||||
|
@ -225,7 +225,7 @@ trapinit(void)
|
|||
* Syscall() is called directly without going through trap().
|
||||
*/
|
||||
trapenable(VectorBPT, debugbpt, 0, "debugpt");
|
||||
trapenable(VectorPF, fault386, 0, "fault386");
|
||||
trapenable(VectorPF, faultamd64, 0, "faultamd64");
|
||||
trapenable(Vector2F, doublefault, 0, "doublefault");
|
||||
trapenable(Vector15, unexpected, 0, "unexpected");
|
||||
nmienable();
|
||||
|
@ -315,9 +315,9 @@ trap(Ureg *ureg)
|
|||
Mach *mach;
|
||||
|
||||
if(!trapinited){
|
||||
/* fault386 can give a better error message */
|
||||
/* faultamd64 can give a better error message */
|
||||
if(ureg->type == VectorPF)
|
||||
fault386(ureg, nil);
|
||||
faultamd64(ureg, nil);
|
||||
panic("trap %llud: not ready", ureg->type);
|
||||
}
|
||||
|
||||
|
@ -614,7 +614,7 @@ unexpected(Ureg* ureg, void*)
|
|||
|
||||
extern void checkpages(void);
|
||||
static void
|
||||
fault386(Ureg* ureg, void*)
|
||||
faultamd64(Ureg* ureg, void*)
|
||||
{
|
||||
uintptr addr;
|
||||
int read, user, n, insyscall;
|
||||
|
@ -624,8 +624,6 @@ fault386(Ureg* ureg, void*)
|
|||
read = !(ureg->error & 2);
|
||||
user = userureg(ureg);
|
||||
if(!user){
|
||||
if(vmapsync(addr))
|
||||
return;
|
||||
if(addr >= USTKTOP)
|
||||
panic("kernel fault: bad address pc=%#p addr=%#p", ureg->pc, addr);
|
||||
if(up == nil)
|
||||
|
|
Loading…
Reference in a new issue