1999-06-17 boot ?
ROMモニタで ss -m で見える値
> ss -m Memory use: diag info: bf881800 environ: bf881000 apinfo: bf880000 sysinfo: 9ff03270 alloc list: ffffbff8 max mem: 04000000 free mem: 03ff0db8 mem base: 100000000
の、sysinfo (0x9ff03270) が、NEWS-OS の /usr/include/apbus/sysinfo.h に定義されてる構造体
/* * System's information block. * Starts at SYSINFO_BASE. */ struct apf_sysinfo { /* 0*/ long32 si_revision; /* APbus firmware revision */ /* 4*/ long32 (*si_apcall)(); /* APcall entry point */ /* 8*/ ulong32 si_errno; /* general error code register */ /* 12*/ addr32 si_loadbase; /* base of program load area */ /* 16*/ addr32 si_loadlimit; /* limit of program load area */ /* 20*/ struct apf_device *si_devlist; /* device structure list */ /* 24*/ struct apf_bus *si_buslist; /* APbus structure list */ /* 28*/ ulong32 si_exerrno; /* extended error code register */ :
だということがわかった。
で、(*si_apcall)() が ROM のサービスルーチンへのポインタで、こいつを
/usr/include/apbus/apcall.h に定義されてる通り、
apcall.h:#define _apcall (*APS_APCENT) apcall.h:#define _exit(a) (*APS_APCENT)(APC_EXIT,(a)) apcall.h:#define _read(a,b,c) (*APS_APCENT)(APC_READ,(a),(b),(c)) apcall.h:#define _write(a,b,c) (*APS_APCENT)(APC_WRITE,(a),(b),(c)) apcall.h:#define _open(a,b) (*APS_APCENT)(APC_OPEN,(a),(b)) apcall.h:#define _close(a) (*APS_APCENT)(APC_CLOSE,(a)) apcall.h:#define _lseek(a,b,c) (*APS_APCENT)(APC_LSEEK,(a),(b),(c)) : sysinfo.h:#define APS_APCENT (_sip->si_apcall)
みたいに呼べばいいだけのようだ。
kernel から bios の routing を呼べるようにしとけば、何も考えずにおっけー?
やった。
かんぺき。
#define SYSINFO_BASE 0x9ff03270
とやっちゃっていいのかな...? よくないよな。
なにかでわかるはずだけど...(ごそごそ
vmunix を見ると、どうやら boot が kernel に register で渡してるようだ...。
/vmunix 〜 80001a04 <start>: 80001a04: 24020023 li $v0,35 80001a08: 40828000 mtc0 $v0,$16 80001a0c: 3c023000 lui $v0,0x3000 〜〜 80001a44: 0080d821 move $k1,$a0 ← argv[0] 80001a48: 00a0b821 move $s7,$a1 ← argv[1] 80001a4c: 3c04a000 lui $a0,0xa000 80001a50: 8fba0010 lw $k0,16($sp) ← argv[4] 80001a54: 00c0b021 move $s6,$a2 ← argv[2] 80001a58: 00e0a821 move $s5,$a3 ← argv[3] 80001a5c: 24851000 addiu $a1,$a0,4096 〜〜 80001b5c: 3c088015 lui $t0,0x8015 80001b60: 2508065c addiu $t0,$t0,1628 80001b64: 3c01a000 lui $at,0xa000 80001b68: 01014025 or $t0,$t0,$at ← t0 = x0x80150000+1628 = 0x8015065c = _sip 80001b6c: 0c02f5c9 jal 800bd724 <config_cache> 80001b70: ad1a0000 sw $k0,0($t0) ← k0 を _sip に格納
どうしよう。#ifdef news5000 で locore.s の最初でどっか変数に格納するか。
でも arch/mips/mips/ の下に ifdef news5000 を入れるのも汚いなぁ。むぅ。
EOF