sgi octane

AsiaBSDCon 2010でお話します

大事な事なので何度も言うよ! AsiaBSDConでお話する事になりました。 私の発表は2010/3/13 15:30〜です。 AsiaBSDCon 2010 - 会議日程題名は、SMP Implementation for OpenBSD/sgiです。 まぁ、今までのOpenBSD workのまとめですね。 登録費がかなり高く、…

OpenBSD/sgiはcurrentのソースコードでSMP動作が可能になりました

cd /usr; cvs checkout -P src でGENERIC-IP30に option MULTIPROCESSORを書き加えてカーネルをビルドすればSMPで起動します。まだ足りない機能があり動作も不安定ですが、とりあえずブートくらいは可能です。

but…

interrupt 100%ってなにそれこわい load averages: 0.15, 1.88, 2.69 20:43:19 20 processes: 19 idle, 1 on processor CPU0 states: 0.0% user, 0.0% nice, 0.0% system, 100% interrupt, 0.0% idle CPU1 states: 0.0% user, 0.0% nice, 0.0% system, 100% …

OpenBSD/sgi SMP動きました!

きゃほーい( ´∀`) load averages: 5.27, 2.97, 1.43 20:26:08 34 processes: 4 running, 28 idle, 2 on processor CPU0 states: 87.5% user, 0.0% nice, 0.0% system, 12.5% interrupt, 0.0% idle CPU1 states: 87.9% user, 0.0% nice, 0.0% system, 12.1…

login未遂事件

残念です(´・ω・`)… >> bootp(): Setting $netaddr to 192.168.3.2 (from server ) Obtaining from server 5175104+561280 entry: 0xa800000020020000 ARCS64 Firmware Version 64.0 Found SGI-IP30, setting up. Initial setup done, switching console. Co…

OpenBSD committerに捕捉された

今朝、会社に着いてメールチェックしたらOpenBSD committerからメール着ててCc: Theoになっててドン引きしたこのブログを見付けて機械翻訳して読んでみたがヨメねぇ!って書いてあったwwwwどう返事を返そう、、、

OpenBSD/sgi on octane2 - ipi割り込み その3

void mips64_ipi_init(void) { unsigned cpu = cpu_number(); int ret; ret = xheart_intr_establish(mips64_ipi_intr, NULL, HEART_INTR_IPI(cpu), IPL_HIGH, "ipi"); if (ret) panic("xheart_intr_establish failed:%d\n", ret); } 間違えて引数に割り込み…

OpenBSD/sgi on octane2 - ipi割り込み その2

cpu1を一旦切って、cpu0だけでIPI割り込みのテストを続行中。 Linuxのコードと見比べたが、IRQとかは今ので正しいような気がする。 が、どうしても割り込み入らない。絶対初期化が間違ってると思うので、その辺りを家宅捜索中。 int xheart_intr_establish(i…

OpenBSD/sgi on octane2 - ipi割り込み

取り合えず実装してみたんだが、動いていない模様。 うーん。xheartのデータシートが欲しいよう。HEART_INTR_IPI(x)はHEART_INTR_MAXよりデカいけど正しいのか分からない。 HEART_IMR(0)はHEART_IMR(cpu_number())に書き直した。 Index: xbow/xheartreg.h ==…

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 - ひ〜

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

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

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

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…