summaryrefslogtreecommitdiffstats
path: root/sys/pc98
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2005-06-30 15:26:03 +0000
committernyan <nyan@FreeBSD.org>2005-06-30 15:26:03 +0000
commitb2cdc9829c5095d94c17cf3a6c205aca4ee68826 (patch)
tree1647873ca5ac2831299245daf0f1f5c0fdd323f9 /sys/pc98
parent91497131843ba561d97db47ccb225083d5ce3df3 (diff)
downloadFreeBSD-src-b2cdc9829c5095d94c17cf3a6c205aca4ee68826.zip
FreeBSD-src-b2cdc9829c5095d94c17cf3a6c205aca4ee68826.tar.gz
MFi386: revision 1.615 (change kernel crashdump format to ELF).
Approved by: re (scottl)
Diffstat (limited to 'sys/pc98')
-rw-r--r--sys/pc98/pc98/machdep.c58
1 files changed, 38 insertions, 20 deletions
diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c
index 75fcc65..fa9c058 100644
--- a/sys/pc98/pc98/machdep.c
+++ b/sys/pc98/pc98/machdep.c
@@ -191,9 +191,11 @@ long Maxmem = 0;
long realmem = 0;
vm_paddr_t phys_avail[10];
+vm_paddr_t dump_avail[10];
/* must be 2 less so 0 0 can signal end of chunks */
-#define PHYS_AVAIL_ARRAY_END ((sizeof(phys_avail) / sizeof(vm_offset_t)) - 2)
+#define PHYS_AVAIL_ARRAY_END ((sizeof(phys_avail) / sizeof(phys_avail[0])) - 2)
+#define DUMP_AVAIL_ARRAY_END ((sizeof(dump_avail) / sizeof(dump_avail[0])) - 2)
struct kva_md_info kmi;
@@ -1617,13 +1619,16 @@ sdtossd(sd, ssd)
static void
getmemsize(int first)
{
- int i, physmap_idx, pa_indx, pg_n;
+ int i, physmap_idx, pa_indx, da_indx;
+ int pg_n;
u_long physmem_tunable;
u_int extmem, under16;
- vm_offset_t pa, physmap[PHYSMAP_SIZE];
+ vm_paddr_t pa, physmap[PHYSMAP_SIZE];
pt_entry_t *pte;
quad_t dcons_addr, dcons_size;
+ bzero(physmap, sizeof(physmap));
+
/* XXX - some of EPSON machines can't use PG_N */
pg_n = PG_N;
if (pc98_machine_type & M_EPSON_PC98) {
@@ -1638,7 +1643,6 @@ getmemsize(int first)
break;
}
}
- bzero(physmap, sizeof(physmap));
/*
* Perform "base memory" related probes & setup
@@ -1745,8 +1749,10 @@ getmemsize(int first)
*/
physmap[0] = PAGE_SIZE; /* mask off page 0 */
pa_indx = 0;
+ da_indx = 1;
phys_avail[pa_indx++] = physmap[0];
phys_avail[pa_indx] = physmap[0];
+ dump_avail[da_indx] = physmap[0];
pte = CMAP1;
/*
@@ -1767,14 +1773,15 @@ getmemsize(int first)
if (physmap[i + 1] < end)
end = trunc_page(physmap[i + 1]);
for (pa = round_page(physmap[i]); pa < end; pa += PAGE_SIZE) {
- int tmp, page_bad;
+ int tmp, page_bad, full;
int *ptr = (int *)CADDR1;
+ full = FALSE;
/*
* block out kernel memory as not available.
*/
if (pa >= KERNLOAD && pa < first)
- continue;
+ goto do_dump_avail;
/*
* block out dcons buffer
@@ -1782,7 +1789,7 @@ getmemsize(int first)
if (dcons_addr > 0
&& pa >= trunc_page(dcons_addr)
&& pa < dcons_addr + dcons_size)
- continue;
+ goto do_dump_avail;
page_bad = FALSE;
@@ -1797,30 +1804,26 @@ getmemsize(int first)
* Test for alternating 1's and 0's
*/
*(volatile int *)ptr = 0xaaaaaaaa;
- if (*(volatile int *)ptr != 0xaaaaaaaa) {
+ if (*(volatile int *)ptr != 0xaaaaaaaa)
page_bad = TRUE;
- }
/*
* Test for alternating 0's and 1's
*/
*(volatile int *)ptr = 0x55555555;
- if (*(volatile int *)ptr != 0x55555555) {
- page_bad = TRUE;
- }
+ if (*(volatile int *)ptr != 0x55555555)
+ page_bad = TRUE;
/*
* Test for all 1's
*/
*(volatile int *)ptr = 0xffffffff;
- if (*(volatile int *)ptr != 0xffffffff) {
+ if (*(volatile int *)ptr != 0xffffffff)
page_bad = TRUE;
- }
/*
* Test for all 0's
*/
*(volatile int *)ptr = 0x0;
- if (*(volatile int *)ptr != 0x0) {
+ if (*(volatile int *)ptr != 0x0)
page_bad = TRUE;
- }
/*
* Restore original value.
*/
@@ -1829,9 +1832,8 @@ getmemsize(int first)
/*
* Adjust array of valid/good pages.
*/
- if (page_bad == TRUE) {
+ if (page_bad == TRUE)
continue;
- }
/*
* If this good page is a continuation of the
* previous set of good pages, then just increase
@@ -1851,12 +1853,28 @@ getmemsize(int first)
printf(
"Too many holes in the physical address space, giving up\n");
pa_indx--;
- break;
+ full = TRUE;
+ goto do_dump_avail;
}
phys_avail[pa_indx++] = pa; /* start */
- phys_avail[pa_indx] = pa + PAGE_SIZE; /* end */
+ phys_avail[pa_indx] = pa + PAGE_SIZE; /* end */
}
physmem++;
+do_dump_avail:
+ if (dump_avail[da_indx] == pa) {
+ dump_avail[da_indx] += PAGE_SIZE;
+ } else {
+ da_indx++;
+ if (da_indx == DUMP_AVAIL_ARRAY_END) {
+ da_indx--;
+ goto do_next;
+ }
+ dump_avail[da_indx++] = pa; /* start */
+ dump_avail[da_indx] = pa + PAGE_SIZE; /* end */
+ }
+do_next:
+ if (full)
+ break;
}
}
*pte = 0;
OpenPOWER on IntegriCloud