CAlias

第四回 カーネルVM探検隊でも話した通り、Originのメモリレイアウトでは物理メモリの先頭64KBずつが各プロセッサで排他的に使えるメモリ領域として割り当てられており、実際の位置に関わらず物理アドレスは0x0になっている。
ので、Exception Vectorがこの仕様に巻き込まれて迷惑な訳で…。

Exception Vectorはarch/sgi/sgi/machdep.cで作っているんだが、ここへゴリゴリ#ifdef入れるのはあまりにも不恰好だろう、と思いarch/sgi/sgi/ip27_machdep.cのhw_cpu_hatch()にException Vectorを作るコードをそのまま持ってきた。
セカンダリプロセッサが起動した時に自力で初期化させる。

一応printfとか動いてたし多分イケてると思うんだけど…何か未だ自信なし。クロック割り込みの動作確認は取れず。

ところでCPUと完全独立なL1コンソールはCPUのデバッグに使えないのだろうか??

+void
+hw_cpu_hatch(struct cpu_info *ci)
+{
+	int s;
+	vaddr_t xtlb_handler;
+	extern char exception[], e_exception[];
+
+	/*
+	 * Set curcpu address on this processor.
+	 */
+	setcurcpu(ci);
+
+	/*
+	 * Make sure we can access the extended address space.
+	 * Note that r10k and later do not allow XUSEG accesses
+	 * from kernel mode unless SR_UX is set.
+	 */
+	setsr(getsr() | SR_KX | SR_UX);
+
+	tlb_set_page_mask(TLB_PAGE_MASK);
+	tlb_set_wired(0);
+	tlb_flush(64);
+	tlb_set_wired(UPAGES / 2);
+
+	tlb_set_pid(0);
+
+	/*
+	 * Copy down exception vector code.
+	 */
+	bcopy(exception, (char *)CACHE_ERR_EXC_VEC, e_exception - exception);
+	bcopy(exception, (char *)GEN_EXC_VEC, e_exception - exception);
+
+	/*
+	 * Build proper TLB refill handler trampolines.
+	 */
+	extern void xtlb_miss;
+	xtlb_handler = (vaddr_t)&xtlb_miss;
+
+	build_trampoline(TLB_MISS_EXC_VEC, xtlb_handler);
+	build_trampoline(XTLB_MISS_EXC_VEC, xtlb_handler);
+
+	/*
+	 * Turn off bootstrap exception vectors.
+	 */
+	setsr(getsr() & ~SR_BOOT_EXC_VEC);
+
+	/*
+	 * Clear out the I and D caches.
+	 */
+	Mips10k_ConfigCache(ci);
+	Mips_SyncCache(ci);
+
+	cpu_startclock(ci);
+
+//	ncpus++;
+//	cpuset_add(&cpus_running, ci);
+
+//	mips64_ipi_init();
+	/* XXX: setintrmask(0) here */
+
+	spl0();
+	(void)updateimask(0);
+
+	while(1)
+		printf("cpu_hatch\n");
+
+	SCHED_LOCK(s);
+	cpu_switchto(NULL, sched_chooseproc());
+}