Module Name: src Committed By: cyber Date: Tue Dec 8 01:58:43 UTC 2009
Modified Files: src/sys/arch/sbmips/include [matt-nb5-mips64]: autoconf.h src/sys/arch/sbmips/sbmips [matt-nb5-mips64]: machdep.c Log Message: - fix to allow 64bit kernels to properly talk to the firmware - allow visibiliy of additional RAM To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.3.126.1 src/sys/arch/sbmips/include/autoconf.h cvs rdiff -u -r1.38.10.2 -r1.38.10.3 src/sys/arch/sbmips/sbmips/machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sbmips/include/autoconf.h diff -u src/sys/arch/sbmips/include/autoconf.h:1.3 src/sys/arch/sbmips/include/autoconf.h:1.3.126.1 --- src/sys/arch/sbmips/include/autoconf.h:1.3 Sat Mar 22 14:26:43 2003 +++ src/sys/arch/sbmips/include/autoconf.h Tue Dec 8 01:58:43 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.h,v 1.3 2003/03/22 14:26:43 simonb Exp $ */ +/* $NetBSD: autoconf.h,v 1.3.126.1 2009/12/08 01:58:43 cyber Exp $ */ /* * Copyright 2000, 2001 @@ -49,14 +49,39 @@ #define BOOTINFO_MAGIC 0x1234ABCD #define BOOTINFO_VERSION 1 +#if _LP64 +#define BI_FIXUP(x) ((vaddr_t)x | 0xffffffff00000000) +#else +#define BI_FIXUP(x) x +#endif + + struct bootinfo_v1 { - u_long version; /* 0: version of bootinfo */ - u_long reserved; /* 4: round to 64-bit boundary */ - u_long ssym; /* 8: start of kernel sym table */ - u_long esym; /* 12: end of kernel sym table */ + uint32_t version; /* 0: version of bootinfo */ + uint32_t reserved; /* 4: round to 64-bit boundary */ + uint32_t ssym; /* 8: start of kernel sym table */ + uint32_t esym; /* 12: end of kernel sym table */ char boot_flags[64]; /* 16: boot flags */ char booted_kernel[64]; /* 80: name of booted kernel */ - u_long fwhandle; /* 144: firmware handle */ - u_long fwentry; /* 148: firmware entry point */ + uint32_t fwhandle; /* 144: firmware handle */ + uint32_t fwentry; /* 148: firmware entry point */ u_char reserved2[100]; /* 256: total size */ }; + + +struct bootinfo_v1_int { + uint32_t version; /* 0/0: version of bootinfo */ + uint32_t reserved; /* 4/4: round to 64-bit boundary */ + vaddr_t ssym; /* 8/8: start of kernel sym table */ + vaddr_t esym; /* 12/16: end of kernel sym table */ + char boot_flags[64]; /* 16/24: boot flags */ + char booted_kernel[64]; /* 80/88: name of booted kernel */ + vaddr_t fwhandle; /* 144/152: firmware handle */ + vaddr_t fwentry; /* 148/160: firmware entry point */ +#ifdef _LP64 + u_char reserved2[88]; /* 168: total size -> 256 */ +#else + u_char reserved2[104]; /* 152: total size -> 256 */ +#endif +}; + Index: src/sys/arch/sbmips/sbmips/machdep.c diff -u src/sys/arch/sbmips/sbmips/machdep.c:1.38.10.2 src/sys/arch/sbmips/sbmips/machdep.c:1.38.10.3 --- src/sys/arch/sbmips/sbmips/machdep.c:1.38.10.2 Mon Nov 23 18:23:02 2009 +++ src/sys/arch/sbmips/sbmips/machdep.c Tue Dec 8 01:58:43 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.38.10.2 2009/11/23 18:23:02 matt Exp $ */ +/* $NetBSD: machdep.c,v 1.38.10.3 2009/12/08 01:58:43 cyber Exp $ */ /* * Copyright 2000, 2001 @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.38.10.2 2009/11/23 18:23:02 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.38.10.3 2009/12/08 01:58:43 cyber Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -134,7 +134,7 @@ int netboot; /* Are we netbooting? */ int cfe_present; -struct bootinfo_v1 bootinfo; +struct bootinfo_v1_int bootinfo; phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX]; int mem_cluster_cnt; @@ -162,6 +162,7 @@ extern char edata[], end[]; int i; uint32_t config; + struct bootinfo_v1 *tmp_bi; /* XXX this code must run on the target CPU */ config = mips3_cp0_config_read(); @@ -170,7 +171,11 @@ mips3_cp0_config_write(config); /* Zero BSS. XXXCGD: uh, is this really necessary still? */ +#ifdef _LP64 + memset((char *)((vaddr_t)edata | 0xffffffff00000000), 0, end - edata); +#else memset(edata, 0, end - edata); +#endif /* * Copy the bootinfo structure from the boot loader. @@ -178,9 +183,16 @@ * called because we may need CFE's TLB handler */ - if (magic == BOOTINFO_MAGIC) - memcpy(&bootinfo, (struct bootinfo_v1 *)bootdata, - sizeof bootinfo); + if (magic == BOOTINFO_MAGIC) { + tmp_bi = (struct bootinfo_v1 *)bootdata; + bootinfo.version = tmp_bi->version; + bootinfo.ssym = BI_FIXUP(tmp_bi->ssym); + bootinfo.esym = BI_FIXUP(tmp_bi->esym); + memcpy(&(bootinfo.boot_flags), tmp_bi->boot_flags, 64); + memcpy(&(bootinfo.booted_kernel), tmp_bi->booted_kernel, 64); + bootinfo.fwhandle = BI_FIXUP(tmp_bi->fwhandle); + bootinfo.fwentry = BI_FIXUP(tmp_bi->fwentry); + } else if (reserved == CFE_EPTSEAL) { magic = BOOTINFO_MAGIC; bzero(&bootinfo, sizeof bootinfo); @@ -240,7 +252,9 @@ * XXX Ignore memory above 256MB for now, it * XXX needs special handling. */ +#ifndef _LP64 if (start < (256*1024*1024)) { +#endif physmem += btoc(((int) len)); mem_clusters[mem_cluster_cnt].start = (long) start; @@ -248,7 +262,9 @@ (long) len; mem_cluster_cnt++; added = 1; +#ifndef _LP64 } +#endif } if (added) printf("added to map\n");