Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc/sparc Allow the kernel to be loaded at its li...
details: https://anonhg.NetBSD.org/src/rev/826553dfa7ee
branches: trunk
changeset: 543278:826553dfa7ee
user: pk <pk%NetBSD.org@localhost>
date: Fri Feb 21 19:04:07 2003 +0000
description:
Allow the kernel to be loaded at its link address (aka KERNBASE) by the
boot program.
diffstat:
sys/arch/sparc/sparc/autoconf.c | 9 +++-
sys/arch/sparc/sparc/locore.s | 66 +++++++++++++++++++++++++++-------------
2 files changed, 50 insertions(+), 25 deletions(-)
diffs (189 lines):
diff -r 39bfe7fd0784 -r 826553dfa7ee sys/arch/sparc/sparc/autoconf.c
--- a/sys/arch/sparc/sparc/autoconf.c Fri Feb 21 18:50:10 2003 +0000
+++ b/sys/arch/sparc/sparc/autoconf.c Fri Feb 21 19:04:07 2003 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.190 2003/02/18 13:36:52 pk Exp $ */
+/* $NetBSD: autoconf.c,v 1.191 2003/02/21 19:04:07 pk Exp $ */
/*
* Copyright (c) 1996
@@ -299,8 +299,11 @@
#ifdef DDB
if ((bi_sym = lookup_bootinfo(BTINFO_SYMTAB)) != NULL) {
- bi_sym->ssym += KERNBASE;
- bi_sym->esym += KERNBASE;
+ if (bi_sym->ssym < KERNBASE) {
+ /* Assume low-loading boot loader */
+ bi_sym->ssym += KERNBASE;
+ bi_sym->esym += KERNBASE;
+ }
ddb_init(bi_sym->nsym, (int *)bi_sym->ssym,
(int *)bi_sym->esym);
} else {
diff -r 39bfe7fd0784 -r 826553dfa7ee sys/arch/sparc/sparc/locore.s
--- a/sys/arch/sparc/sparc/locore.s Fri Feb 21 18:50:10 2003 +0000
+++ b/sys/arch/sparc/sparc/locore.s Fri Feb 21 19:04:07 2003 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.185 2003/01/18 06:45:03 thorpej Exp $ */
+/* $NetBSD: locore.s,v 1.186 2003/02/21 19:04:07 pk Exp $ */
/*
* Copyright (c) 1996 Paul Kranenburg
@@ -3545,14 +3545,32 @@
/*
* Startup.
*
- * We have been loaded in low RAM, at some address which
+ * We may have been loaded in low RAM, at some address which
* is page aligned (PROM_LOADADDR actually) rather than where we
* want to run (KERNBASE+PROM_LOADADDR). Until we get everything set,
* we have to be sure to use only pc-relative addressing.
*/
/*
- * We now use the bootinfo method to pass arguments, and the new
+ * Find out if the above is the case.
+ */
+0: call 1f
+ sethi %hi(0b), %l0 ! %l0 = virtual address of 0:
+1: or %l0, %lo(0b), %l0
+ sub %l0, %o7, %l7 ! subtract actual physical address of 0:
+
+ /*
+ * If we're already running at our desired virtual load address,
+ * %l7 will be set to 0, otherwise it will be KERNBASE.
+ * From now on until the end of locore bootstrap code, %l7 will
+ * be used to relocate memory references.
+ */
+#define RELOCATE(l,r) \
+ set l, r; \
+ sub r, %l7, r
+
+ /*
+ * We use the bootinfo method to pass arguments, and the new
* magic number indicates that. A pointer to the kernel top, i.e.
* the first address after the load kernel image (including DDB
* symbols, if any) is passed in %o4[0] and the bootinfo structure
@@ -3576,7 +3594,6 @@
* the difference between KERNBASE and the old value (known to be
* 0xf8000000) compiled into pre-1.3 bootblocks.
*/
- set KERNBASE, %l4
set 0x44444232, %l3 ! bootinfo magic
cmp %o5, %l3
@@ -3585,19 +3602,20 @@
/* The loader has passed to us a `bootinfo' structure */
ld [%o4], %l3 ! 1st word is kernel_top
- add %l3, %l4, %o5 ! relocate: + KERNBASE
- sethi %hi(_C_LABEL(kernel_top) - KERNBASE), %l3 ! and store it
- st %o5, [%l3 + %lo(_C_LABEL(kernel_top) - KERNBASE)]
+ add %l3, %l7, %o5 ! relocate: + KERNBASE
+ RELOCATE(_C_LABEL(kernel_top),%l3)
+ st %o5, [%l3] ! and store it
ld [%o4 + 4], %l3 ! 2nd word is bootinfo
- add %l3, %l4, %o5 ! relocate
- sethi %hi(_C_LABEL(bootinfo) - KERNBASE), %l3 ! store bootinfo
- st %o5, [%l3 + %lo(_C_LABEL(bootinfo) - KERNBASE)]
+ add %l3, %l7, %o5 ! relocate
+ RELOCATE(_C_LABEL(bootinfo),%l3)
+ st %o5, [%l3] ! store bootinfo
b,a 4f
1:
#ifdef DDB
/* Check for old-style DDB loader magic */
+ set KERNBASE, %l4
set 0x44444231, %l3 ! Is it DDB_MAGIC1?
cmp %o5, %l3
be,a 2f
@@ -3625,8 +3643,8 @@
* let it default to `end'.
*/
set end, %o4
- sethi %hi(_C_LABEL(kernel_top) - KERNBASE), %l3 ! store kernel_top
- st %o4, [%l3 + %lo(_C_LABEL(kernel_top) - KERNBASE)]
+ RELOCATE(_C_LABEL(kernel_top),%l3)
+ st %o4, [%l3] ! store kernel_top
4:
@@ -3665,15 +3683,15 @@
call %o4
mov 0, %o0 ! node
- mov %o0, %l0
- set cputypvar-KERNBASE, %o1 ! name = "compatible"
- set cputypval-KERNBASE, %o2 ! buffer ptr (assume buffer long enough)
+ !mov %o0, %l0
+ RELOCATE(cputypvar,%o1) ! name = "compatible"
+ RELOCATE(cputypval,%l2) ! buffer ptr (assume buffer long enough)
ld [%g7 + PV_NODEOPS], %o4 ! (void)pv->pv_nodeops->no_getprop(...)
ld [%o4 + NO_GETPROP], %o4
call %o4
- nop
- set cputypval-KERNBASE, %o2 ! buffer ptr
- ldub [%o2 + 4], %o0 ! which is it... "sun4c", "sun4m", "sun4d"?
+ mov %l2, %o2
+ !set cputypval-KERNBASE, %o2 ! buffer ptr
+ ldub [%l2 + 4], %o0 ! which is it... "sun4c", "sun4m", "sun4d"?
cmp %o0, 'c'
be is_sun4c
nop
@@ -3705,7 +3723,7 @@
b start_havetype
mov CPU_SUN4M, %g4
#else
- set sun4m_notsup-KERNBASE, %o0
+ RELOCATE(sun4m_notsup,%o0)
ld [%g7 + PV_EVAL], %o1
call %o1 ! print a message saying that the
nop ! sun4m architecture is not supported
@@ -3721,7 +3739,7 @@
b start_havetype
mov CPU_SUN4D, %g4
#else
- set sun4d_notsup-KERNBASE, %o0
+ RELOCATE(sun4d_notsup,%o0)
ld [%g7 + PV_EVAL], %o1
call %o1 ! print a message saying that the
nop ! sun4d architecture is not supported
@@ -3741,7 +3759,7 @@
b start_havetype
mov CPU_SUN4C, %g4 ! XXX CPU_SUN4
#else
- set sun4c_notsup-KERNBASE, %o0
+ RELOCATE(sun4c_notsup,%o0)
ld [%g7 + PV_ROMVEC_VERS], %o1
cmp %o1, 0
@@ -3751,6 +3769,7 @@
! stupid version 0 rom interface is pv_eval(int length, char *string)
mov %o0, %o1
2: ldub [%o0], %o4
+ tst %o4
bne 2b
inc %o0
dec %o0
@@ -3777,7 +3796,7 @@
#else
set PROM_BASE, %g7
- set sun4_notsup-KERNBASE, %o0
+ RELOCATE(sun4_notsup,%o0)
ld [%g7 + OLDMON_PRINTF], %o1
call %o1 ! print a message saying that the
nop ! sun4 architecture is not supported
@@ -3788,6 +3807,9 @@
#endif
start_havetype:
+ cmp %l7, 0
+ be startmap_done
+
/*
* Step 1: double map low RAM (addresses [0.._end-start-1])
* to KERNBASE (addresses [KERNBASE.._end-1]). None of these
Home |
Main Index |
Thread Index |
Old Index