MIPS

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 - どうしても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…

簡単に遊べるMIPSベースのマイコン

再び低レイヤープログラミングの勉強を始めるのに良い本・Webサイト - かーねる・う゛いえむにっきの件、MIPSで遊べるハードないかなぉ、という話について。たけおかさん直々のおすすめなので、取り上げさせて頂きます。PIC32|たけおか ぼちぼち日記 マイコ…

PSPでプログラミングなリンク集

環境はそれなりに整っているので、低レイヤな部分を色々いじって勉強するにはやっぱり良さそうに見える。 本とかは自重しているのかと思ったら、「改造!PSP」みたいな事口走ってる雑誌が山ほど出てるね。SCEIの事情とか関係ねーのな。特に低レイヤ部分で楽…

(PS1|PS2|PSP)で学ぶ低レイヤープログラミング

低レイヤープログラミングの勉強を始めるのに良い本・Webサイト - かーねる・う゛いえむにっきの話の続きだが、(PS1|PS2|PSP)で学ぶ低レイヤープログラミングって本があったらいいのに。(MIPSイイヨって言いたかっただけです、はい)でも、流石に本の冒頭で…

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