OS

OpenBSD/sgi on octane2 - どうしてもprintf()で死ぬ

ここで、cpu1のブートシーケンスを頭から書いておこう。 まず、エントリポイントはこれ: LEAF(cpu_spinup_trampoline, 0) mfc0 v0, COP_0_STATUS_REG li v1, ~SR_INT_ENAB and v0, v1 ori v0, SR_KX | SR_UX mtc0 v0, COP_0_STATUS_REG # disable all inter…

OpenBSD/sgi on octane2 - cpu_boot_secondary()からでも起動出来てた

わかったわかった。 cpu_boot_secondary()からだと起動しないのではなく、printfから出力出来てないだけっぽい。 ARCBIOSへアクセス出来る事を祈りながら試しに出力関数をbios_printf()にしてみたら、問題なく出力出来た。 はて、ではその間を埋めるものは何…

OpenBSD/sgi on octane2 - やっぱりcpu_boot_secondary()からは起動しない

prom_cpu_boot_secondary()がMPCONFへエントリポイント、スタックアドレスなどを書く前: id:1 magic:baddeed2 prid:e35 physid:1 virtid:1 scachesz:21 fanloads:0 launch:0 rndvz:0 stackaddr:0 lparam:0 rparam:0 idleflag:1後: id:1 magic:baddeed2 pri…

OpenBSD/sgi on octane2 - あ、うごいた

