diff options
Diffstat (limited to 'sys/ia64')
-rw-r--r-- | sys/ia64/ia64/locore.S | 38 | ||||
-rw-r--r-- | sys/ia64/ia64/locore.s | 38 | ||||
-rw-r--r-- | sys/ia64/ia64/machdep.c | 18 | ||||
-rw-r--r-- | sys/ia64/include/cpu.h | 2 |
4 files changed, 28 insertions, 68 deletions
diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S index 69550d1..338518d 100644 --- a/sys/ia64/ia64/locore.S +++ b/sys/ia64/ia64/locore.S @@ -51,6 +51,9 @@ kstack: .space KSTACK_PAGES * PAGE_SIZE * register r8. */ ENTRY(__start, 1) + .prologue + .save rp,r0 + .body { .mlx mov ar.rsc=0 movl r16=ia64_vector_table // set up IVT early @@ -90,41 +93,10 @@ ENTRY(__start, 1) br.call.sptk.many rp=_reloc ;; br.call.sptk.many rp=ia64_init - - /* - * switch to thread0 and then initialise the rest of the kernel. - */ - alloc r16=ar.pfs,0,0,1,0 - ;; - movl out0=thread0 ;; - add out0=TD_PCB,out0 - ;; - ld8 out0=[out0] - ;; - add r16=PCB_SPECIAL_RP,out0 // return to mi_startup_trampoline - movl r17=mi_startup_trampoline - ;; - st8 [r16]=r17 - ;; - br.call.sptk.many rp=restorectx - - /* NOTREACHED */ - -END(__start) - - -ENTRY(mi_startup_trampoline, 0) - .prologue - .save rp,r0 - .body - - br.call.sptk.many rp=mi_startup - - // Should never happen + /* NOTREACHED */ 1: br.cond.sptk.few 1b - -END(mi_startup_trampoline) +END(__start) /* * fork_trampoline() diff --git a/sys/ia64/ia64/locore.s b/sys/ia64/ia64/locore.s index 69550d1..338518d 100644 --- a/sys/ia64/ia64/locore.s +++ b/sys/ia64/ia64/locore.s @@ -51,6 +51,9 @@ kstack: .space KSTACK_PAGES * PAGE_SIZE * register r8. */ ENTRY(__start, 1) + .prologue + .save rp,r0 + .body { .mlx mov ar.rsc=0 movl r16=ia64_vector_table // set up IVT early @@ -90,41 +93,10 @@ ENTRY(__start, 1) br.call.sptk.many rp=_reloc ;; br.call.sptk.many rp=ia64_init - - /* - * switch to thread0 and then initialise the rest of the kernel. - */ - alloc r16=ar.pfs,0,0,1,0 - ;; - movl out0=thread0 ;; - add out0=TD_PCB,out0 - ;; - ld8 out0=[out0] - ;; - add r16=PCB_SPECIAL_RP,out0 // return to mi_startup_trampoline - movl r17=mi_startup_trampoline - ;; - st8 [r16]=r17 - ;; - br.call.sptk.many rp=restorectx - - /* NOTREACHED */ - -END(__start) - - -ENTRY(mi_startup_trampoline, 0) - .prologue - .save rp,r0 - .body - - br.call.sptk.many rp=mi_startup - - // Should never happen + /* NOTREACHED */ 1: br.cond.sptk.few 1b - -END(mi_startup_trampoline) +END(__start) /* * fork_trampoline() diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index fab204a..7386ce3 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -149,6 +149,8 @@ vm_offset_t phys_avail[100]; /* 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) +void mi_startup(void); /* XXX should be in a MI header */ + static void identifycpu(void); struct kva_md_info kmi; @@ -441,7 +443,7 @@ calculate_frequencies(void) } void -ia64_init(u_int64_t arg1, u_int64_t arg2) +ia64_init(void) { int phys_avail_cnt; vm_offset_t kernstart, kernend; @@ -762,6 +764,20 @@ ia64_init(u_int64_t arg1, u_int64_t arg2) } #endif ia64_set_tpr(0); + + /* + * Save our current context so that we have a known (maybe even + * sane) context as the initial context for new threads that are + * forked from us. If any of those threads (including thread0) + * does something wrong, we may be lucky and return here where + * we're ready for them with a nice panic. + */ + if (!savectx(thread0.td_pcb)) + mi_startup(); + + /* We should not get here. */ + panic("ia64_init: Whooaa there!"); + /* NOTREACHED */ } void diff --git a/sys/ia64/include/cpu.h b/sys/ia64/include/cpu.h index c2bd78c..cc3f5f9 100644 --- a/sys/ia64/include/cpu.h +++ b/sys/ia64/include/cpu.h @@ -114,7 +114,7 @@ long fswintrberr(void); /* MAGIC */ int ia64_highfp_drop(struct thread *); int ia64_highfp_load(struct thread *); int ia64_highfp_save(struct thread *); -void ia64_init(u_int64_t, u_int64_t); +void ia64_init(void); int ia64_pa_access(u_long); void init_prom_interface(struct rpb*); void interrupt(u_int64_t, struct trapframe *); |