typedef __uint32_t pt_entry_t;
typedef __uint32_t cpumask_t; /* mask representing a set of cpus */
+#define CPUMASK(cpu) (1U << (cpu))
+#define BSRCPUMASK(mask) bsrl(mask)
+
#define PDESIZE sizeof(pd_entry_t) /* for assembly files */
#define PTESIZE sizeof(pt_entry_t) /* for assembly files */
* Use SMP_MAXCPU instead of MAXCPU for structures that are intended to
* remain compatible between UP and SMP builds.
*/
-#define SMP_MAXCPU 16
+#define SMP_MAXCPU 31
#ifdef SMP
#define MAXCPU SMP_MAXCPU
#else
#endif
typedef __uint32_t cpumask_t; /* mask representing a set of cpus */
+#define CPUMASK(cpu) ((__uint32_t)1 << (cpu))
+#define BSRCPUMASK(mask) bsrq(mask)
+
#define PML4SIZE sizeof(pml4_entry_t) /* for assembly files */
#define PDPSIZE sizeof(pdp_entry_t) /* for assembly files */
#define PDESIZE sizeof(pd_entry_t) /* for assembly files */
* No requirements.
*/
void *
-pmap_kenter_temporary(vm_paddr_t pa, int i)
+pmap_kenter_temporary(vm_paddr_t pa, long i)
{
pmap_kenter((vm_offset_t)crashdumpmap + (i * PAGE_SIZE), pa);
return ((void *)crashdumpmap);
if (Maxmem > atop(physmap[physmap_idx + 1]))
Maxmem = atop(physmap[physmap_idx + 1]);
+ /*
+ *
+ */
+ if (Maxmem > atop(DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS)) {
+ kprintf("Limiting Maxmem due to DMAP size\n");
+ Maxmem = atop(DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS);
+ }
+
if (atop(physmap[physmap_idx + 1]) != Maxmem &&
(boothowto & RB_VERBOSE))
kprintf("Physical memory use set to %ldK\n", Maxmem * 4);
#endif
extern int nkpt;
-u_int32_t cpu_apic_versions[MAXCPU];
+u_int32_t cpu_apic_versions[NAPICID]; /* populated during mptable scan */
int64_t tsc0_offset;
extern int64_t tsc_offsets[];
if (apic_io_enable) {
for (x = 0; x < mp_napics; ++x) {
kprintf(" io%d (APIC): apic id: %2d", x, IO_TO_ID(x));
+ kprintf("napics %d versions %p address %p\n", mp_napics, io_apic_versions, io_apic_address);
kprintf(", version: 0x%08x", io_apic_versions[x]);
kprintf(", at 0x%08lx\n", io_apic_address[x]);
}
MALLOC(bus_data, bus_datum *, sizeof(bus_datum) * mp_nbusses,
M_DEVBUF, M_WAITOK);
+ kprintf("xapics %d versions %p address %p\n", mp_napics, io_apic_versions, io_apic_address);
+
for (x = 0; x < mp_napics; x++)
ioapic[x] = permanent_io_mapping(io_apic_address[x]);
if (mp_naps > MAXCPU) {
kprintf("Warning: only using %d of %d available CPUs!\n",
MAXCPU, mp_naps);
+ DELAY(1000000);
mp_naps = MAXCPU;
}
}
static uint64_t
-allocpages(vm_paddr_t *firstaddr, int n)
+allocpages(vm_paddr_t *firstaddr, long n)
{
uint64_t ret;
void
create_pagetables(vm_paddr_t *firstaddr)
{
- int i;
+ long i; /* must be 64 bits */
/*
* We are running (mostly) V=P at this point
ndmpdp = 4;
nkpt = (Maxmem * sizeof(struct vm_page) + NBPDR - 1) / NBPDR;
+ nkpt += (Maxmem * sizeof(struct pv_entry) + NBPDR - 1) / NBPDR;
nkpt += ((nkpt + nkpt + 1 + NKPML4E + NKPDPE + NDMPML4E + ndmpdp) +
511) / 512;
nkpt += 128;
/* Preset PG_M and PG_A because demotion expects it */
if ((amd_feature & AMDID_PAGE1GB) == 0) {
for (i = 0; i < NPDEPG * ndmpdp; i++) {
- ((pd_entry_t *)DMPDphys)[i] = (vm_paddr_t)i << PDRSHIFT;
+ ((pd_entry_t *)DMPDphys)[i] = i << PDRSHIFT;
((pd_entry_t *)DMPDphys)[i] |= PG_RW | PG_V | PG_PS |
PG_G | PG_M | PG_A;
}
va = va_start;
while (start < end) {
+ if ((start / PAGE_SIZE & 15) == 0)
+ kprintf("%p %p\n", (void *)va, (void *)start);
pmap_kenter_quick(va, start);
va += PAGE_SIZE;
start += PAGE_SIZE;
*/
/* JG Needed on x86_64? */
void *
-pmap_kenter_temporary(vm_paddr_t pa, int i)
+pmap_kenter_temporary(vm_paddr_t pa, long i)
{
pmap_kenter((vm_offset_t)crashdumpmap + (i * PAGE_SIZE), pa);
return ((void *)crashdumpmap);
* to be used for panic dumps.
*/
void *
-pmap_kenter_temporary(vm_paddr_t pa, int i)
+pmap_kenter_temporary(vm_paddr_t pa, long i)
{
pmap_kenter(crashdumpmap + (i * PAGE_SIZE), pa);
return ((void *)crashdumpmap);
* to be used for panic dumps.
*/
void *
-pmap_kenter_temporary(vm_paddr_t pa, int i)
+pmap_kenter_temporary(vm_paddr_t pa, long i)
{
pmap_kenter(crashdumpmap + (i * PAGE_SIZE), pa);
return ((void *)crashdumpmap);
void pmap_setlwpvm (struct lwp *, struct vmspace *);
vm_offset_t pmap_addr_hint (vm_object_t obj, vm_offset_t addr, vm_size_t size);
-void *pmap_kenter_temporary (vm_paddr_t pa, int i);
+void *pmap_kenter_temporary (vm_paddr_t pa, long i);
void pmap_init2 (void);
struct vm_page *pmap_kvtom(vm_offset_t va);
}
};
-#define VMEPERCPU 2
+/*
+ * per-cpu page table cross mappings are initialized in early boot
+ * and might require a considerable number of vm_map_entry structures.
+ */
+#define VMEPERCPU (MAXCPU+1)
static struct vm_zone mapentzone_store, mapzone_store;
static vm_zone_t mapentzone, mapzone;
* during boot to bootstrap the VM system.
*/
#define MAX_KMAP 10
-#define MAX_MAPENT 256
+#define MAX_MAPENT 2048 /* required to support up to 64 cpus */
/*
* Copy-on-write flags for vm_map operations