From b7fde43180bfc3941e6706b65f499f2a5a5e51d3 Mon Sep 17 00:00:00 2001 From: dfr Date: Sat, 29 Sep 2001 11:41:23 +0000 Subject: * Read parameters for ptc.e instruction from PAL Code. * Add pmap_unmapdev(). --- sys/ia64/ia64/pmap.c | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 194b3b5..9ec1766 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -118,6 +118,7 @@ #include +#include #include MALLOC_DEFINE(M_PMAP, "PMAP", "PMAP Structures"); @@ -204,11 +205,11 @@ vm_offset_t kernel_vm_end; /* * Values for ptc.e. XXX values for SKI. */ -static u_int64_t pmap_pte_e_base = 0x100000000; -static u_int64_t pmap_pte_e_count1 = 3; -static u_int64_t pmap_pte_e_count2 = 2; -static u_int64_t pmap_pte_e_stride1 = 0x2000; -static u_int64_t pmap_pte_e_stride2 = 0x100000000; +static u_int64_t pmap_ptc_e_base = 0x100000000; +static u_int64_t pmap_ptc_e_count1 = 3; +static u_int64_t pmap_ptc_e_count2 = 2; +static u_int64_t pmap_ptc_e_stride1 = 0x2000; +static u_int64_t pmap_ptc_e_stride2 = 0x100000000; /* * Data for the RID allocator @@ -270,6 +271,28 @@ void pmap_bootstrap() { int i; + struct ia64_pal_result res; + + /* + * Query the PAL Code to find the loop parameters for the + * ptc.e instruction. + */ + res = ia64_call_pal_static(PAL_PTCE_INFO, 0, 0, 0); + if (res.pal_status != 0) + panic("Can't configure ptc.e parameters"); + pmap_ptc_e_base = res.pal_result[0]; + pmap_ptc_e_count1 = res.pal_result[1] >> 32; + pmap_ptc_e_count2 = res.pal_result[1] & ((1L<<32) - 1); + pmap_ptc_e_stride1 = res.pal_result[2] >> 32; + pmap_ptc_e_stride2 = res.pal_result[2] & ((1L<<32) - 1); + if (bootverbose) + printf("ptc.e base=0x%lx, count1=%ld, count2=%ld, " + "stride1=0x%lx, stride2=0x%lx\n", + pmap_ptc_e_base, + pmap_ptc_e_count1, + pmap_ptc_e_count2, + pmap_ptc_e_stride1, + pmap_ptc_e_stride2); /* * Setup RIDs. We use the bits above pmap_ridbits for a @@ -420,13 +443,13 @@ pmap_invalidate_all(pmap_t pmap) ("invalidating TLB for non-current pmap")); psr = critical_enter(); - addr = pmap_pte_e_base; - for (i = 0; i < pmap_pte_e_count1; i++) { - for (j = 0; j < pmap_pte_e_count2; j++) { + addr = pmap_ptc_e_base; + for (i = 0; i < pmap_ptc_e_count1; i++) { + for (j = 0; j < pmap_ptc_e_count2; j++) { ia64_ptc_e(addr); - addr += pmap_pte_e_stride2; + addr += pmap_ptc_e_stride2; } - addr += pmap_pte_e_stride1; + addr += pmap_ptc_e_stride1; } critical_exit(psr); } @@ -2152,6 +2175,15 @@ pmap_mapdev(pa, size) } /* + * 'Unmap' a range mapped by pmap_mapdev(). + */ +void +pmap_unmapdev(vm_offset_t va, vm_size_t size) +{ + return; +} + +/* * perform the pmap work for mincore */ int -- cgit v1.1