SMP

OpenBSD/sgi on octane2 - clock割り込み

cpu1でclock割り込みを起こしてみた。cpu_hatchでcpu_initclocks()を呼び、statusレジスタで割り込み有効にする。 void prom_cpu_hatch(struct cpu_info *ci) { char *cp; void *gp, *sp; asm volatile( "move %0, $gp\n" "move %1, $sp\n" : "=r"(gp), "=r"…

OpenBSD/sgi on octane2 - xheartreg.h, xheart.c

OpenBSD/sgiにもheartを制御するコードが入っていた。 単純に割り込みコントローラとして使っているように見える。 IPIは割り込みコントローラを直接叩くと割り込むという構造なのだろう。 /* $OpenBSD: xheartreg.h,v 1.2 2009/04/18 14:48:09 miod Exp $ *…

OpenBSD/sgi on octane2 - heart.h

Linux/sgi octaneのheart.hを全文掲載しておく。 /* * Copyright (C) 2004,5 Stanislaw Skowronek */ #ifndef _HEART_H #define _HEART_H /* HEART internal register space */ #define HEART_PIU_BASE 0x900000000FF00000 /* full addresses */ #define HEA…

OpenBSD/sgi on octane2 - HEARTというデバイス

octaneではHEARTというデバイスからIPIを送受信するようだ。こちらはLinuxのIPI送信部分のコード: /* HEART internal register space */ #define HEART_PIU_BASE 0x900000000FF00000 /* full addresses */ #define HEART_MODE ((volatile unsigned long *)H…

OpenBSD/sgi on octane2 - cpu1デバッグ用のcom1向け簡易printfの実装 その2

printf関係ないけど、要らんコードをちょっと捨てた。 #define COM_NPORTS 8 #define COMBBUF_SIZE 2048 int combfreq = 22000000 / 3; int combrate = (B9600); bus_addr_t combaddr = 0x500000 + IOC3_UARTB_BASE; bus_space_tag_t combiot = &sys_config.…

OpenBSD/sgi on octane2 - cpu1デバッグ用のcom1向け簡易printfの実装

調子にのってprintfも実装した。 #define COM_NPORTS 8 #define COM_FREQ 1843200 /* 16-bit baud rate divisor */ #define COMBBUF_SIZE 2048 int combfreq = 22000000 / 3; int combrate = TTYDEF_SPEED; bus_addr_t combaddr = 0x500000 + IOC3_UARTB_BAS…

OpenBSD/sgi on octane2 - cpu1デバッグ用のcom1向け簡易putcの実装 その2

>・・・・何故かcom0へ出力されてる。 そらそうだろ。 static void combputc(int c) { com_common_putc(comconsiot, comconsioh, c); } だって、com0へ出力してるもん、これ(comconsiot, comconsioh)。 って訳で書き換え。 static void combputc(int c) { …

OpenBSD/sgi on octane2 - cpu1デバッグ用のcom1向け簡易putcの実装

実装つってもdev/ic/com.cのコピペな訳だが、printfが動いてないかもしれないって事でcom1へダイレクトに出力が行えるコードを実装しようとしてみた。 #define COM_NPORTS 8 #define COM_FREQ 1843200 /* 16-bit baud rate divisor */ int combfreq = 220000…

OpenBSD/sgi on octane2 - ひ〜

ずっと嵌りまくってて今やっと自分が以前いじってたコードの正常動作が確認出来た。 そうか、cpuを1コアだけ動作させる時もoption MULTIPROCESSORを指定しないと起動してこないコードになってたのか(バグだよそれ。気がつかないで一週間過ぎてるしorz こっ…

OpenBSD/sgi on octane2 - cvs upしたらコンフリクトしまくってひどい目にあった件

どうせ大して更新されていないだろうとタカをくくって、何も考えずにcvs upしたらlocoreなあたりがコンフリクトしまくって収集つかなくなった。 やっと差分をみながらマージしたけど、うまく動かなくて結局捨てて元に戻すことにした。 cvs upは計画的に。い…

OpenBSD/sgi on octane2 - どうしてもprintf()で死ぬ理由の予想 が正しかったか否か

「現状のコードだとcpu1の動作確認の為にcpu0をwhileループで止めているから出力が永久に行われない」と予想して該当するwhileループを外し、cpu1を起動したらcpu0は起動シーケンスを続行するように書き換えてみたが、やっぱりcpu1のprintfは表示されないな…

OpenBSD/sgi on octane2 - どうしてもprintf()で死ぬ理由の予想

cpu1から呼んだprintfはバッファに文字列を溜め込むだけで出力はcpu0を介して行われる。 が、現状のコードだとcpu1の動作確認の為にcpu0をwhileループで止めているから出力が永久に行われない。 なのではないか?

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 - exception.S・tlbhandler.SにおけるGET_CPU_INFO()とコンテキスト保存、割り込みの話

exception.S・tlbhandler.Sでは、以下のような処理が行われている:1. Exception発生、ベクタアドレスにジャンプ 2. ベクタアドレスに設置されたハンドラはException要因を調べexceptionテーブルに書いてある関数へジャンプ 3. 割り込み前のコンテキストを保…

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 - 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…

NetBSD 5.0: Overview and Benchmarks

http://www.feyrer.de/NetBSD/bx/blosxom.cgi/nb_20090430_0013.html http://www.feyrer.de/NetBSD/bx/blosxom.cgi/nb_20090430_0022.htmlうっかり見落としていたが、いつの間にかNetBSD 5.0がリリースされていてベンチマークも行われていた。 昨年からNetBS…