MPCONFにセットされたアドレスを確認していったら、なぜかMP_STACKADDR(1)に0x4000とか入ってた。 extern char *kstack; MP_STACKADDR(1) = (unsigned long)(kstack + USPACE); とかしてたのを extern unsigned char kstack[]; MP_STACKADDR(1) = (unsigned …

OpenBSD/sgi on octane2 - 再びcpu1が動かない・・・。

前回動いたあれは幻だったのか・・・?Linuxのコードをコピーしてきて直接mips_init()の中で動かし、cpu_spinup_trampoline()からbios_printfを呼んでみるも反応なし。 はて、、、何が悪いのやら、、、

OpenBSD/sgi on octane2 - 残り作業の確認

現時点で全く手が付いてないのは以下のパーツだけだ。 IPIデバイスドライバの実装 pmap.cのSMP対応 cpu_boot_secondary_processors()の実装 #部分的に出来てる どれも本丸という感じでまだまだ油断出来ないが、今月中に終わらせてしまいたい。

OpenBSD/sgi on octane2 - clock.cのMP対応

clock.cではクロックの管理にグローバル変数を使ってしまっている。 クロック割り込みは両側のCPUで起き独立で処理したいので、struct cpu_infoへそれらの変数を移動した。 Cで変数の移動するだけだから簡単。 Index: ../include/cpu.h ====================…

OpenBSD/sgi on octane2 - mutex.cへのスピンロック実装

OpenBSD/sgiのmutex.cは何と単なるスタブだ。 だからちゃんと実装してあげなきゃならない。 Index: ../../sgi/sgi/mutex.c =================================================================== RCS file: /cvs/src/sys/arch/sgi/sgi/mutex.c,v retrieving…

OpenBSD/sgi on octane2 - sync to HEAD

ここで無謀にもHEADと同期: $ cvs up暴挙だとは思うんだけどな〜ついやってもうた地味に大量のdiff発生: Index: arch/sgi/sgi/ip27_machdep.c =================================================================== --- arch/sgi/sgi/ip27_machdep.c (繝ェ…

OpenBSD/sgi on octane2 - ipendingをcurcpu()->ci_ipendingへ移動

こんなんでどうでっしゃろ。 あーもう説明かくの面倒い。 Index: mips64/exception.S =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/exception.S,v retrieving revision 1.16 diff -r1.1…

OpenBSD/sgi on octane2 - cplをcurcpu()->ci_cplへ移動

こっちは面倒い。アセンブリから沢山参照されている。 Index: context.S =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/context.S,v retrieving revision 1.20 diff -r1.20 context.S 40…

OpenBSD/sgi on octane2 - want_reschedをcurcpu()->ci_want_reschedへ移動

これはアセンブリないから簡単。 Index: interrupt.c =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/interrupt.c,v retrieving revision 1.35 diff -r1.35 interrupt.c 251c251 < if (wa…

OpenBSD/sgi on octane2 - curprocpaddrをcurcpu()->ci_curprocpaddrへ移動(解決篇)

OpenBSD/sgi on octane2 - curprocpaddrをcurcpu()-&gt;ci_curprocpaddrへ移動 - かーねる・う゛いえむにっきの解決篇。この間うまく動かなかったコードでは、一度GET_CPU_INFO(reg0, reg1)したら同じ関数ではもう一度取得しなおす事はせずreg0へ参照を行う…

OpenBSD/sgi on octane2 - astpendingをcurproc->p_md.md_astpendingへ移動

べ、別にアンタの為に書いてる訳じゃないんだからねっ!!! Index: mips64/mips64/exception.S =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/exception.S,v retrieving revision 1.16 …

OpenBSD/sgi on octane2 - curprocpaddrをcurcpu()->ci_curprocpaddrへ移動

curprocpaddrというグローバル変数がある。 これはarch/sgi/sgi/machdep.cでこんな風に初期化され、 /* * Allocate U page(s) for proc[0], pm_tlbpid 1. */ proc0.p_addr = proc0paddr = curprocpaddr = (struct user *)pmap_steal_memory(USPACE, NULL, NU…

OpenBSD/sgi on octane2 - cpu_info_primaryへの参照をcpu_info[]への参照に書き換え

mplockの問題が解決したので、SMP非対応な部分の書き換えに進もうと思う。 以前一息に実装してバグがとりきれなかった時のコードが残っているので、これをちょっとずつ適用しながら前に進める。まず、arch/mips64/include/cpu.hをSMP対応出来るように書き換…

OpenBSD/sgi on octane2 - mplock周りで落ちるバグについて#4

これでどや。 void sched_exit(struct proc *p) { struct schedstate_percpu *spc = &curcpu()->ci_schedstate; struct timeval tv; struct proc *idle; int s; microuptime(&tv); timersub(&tv, &spc->spc_runtime, &tv); timeradd(&p->p_rtime, &tv, &p->p…

OpenBSD/sgi on octane2 - mplock周りで落ちるバグについて#3

その後KERNEL_PROC_LOCK(p)/KERNEL_PROC_UNLOCK(p)を追ってみた所、kern/init_main.c:start_init()の以下の場所でlockされていないのにunlockしているからエラーが出るらしい事がわかった: if ((error = sys_execve(p, &args, retval)) == 0) { KERNEL_PRO…

OpenBSD/sgi on octane2 - mplock周りで落ちるバグについて#2

しかたがないので追っかけてみる事にした。 mplock.hを追っかけやすいようにデバッグprint追加: static __inline void __mp_lock_init(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); extern int printf(const char *, ...) __attribute__((__fo…

OpenBSD/sgi on octane2 - mplock周りで落ちるバグについて

__cpu_simple_lock後にきちんとロックされているか確かめるコードを念の為書いて走らせてみた。 が、そこは問題ないようである。こんなん: //#if defined(MP_LOCKDEBUG) #ifndef DDB #error "MP_LOCKDEBUG requires DDB" #endif extern void Debugger(void)…

OpenBSD/sgi on octane2 - kernel diagnostic assertion "__mp_lock_held(&sched_lock) == 0" failed

MP_LOCKDEBUGを外したら、今度はこんなんでましたけど。 >> bootp()192.168.3.1:bsd Setting $netaddr to 192.168.3.2 (from server ) Obtaining bsd from server 5889104+492712 entry: 0xa800000020020000 ARCS64 Firmware Version 64.0 Found SGI-IP30, s…

OpenBSD/sgi on octane2 - releasing not locked lock

__cpu_simple_lock_tryのバグを直したら、今度はこんなんでましたけど。 Command Monitor. Type "exit" to return to the menu. >> bootp()192.168.3.1:bsd Setting $netaddr to 192.168.3.2 (from server ) Obtaining bsd from server 5889472+492712 entry…

OpenBSD/sgi on octane2 - __cpu_simple_lock_tryのバグ

__cpu_simple_lock_try()でoldとnewが両方ともv0にコンパイルされちまってるよ、"=r"を"=&r"に書き換えると直るよ、とエラい人に教えてもらった。まじかよ。って事で早速ダンプを取ってみた。__cpu_simple_lock_try()はinline関数だから、展開先を作ってあげ…

OpenBSD/sgi on octane2 - option MULTIPROCESSORでの起動

一気にSMP実装を進めた所、どこにバグが有るのかさっぱり分からなくなって一度すべて元に戻した経緯が有る為、慎重に書き換えを行う事にしている。まずはコンフィグレーションファイルにて、 option MULTIPROCESSORを有効にし、cpuの定義は cpu0 at mainbus0…

OpenBSD/sgi on octane2 - timeout delayed

ユーザランドを起こす所でoption DEBUGを有効にしているとtimeout delayedというエラーが表示され、ユーザランドが動かない。 タイマ周りに何か問題があるように思うが、何が原因だろうか? System Maintenance Menu 1) Start System 2) Install System Soft…

OpenBSD/sgi on octane2 - セカンダリCPUが動いた!

4/30に書いた時にはうまく動作していなかったセカンダリCPUだが、Linuxのコードと良く比較した所MPCONFのアクセス方法が違っている事に気づき、これを修正した所CPU1が起動する事を確認出来た。具体的にはprom_boot_secondary()にて paddr_t mpconf = PHYS_T…

OpenBSD/sgi on octane2 - セカンダリCPUの起動とMPCONFについて

Linux(+RACER対応パッチ)のソースコードを読むと、セカンダリプロセッサ起動のルーチンは以下のように実装されている: /* arch/mips/sgi-ip30/ip30-smp.c */ void prom_boot_secondary(int cpu, struct task_struct *idle) { int pcpu=cpu_logical_map(c…

Android on octane2?

組み込みネット - 組み込みシステム開発にたずさわるエンジニアの方々や,ビジネス・パーソンの方々を支援するWebサイト / CQ出版株式会社 という訳だから、君はoctane2でDual MIPSなAndroidを作ったらどうかねwww と会社の人に言われた。 Android/sgiの需…

SMP環境下でのTLB Consistencyについて

SMP環境下でのTLB Consistencyについてまとめてみる。 UNIX INTERNALS - THE NEW FRONTIERSを参考にした。 カーネルは仮想メモリのアドレステーブルをメモリ上に管理しており、CPUは今アクセスしたばかりの仮想アドレス:物理アドレスの組み合わせを一定数(…

Spinlockと便器

OS

2log.net やばいwww 超解りやすいwwww