~mcf/plan9front

91de99bee99f23f9911edfc6061598c52b76191b — 5 months ago 83a1121
pc64: avoid getcr3() in mmuflushtlb()

it turns out that calculating physical address of pml4 is faster
than reading the machine register, so pass it explicitely.
3 files changed, 4 insertions(+), 4 deletions(-)

M sys/src/9/pc64/fns.h
M sys/src/9/pc64/main.c
M sys/src/9/pc64/mmu.c
M sys/src/9/pc64/fns.h => sys/src/9/pc64/fns.h +1 -1
@@ 96,7 96,7 @@ void	meminit(void);
void	meminit0(void);
void	memreserve(uintptr, uintptr);
void	mfence(void);
#define mmuflushtlb() putcr3(getcr3())
#define mmuflushtlb(pml4) putcr3(pml4)
void	mmuinit(void);
uintptr	*mmuwalk(uintptr*, uintptr, int, int);
char*	mtrr(uvlong, uvlong, char *);

M sys/src/9/pc64/main.c => sys/src/9/pc64/main.c +2 -2
@@ 239,7 239,7 @@ rebootjump(uintptr entry, uintptr code, ulong size)
	if((pte = mmuwalk(m->pml4, REBOOTADDR, 0, 0)) != nil)
		*pte &= ~PTENOEXEC;

	mmuflushtlb();
	mmuflushtlb(PADDR(m->pml4));

	/* setup reboot trampoline function */
	f = (void*)REBOOTADDR;


@@ 350,5 350,5 @@ procsave(Proc *p)
	 * You might think it would be a win not to do this in that case,
	 * especially on VMware, but it turns out not to matter.
	 */
	mmuflushtlb();
	mmuflushtlb(PADDR(m->pml4));
}

M sys/src/9/pc64/mmu.c => sys/src/9/pc64/mmu.c +1 -1
@@ 67,7 67,7 @@ taskswitch(uintptr stack)
	tss->rsp1[1] = stack >> 32;
	tss->rsp2[0] = (u32int)stack;
	tss->rsp2[1] = stack >> 32;
	mmuflushtlb();
	mmuflushtlb(PADDR(m->pml4));
}

static void kernelro(void);