NetBSD の src/sys/arch/x68k/stand/boot/srt0.S のメモ。
| $Id: srt0.S,v 1.2 2009/11/20 07:17:17 isaki Exp $
|
| セカンダリブートローダのエントリポイントがあるあたりの解説です。
|
/* $NetBSD: srt0.S,v 1.1 2001/09/27 10:14:49 minoura Exp $ */
/*-
* Copyright (c) 2001 Minoura Makoto
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <m68k/asm.h>
| ここが /boot の開始位置。
| つまり $006000 番地におかれるところ。
| でも、いきなり start0 にジャンプする。
ASENTRY(start)
bra start0
| タイトルとバージョンをおいておく。
.ascii BOOT
.byte 0x20
.asciz BOOT_VERS
.even
/*
* via stack: (firstpa, physsize, esym)
* via regs: %d6: bootdev
* %d7: boothowto
* for /boot, only %d6 is used.
*
* プライマリブートローダから渡される引数は
* スタック渡しで: firstpa, physsize, esym
* レジスタ渡しで: d6 起動デバイス情報
* d7 起動方法
* ただし /boot では d6 しか使っていない。
*/
start0:
| スタック渡しされた値を d0 〜 d2 に取り出す。これは単に捨てただけ。
| start を sp に代入。つまり start 以下をスタックとして使用する。
moveml %sp@+,%d0-%d2
lea %pc@(start),%sp
| d6 (起動デバイス情報) をスタックに積む。
| sys/arch/x68k/stand/boot/boot.c::bootmain() へジャンプ。
movl %d6,%sp@-
jbsr _C_LABEL(bootmain)
/*
* exit() ... 終了。
* [Hit key to reboot] と表示してキー入力を待つ。入力があれば再起動。
*/
ENTRY_NOPROFILE(exit)
pea %pc@(reboot_msg)
jbsr _C_LABEL(printf)
jbsr _C_LABEL(getchar)
| trap #10 はリセット/電源オフ。
| d0.l が 'X68'<<8 + 1 〜 3 以外ならソフトウェアリセット。
| ここでは d0.l に関与してないのでたぶん上記以外になってるんじゃ
| ないかということかしら。
trap #10
reboot_msg: .asciz "\n[Hit key to reboot]"
.even
/*
* Detect MPU type. From locore.s.
* Note we've already confirmed it is not 68000/010.
* MPU タイプの判別。
* この時点で 68000/010 でないことは仮定できる、らしい。何故?
*/
ENTRY_NOPROFILE(detectmpu)
| まず 68030 かどうかを確かめる。
| CACR (キャッシュコントロールレジスタ?) の $0200 (ビット9?)
| は 68030 にしか存在しない。他にも 030 にしか存在しないビットは
| たくさんあるけど、たぶんこれが触っても無難なんでしょう。
| 意味はまったく分かってない...。
| このビットをセットしてもう一度読んでみる。読めれば 68030
| なので 3 を返す。
movl #0x200,%d0 | data freeze bit
movc %d0,%cacr | only exists on 68030
movc %cacr,%d0 | read it back
tstl %d0 | zero?
jeq Lnot68030 | yes, we have 68020/68040/68060
moveq #3,%d0
jra Lgo | no, we have 68030
Lnot68030:
| 同じく CACR レジスタのビット 31 は 68040/060 にしか
| 存在しないので、これをセットしてから読みこんでみて読みこめれば
| 68040/060。読めなければ 020 かしら? と思うことにする。
bset #31,%d0 | data cache enable bit
movc %d0,%cacr | only exists on 68040/68060
movc %cacr,%d0 | read it back
tstl %d0 | zero?
jeq Lis68020 | yes, we have 68020
| 他のデータにアクセスする前に CACR を元に戻しておく
moveq #0,%d0 | now turn it back off
movec %d0,%cacr | before we access any data
| CINVA は 040 以降の命令で CINVA BC は命令/データ両方の
| キャッシュを無効にするものらしい。
.word 0xf4d8 | cinva bc - invalidate caches XXX
| CACR レジスタのビット 30 は 68060 にしか存在しないので
| またこのビットを立ててから読みこんでみて読みこめれば 68060。
| 読みこめなければ 68040。
bset #30,%d0 | data cache no allocate mode bit
movc %d0,%cacr | only exists on 68060
movc %cacr,%d0 | read it back
tstl %d0 | zero?
jeq Lis68040 | yes, we have 68040
moveq #6,%d0
jra Lgo
Lis68040:
moveq #4,%d0
jra Lgo
Lis68020:
movl #2,%d0 | and a 68020 CPU
Lgo:
rts
/*
* Check if the given address is valid for byte read.
* From boot_ufs/boot.S.
* 引数で与えられたアドレスがバイト読み込みできるかどうかを
* 調べる。なんとなく中身は分かってるのでコメントつけるの後まわし。
*/
ENTRY_NOPROFILE(badbaddr)
lea 0x0008:W,%a1 | MPU Bus Error vector
moveq #1,%d0
lea %pc@(badr1),%a0
movew %sr,%sp@-
oriw #0x0700,%sr | keep out interrupts
movel %a1@,%sp@-
movel %a0,%a1@ | set bus error vector
movel %sp,%d1 | save sp
moveal %sp@(10),%a0
tstb %a0@ | try read...
moveq #0,%d0 | this is skipped on bus error
badr1: moveal %d1,%sp | restore sp
movel %sp@+,%a1@
movew %sp@+,%sr
rts
目次へ戻る
isaki@NetBSD.org