if (cpu_apic_address == 0)
panic("pmap_bootstrap: no local apic!");
+#if JGPMAP32
/* local apic is mapped on last page */
SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N | pgeflag |
(cpu_apic_address & PG_FRAME));
#endif
+#endif
/*
* We need to finish setting up the globaldata page for the BSP.
* Now it is safe to enable pv_table recording.
*/
pmap_initialized = TRUE;
+ lapic = pmap_mapdev_uncacheable(cpu_apic_address, sizeof(struct LAPIC));
}
/*
return ((void *)(va + offset));
}
+void *
+pmap_mapdev_uncacheable(vm_paddr_t pa, vm_size_t size)
+READY1
+{
+ vm_offset_t va, tmpva, offset;
+ pt_entry_t *pte;
+
+ offset = pa & PAGE_MASK;
+ size = roundup(offset + size, PAGE_SIZE);
+
+ va = kmem_alloc_nofault(&kernel_map, size);
+ if (va == 0)
+ panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
+
+ pa = pa & ~PAGE_MASK;
+ for (tmpva = va; size > 0;) {
+ pte = vtopte(tmpva);
+ *pte = pa | PG_RW | PG_V | PG_N; /* | pgeflag; */
+ size -= PAGE_SIZE;
+ tmpva += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ }
+ cpu_invltlb();
+ smp_invltlb();
+
+ return ((void *)(va + offset));
+}
+
void
pmap_unmapdev(vm_offset_t va, vm_size_t size)
READY1
void pmap_bootstrap ( vm_paddr_t *);
void *pmap_mapdev (vm_paddr_t, vm_size_t);
+void *pmap_mapdev_uncacheable(vm_paddr_t, vm_size_t);
void pmap_unmapdev (vm_offset_t, vm_size_t);
#if JG
pt_entry_t *pmap_pte (pmap_t, vm_offset_t) __pure2;