Extend Book-E to support >4GB RAM

Summary:
With some additional changes for AIM, that could also support much
larger physmem sizes.  Given that 32-bit AIM is more or less obsolete, though,
it's not worth it at this time.

Differential Revision: https://reviews.freebsd.org/D4345
This commit is contained in:
Justin Hibbits 2015-12-24 04:30:15 +00:00
parent 1e86840331
commit b3936ebe07
9 changed files with 41 additions and 36 deletions

View File

@ -1024,12 +1024,13 @@ pte_find(mmu_t mmu, pmap_t pmap, vm_offset_t va)
static void
mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
{
vm_offset_t phys_kernelend;
vm_paddr_t phys_kernelend;
struct mem_region *mp, *mp1;
int cnt, i, j;
u_int s, e, sz;
vm_paddr_t s, e, sz;
vm_paddr_t physsz, hwphyssz;
u_int phys_avail_count;
vm_size_t physsz, hwphyssz, kstack0_sz;
vm_size_t kstack0_sz;
vm_offset_t kernel_pdir, kstack0, va;
vm_paddr_t kstack0_phys;
void *dpcpu;
@ -1163,7 +1164,7 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
for (mp = availmem_regions; mp->mr_size; mp++) {
s = mp->mr_start;
e = mp->mr_start + mp->mr_size;
debugf(" %08x-%08x -> ", s, e);
debugf(" %09jx-%09jx -> ", (uintmax_t)s, (uintmax_t)e);
/* Check whether this region holds all of the kernel. */
if (s < kernload && e > phys_kernelend) {
availmem_regions[cnt].mr_start = phys_kernelend;
@ -1188,7 +1189,8 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
if (e < s)
e = s;
sz = e - s;
debugf("%08x-%08x = %x\n", s, e, sz);
debugf("%09jx-%09jx = %jx\n",
(uintmax_t)s, (uintmax_t)e, (uintmax_t)sz);
/* Check whether some memory is left here. */
if (sz == 0) {
@ -1237,10 +1239,10 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
for (i = 0, j = 0; i < availmem_regions_sz; i++, j += 2) {
debugf(" region: 0x%jx - 0x%jx (0x%jx)\n",
availmem_regions[i].mr_start,
availmem_regions[i].mr_start +
(uintmax_t)availmem_regions[i].mr_start,
(uintmax_t)availmem_regions[i].mr_start +
availmem_regions[i].mr_size,
availmem_regions[i].mr_size);
(uintmax_t)availmem_regions[i].mr_size);
if (hwphyssz != 0 &&
(physsz + availmem_regions[i].mr_size) >= hwphyssz) {

View File

@ -98,7 +98,7 @@
#define PAGE_SHIFT 12
#define PAGE_SIZE (1L << PAGE_SHIFT) /* Page size */
#define PAGE_MASK (vm_offset_t)(PAGE_SIZE - 1)
#define PAGE_MASK (PAGE_SIZE - 1)
#define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t)))
#define MAXPAGESIZES 1 /* maximum number of supported page sizes */
@ -116,15 +116,17 @@
/*
* Mach derived conversion macros
*/
#define trunc_page(x) ((unsigned long)(x) & ~(PAGE_MASK))
#define trunc_page(x) ((x) & ~(PAGE_MASK))
#define round_page(x) (((x) + PAGE_MASK) & ~PAGE_MASK)
#define atop(x) ((unsigned long)(x) >> PAGE_SHIFT)
#define ptoa(x) ((unsigned long)(x) << PAGE_SHIFT)
#define atop(x) ((x) >> PAGE_SHIFT)
#define ptoa(x) ((x) << PAGE_SHIFT)
#define powerpc_btop(x) ((unsigned long)(x) >> PAGE_SHIFT)
#define powerpc_ptob(x) ((unsigned long)(x) << PAGE_SHIFT)
#define powerpc_btop(x) ((x) >> PAGE_SHIFT)
#define powerpc_ptob(x) ((x) << PAGE_SHIFT)
#define pgtok(x) ((x) * (PAGE_SIZE / 1024UL))
#define btoc(x) ((vm_offset_t)(((x)+PAGE_MASK)>>PAGE_SHIFT))
#endif /* !_POWERPC_INCLUDE_PARAM_H_ */

View File

@ -39,8 +39,8 @@
#include <machine/pcpu.h>
struct mem_region {
vm_offset_t mr_start;
vm_size_t mr_size;
uint64_t mr_start;
uint64_t mr_size;
};
void mem_regions(struct mem_region **, int *, struct mem_region **, int *);

View File

@ -250,7 +250,7 @@ boolean_t pmap_mmu_install(char *name, int prio);
* For more Ram increase the lmb or this value.
*/
extern vm_offset_t phys_avail[PHYS_AVAIL_SZ];
extern vm_paddr_t phys_avail[PHYS_AVAIL_SZ];
extern vm_offset_t virtual_avail;
extern vm_offset_t virtual_end;

View File

@ -172,8 +172,8 @@ parse_ofw_memory(phandle_t node, const char *prop, struct mem_region *output)
i = 0;
j = 0;
while (i < sz/sizeof(cell_t)) {
#ifndef __powerpc64__
/* On 32-bit PPC, ignore regions starting above 4 GB */
#if !defined(__powerpc64__) && !defined(BOOKE)
/* On 32-bit PPC (OEA), ignore regions starting above 4 GB */
if (address_cells > 1 && OFmem[i] > 0) {
i += address_cells + size_cells;
continue;
@ -182,21 +182,18 @@ parse_ofw_memory(phandle_t node, const char *prop, struct mem_region *output)
output[j].mr_start = OFmem[i++];
if (address_cells == 2) {
#ifdef __powerpc64__
output[j].mr_start <<= 32;
#endif
output[j].mr_start += OFmem[i++];
}
output[j].mr_size = OFmem[i++];
if (size_cells == 2) {
#ifdef __powerpc64__
output[j].mr_size <<= 32;
#endif
output[j].mr_size += OFmem[i++];
}
#ifndef __powerpc64__
#if !defined(__powerpc64__) && !defined(BOOKE)
/* Book-E can support 36-bit addresses. */
/*
* Check for memory regions extending above 32-bit
* memory space, and restrict them to stay there.

View File

@ -176,8 +176,8 @@ cpu_startup(void *dummy)
#ifdef PERFMON
perfmon_init();
#endif
printf("real memory = %lu (%lu MB)\n", ptoa(physmem),
ptoa(physmem) / 1048576);
printf("real memory = %ju (%ju MB)\n", ptoa((uintmax_t)physmem),
ptoa((uintmax_t)physmem) / 1048576);
realmem = physmem;
if (bootverbose)
@ -193,23 +193,25 @@ cpu_startup(void *dummy)
printf("Physical memory chunk(s):\n");
for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
vm_offset_t size1 =
vm_paddr_t size1 =
phys_avail[indx + 1] - phys_avail[indx];
#ifdef __powerpc64__
printf("0x%016lx - 0x%016lx, %ld bytes (%ld pages)\n",
printf("0x%016jx - 0x%016jx, %jd bytes (%jd pages)\n",
#else
printf("0x%08x - 0x%08x, %u bytes (%lu pages)\n",
printf("0x%09jx - 0x%09jx, %ju bytes (%ju pages)\n",
#endif
phys_avail[indx], phys_avail[indx + 1] - 1, size1,
size1 / PAGE_SIZE);
(uintmax_t)phys_avail[indx],
(uintmax_t)phys_avail[indx + 1] - 1,
(uintmax_t)size1, (uintmax_t)size1 / PAGE_SIZE);
}
}
vm_ksubmap_init(&kmi);
printf("avail memory = %lu (%lu MB)\n", ptoa(vm_cnt.v_free_count),
ptoa(vm_cnt.v_free_count) / 1048576);
printf("avail memory = %ju (%ju MB)\n",
ptoa((uintmax_t)vm_cnt.v_free_count),
ptoa((uintmax_t)vm_cnt.v_free_count) / 1048576);
/*
* Set up buffers, so they can be used to read disk labels.

View File

@ -86,8 +86,8 @@ static void
memr_merge(struct mem_region *from, struct mem_region *to)
{
vm_offset_t end;
end = ulmax(to->mr_start + to->mr_size, from->mr_start + from->mr_size);
to->mr_start = ulmin(from->mr_start, to->mr_start);
end = uqmax(to->mr_start + to->mr_size, from->mr_start + from->mr_size);
to->mr_start = uqmin(from->mr_start, to->mr_start);
to->mr_size = end - to->mr_start;
}

View File

@ -74,7 +74,7 @@ struct msgbuf *msgbufp;
vm_offset_t msgbuf_phys;
vm_offset_t kernel_vm_end;
vm_offset_t phys_avail[PHYS_AVAIL_SZ];
vm_paddr_t phys_avail[PHYS_AVAIL_SZ];
vm_offset_t virtual_avail;
vm_offset_t virtual_end;

View File

@ -61,6 +61,8 @@ static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
static __inline u_quad_t uqmax(u_quad_t a, u_quad_t b) { return (a > b ? a : b); }
static __inline u_quad_t uqmin(u_quad_t a, u_quad_t b) { return (a < b ? a : b); }
static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
static __inline off_t omax(off_t a, off_t b) { return (a > b ? a : b); }