[ TOP | Recently ]

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