summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/locore.S38
-rw-r--r--sys/ia64/ia64/locore.s38
-rw-r--r--sys/ia64/ia64/machdep.c18
-rw-r--r--sys/ia64/include/cpu.h2
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 *);
OpenPOWER on IntegriCloud