1. Remove bootinfo and just pass loader metadata to the kernel.
2. Remove mcontext.mc_sp, it is redundant. Adjust spare space to make ucontext_t a nice size. 3. Raise pil in the debugger. Submitted by: tmm (3)
This commit is contained in:
parent
4d5e57d87d
commit
62d5557bb9
@ -1,53 +0,0 @@
|
||||
/*-
|
||||
* Copyright (C) 1994 by Rodney W. Grimes, Milwaukie, Oregon 97222
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer as
|
||||
* the first lines of this file unmodified.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Rodney W. Grimes.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY RODNEY W. GRIMES ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL RODNEY W. GRIMES BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: FreeBSD: src/sys/i386/include/bootinfo.h,v 1.14 1999/12/29
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_BOOTINFO_H_
|
||||
#define _MACHINE_BOOTINFO_H_
|
||||
|
||||
/*
|
||||
* Increment the version number when you break binary compatibiity.
|
||||
*/
|
||||
#define BOOTINFO_VERSION 1
|
||||
|
||||
struct bootinfo {
|
||||
u_int bi_version; /* Version number of this structure. */
|
||||
u_int bi_howto; /* How to boot. */
|
||||
u_long bi_end; /* End of kernel space. */
|
||||
u_long bi_kpa; /* Physical address of start of kernel. */
|
||||
u_long bi_metadata; /* Preload modules. */
|
||||
u_long bi_envp; /* Kernel environment. */
|
||||
};
|
||||
|
||||
#endif /* !_MACHINE_BOOTINFO_H_ */
|
@ -36,11 +36,10 @@ typedef struct __mcontext {
|
||||
long mc_global[8];
|
||||
long mc_out[8];
|
||||
long mc_onstack;
|
||||
long mc_sp;
|
||||
long mc_tpc;
|
||||
long mc_tnpc;
|
||||
long mc_tstate;
|
||||
long mc_spare[11];
|
||||
long mc_spare[2];
|
||||
} mcontext_t;
|
||||
|
||||
#endif /* !_MACHINE_UCONTEXT_H_ */
|
||||
|
@ -37,18 +37,19 @@
|
||||
.set kernbase,KERNBASE
|
||||
|
||||
/*
|
||||
* void _start(struct bootinfo *bi, u_long ofw_vec)
|
||||
* void _start(caddr_t metadata, u_long o1, u_long o2, u_long o3,
|
||||
* u_long ofw_vec)
|
||||
*/
|
||||
ENTRY(_start)
|
||||
wrpr %g0, PSTATE_IE | PSTATE_PRIV | PSTATE_PEF, %pstate
|
||||
mov %o0, %g1
|
||||
mov %o1, %g2
|
||||
mov %o4, %g2
|
||||
flushw
|
||||
wrpr %g0, 1, %cwp
|
||||
wrpr %g0, 0, %cleanwin
|
||||
wrpr %g0, 0, %pil
|
||||
|
||||
set kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %o0
|
||||
SET(kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l0, %o0)
|
||||
sub %o0, SPOFF + CCFSZ, %sp
|
||||
|
||||
mov %g1, %o0
|
||||
|
@ -37,18 +37,19 @@
|
||||
.set kernbase,KERNBASE
|
||||
|
||||
/*
|
||||
* void _start(struct bootinfo *bi, u_long ofw_vec)
|
||||
* void _start(caddr_t metadata, u_long o1, u_long o2, u_long o3,
|
||||
* u_long ofw_vec)
|
||||
*/
|
||||
ENTRY(_start)
|
||||
wrpr %g0, PSTATE_IE | PSTATE_PRIV | PSTATE_PEF, %pstate
|
||||
mov %o0, %g1
|
||||
mov %o1, %g2
|
||||
mov %o4, %g2
|
||||
flushw
|
||||
wrpr %g0, 1, %cwp
|
||||
wrpr %g0, 0, %cleanwin
|
||||
wrpr %g0, 0, %pil
|
||||
|
||||
set kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %o0
|
||||
SET(kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l0, %o0)
|
||||
sub %o0, SPOFF + CCFSZ, %sp
|
||||
|
||||
mov %g1, %o0
|
||||
|
@ -81,7 +81,7 @@
|
||||
|
||||
#include <ddb/ddb.h>
|
||||
|
||||
#include <machine/bootinfo.h>
|
||||
#include <machine/cache.h>
|
||||
#include <machine/clock.h>
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/fp.h>
|
||||
@ -96,6 +96,12 @@
|
||||
#include <machine/tstate.h>
|
||||
#include <machine/ver.h>
|
||||
|
||||
#define MD_FETCH(mdp, info, type) ({ \
|
||||
type *__p; \
|
||||
__p = (type *)preload_search_info((mdp), MODINFO_METADATA | (info)); \
|
||||
__p ? *__p : 0; \
|
||||
})
|
||||
|
||||
typedef int ofw_vec_t(void *);
|
||||
|
||||
extern char tl0_base[];
|
||||
@ -132,7 +138,7 @@ u_long ofw_tba;
|
||||
static struct timecounter tick_tc;
|
||||
|
||||
static timecounter_get_t tick_get_timecount;
|
||||
void sparc64_init(struct bootinfo *bi, ofw_vec_t *vec);
|
||||
void sparc64_init(caddr_t mdp, ofw_vec_t *vec);
|
||||
void sparc64_shutdown_final(void *dummy, int howto);
|
||||
|
||||
static void cpu_startup(void *);
|
||||
@ -164,6 +170,7 @@ cpu_startup(void *arg)
|
||||
tc_init(&tick_tc);
|
||||
|
||||
cpu_identify(clock);
|
||||
cache_init(child);
|
||||
|
||||
vm_ksubmap_init(&kmi);
|
||||
|
||||
@ -186,31 +193,61 @@ tick_get_timecount(struct timecounter *tc)
|
||||
}
|
||||
|
||||
void
|
||||
sparc64_init(struct bootinfo *bi, ofw_vec_t *vec)
|
||||
sparc64_init(caddr_t mdp, ofw_vec_t *vec)
|
||||
{
|
||||
vm_offset_t end;
|
||||
vm_offset_t off;
|
||||
caddr_t kmdp;
|
||||
u_long ps;
|
||||
|
||||
end = 0;
|
||||
kmdp = NULL;
|
||||
|
||||
/*
|
||||
* Initialize openfirmware (needed for console).
|
||||
*/
|
||||
OF_init(vec);
|
||||
cninit();
|
||||
|
||||
/*
|
||||
* Parse metadata if present and fetch parameters. Must be before the
|
||||
* console is inited so cninit gets the right value of boothowto.
|
||||
*/
|
||||
if (mdp != NULL) {
|
||||
preload_metadata = mdp;
|
||||
kmdp = preload_search_by_type("elf kernel");
|
||||
if (kmdp != NULL) {
|
||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
|
||||
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
|
||||
end = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the console before printing anything.
|
||||
*/
|
||||
cninit();
|
||||
|
||||
printf("sparc64_init: mdp=%p kmdp=%p boothowto=%d envp=%p end=%#lx\n",
|
||||
mdp, kmdp, boothowto, kern_envp, end);
|
||||
|
||||
/*
|
||||
* Check that the bootinfo struct is sane.
|
||||
* Panic is there is no metadata. Most likely the kernel was booted
|
||||
* directly, instead of through loader(8).
|
||||
*/
|
||||
if (bi->bi_version != BOOTINFO_VERSION)
|
||||
panic("sparc64_init: bootinfo version mismatch");
|
||||
if (bi->bi_metadata == 0)
|
||||
panic("sparc64_init: no loader metadata");
|
||||
boothowto = bi->bi_howto;
|
||||
kern_envp = (char *)bi->bi_envp;
|
||||
preload_metadata = (caddr_t)bi->bi_metadata;
|
||||
if (mdp == NULL || kmdp == NULL) {
|
||||
printf("sparc64_init: no loader metadata.\n"
|
||||
"This probably means you are not using loader(8).\n");
|
||||
panic("sparc64_init");
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanity check the kernel end, which is important.
|
||||
*/
|
||||
if (end == 0) {
|
||||
printf("sparc64_init: warning, kernel end not specified.\n"
|
||||
"Attempting to continue anyway.\n");
|
||||
end = (vm_offset_t)_end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize tunables.
|
||||
@ -224,7 +261,7 @@ sparc64_init(struct bootinfo *bi, ofw_vec_t *vec)
|
||||
/*
|
||||
* Initialize virtual memory.
|
||||
*/
|
||||
pmap_bootstrap(bi->bi_end);
|
||||
pmap_bootstrap(end);
|
||||
|
||||
/*
|
||||
* Disable tick for now.
|
||||
@ -341,7 +378,6 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
|
||||
bcopy(tf->tf_global, sf.sf_uc.uc_mcontext.mc_global,
|
||||
sizeof (tf->tf_global));
|
||||
bcopy(tf->tf_out, sf.sf_uc.uc_mcontext.mc_out, sizeof (tf->tf_out));
|
||||
sf.sf_uc.uc_mcontext.mc_sp = tf->tf_sp;
|
||||
sf.sf_uc.uc_mcontext.mc_tpc = tf->tf_tpc;
|
||||
sf.sf_uc.uc_mcontext.mc_tnpc = tf->tf_tnpc;
|
||||
sf.sf_uc.uc_mcontext.mc_tstate = tf->tf_tstate;
|
||||
@ -463,7 +499,6 @@ sigreturn(struct thread *td, struct sigreturn_args *uap)
|
||||
bcopy(uc.uc_mcontext.mc_global, tf->tf_global,
|
||||
sizeof(tf->tf_global));
|
||||
bcopy(uc.uc_mcontext.mc_out, tf->tf_out, sizeof(tf->tf_out));
|
||||
tf->tf_sp = uc.uc_mcontext.mc_sp;
|
||||
tf->tf_tpc = uc.uc_mcontext.mc_tpc;
|
||||
tf->tf_tnpc = uc.uc_mcontext.mc_tnpc;
|
||||
tf->tf_tstate = uc.uc_mcontext.mc_tstate;
|
||||
@ -593,9 +628,12 @@ setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
||||
void
|
||||
Debugger(const char *msg)
|
||||
{
|
||||
critical_t c;
|
||||
|
||||
printf("Debugger(\"%s\")\n", msg);
|
||||
c = critical_enter();
|
||||
breakpoint();
|
||||
critical_exit(c);
|
||||
}
|
||||
|
||||
int
|
||||
|
Loading…
Reference in New Issue
Block a user