「BSD小僧の日記」
2005/06版 その2



2005/06/11 (土)

3年と118日目

本人から今日は帰りませんと電話がありました。


[View Log(0)] [Trackback]
Name: Comment:

二日酔い

まぁ、昼まで使い物にならず。昼からもだけど。まぁ、ビールだけだったのでかなりマシですね。ホッピーで泥酔すると一日復活できないからなー。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

tsarmベースのkernelをさっそく書き込んでみる。

なんか書き込みソフトがpanicとかダイアログ出しましたよ。

サイズが大きすぎるのかなぁ、と思ってnetbsd.binをgzipして書き込んでみると成功。

ブートさせてみるとちゃんとUncompressしてくれるみたい。

しかし、うんともすんともいわない。

とりあえず、armadillo9_start.Sをすぎて、armadillo9_machdep.cのinitarm()に入っていたら、すぐにconsinit()が呼ばれてシリアルが初期化されるので、何らかのメッセージが表示されるはずである。

ということで、armadillo9_start.Sの中で死んでいるか、それすらもできていないということになるだろう。

シリアルが使えないとしたらLEDデバッグやbeepデバッグをすることになるのかなぁ。

ってことで、ハードウェアマニュアルを読んでみると29ページにLED (D1)というのがあって、GPIO Port Eに接続されたLEDがあるらしい。

こいつはhermitというモニタプログラムが起動しているときには点灯しているが、kernelとuserlandを展開後して、kernelへ制御をうつす時に消灯している。

なので、このLEDを点灯させることができれば、どこまで実行されているかを知ることができるんじゃないかと思ってGPIO Port Eのアドレスを直接叩く方法を考える。

OBS266でLEDを直接叩いたときは、特定のアドレスに値を代入するという方法を教えてもらったので、それに挑戦。

たしか、こんな感じで書くのだった。

*(volatile int *)0xef600700 = ~0;

GPIO Port EてことはEP93XX_GPIO_PEDRに何か書いてやれば点灯するのかな。

EP93XX_GPIO_PEDRは次の三つのアドレスの和になるはず。

  • 0x80800000 : EP93XX_APB_HWBASE
  • 0x00040000 : EP93XX_APB_GPIO
  • 0x00000020 : EP93XX_GPIO_PEDR

ということで、0x80840020に0xffあたりを書いてあげればLEDが点灯しそうな気がする。

で、アセンブラがよくわからんのよ。こんなんでいいの?

        mov     r3, #-2147483616
        add     r3, r3, #8650752
        mov     r2, #255
        str     r2, [r3, #0]

ということで、このコードを次のアセンブラの前に埋めてみた (Heave-ho! って「どっこいしょ」という意味らしい)。

mov     pc, r8                  /* Heave-ho! */

すると、緑のLEDと赤のLEDが点灯する。Armadillo-9の基盤上だと緑のLEDがD1で赤のLEDがD2。っていうか、赤のLEDってなに?

しかも、モニタプログラムのプロンプトに戻ってくる。

きっとGPIO PortE Pin 0が緑のLEDでPin 1が赤のLEDじゃないかなー、ということで、GPIO Port Eに255を書き込むのではなく、1と2を試してみる。

どうやら、1を書くと緑のLEDが点灯し2を書くと赤のLEDが点灯するようだ。当然ながら、3を書くと両方点灯する。

で、赤のLEDが点灯したときだけモニタプログラムのプロンプトに戻ってくるみたい。なので、1を書いたときはそのまま停止 (ダンマリ)。

さらに、今気づいたんだけどGPIOのPortって入力か出力かを設定してあげなきゃいけないんだろうか。だったらGPIO_PEDDRも設定しないといけないのかも。

  • 0x00000024 : EP93XX_GPIO_PEDDR

まぁ、いずれにせよ緑のLEDを使って場所を特定していくことになるのかな。

ということで、ほんの少しだけずらしてみる。

        mov     pc, r8                  /* Heave-ho! */
Lunmapped:
        /*
         * We want to construct a memory map that maps us
         * VA==PA (SDRAM at 0x00000000). We create these
         * mappings uncached and unbuffered to be safe.
         */
        /* GPIO Port E */
        mov     r3, #-2147483616
        add     r3, r3, #8650752
        mov     r2, #1
        str     r2, [r3, #0]
        /*
         * Step 1: Map the entire address space VA==PA.
         */
        adr     r4, Ltable
        ldr     r0, [r4]                        /* r0 = &l1table */

うーん。LEDは点灯しません。えー、実質何もしていない気がするんですけど。

        mov     pc, r8                  /* Heave-ho! */

これってpcにr8の内容を代入しているんですよね。

で、r8の内容はその前に

        adr     r8, Lunmapped
        bic     r8, r8, #0xff000000     /* clear upper 8 bits */
ってなっているのです。ですから、LunmappedなラベルのアドレスをPCに入れたということになって、Lunmappedなアドレスから命令が実行されるのかなと。

であれば、真っ先にLEDが光らないといけないような気がするんですが...

clear upper 8 bitsというのは気になります。なんでこんなことしてるんだろ。

さて、とりあえず mov pc, r8で死んでいるとして、それをやめたらどうなるの? ということで、すこしづつ進めてみる。

どうやらMMUを有効にするところで死ぬようだ。

        /* OK, let's enable the MMU. */
        mrc     p15, 0, r2, c1, c0, 0
        orr     r2, r2, #CPU_CONTROL_MMU_ENABLE
        mcr     p15, 0, r2, c1, c0, 0

ということで、きょうはここまで。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/12 (日)

3年と119日目

鼻血がでた。結構大量に。


[View Log(0)] [Trackback]
Name: Comment:

風呂

風呂に錠剤を入れて追い炊きするタイプの洗浄剤をつかってみた。

たしかに汚れが浮いてきているような気がする。が、これは風呂釜のなかの汚れかどうかは判断できないな。やっぱり浴槽をきれいに洗ってからやってみればよかったな。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

Armadillo-9のソフトウェアマニュアルP30の表8-2にメモリマップ(RAM)について書かれている。

それによるとFlashメモリから展開・コピーされるkernelのアドレスは0xc0018000と書いてある。

evbarm/conf/std.armadillo9にはLOADADDRESSというmakeoptionsが書かれていて0xc020000になっている。mk.armadillo9も同様のアドレスが書かれている。

ここも直すのかな。0xc0200000と0xc0018000だと結構違いがあるなぁ。mk.armadillo9はPHYなアドレスも同じようにしないといけないことに。

いずれにせよarmadillo9_start.SのStep 1からStep 6までを理解しないといけないということなのか。

        /*
         * Step 1: Map the entire address space VA==PA.
         */
        adr     r4, Ltable
        ldr     r0, [r4]                        /* r0 = &l1table */
        mov     r1, #(L1_TABLE_SIZE / 4)        /* 4096 entry */
        mov     r2, #(L1_S_SIZE)                /* 1MB / section */
        mov     r3, #(L1_S_AP(AP_KRW))          /* kernel read/write */
        orr     r3, r3, #(L1_TYPE_S)            /* L1 entry is section */
1:
        str     r3, [r0], #0x04
        add     r3, r3, r2
        subs    r1, r1, #1
        bgt     1b

L1_TABLE_SIZEなどL1_***な定義はarm/include/arm32/pte.hにある。Ltableは.word 0x4000となっている。

  1. r4に0x4000をロード
  2. r0に0x4000番地をロード
  3. r1に4096を代入
  4. r2にL1_S_SIZEを代入 (1MB)
  5. r3にkernel read/writeなフラグをセット
  6. フラグをセットしたr3とL1_TYPE_S (section) の論理和を計算
  7. r3の内容をr0が示す番地にストアし、r0に0x04を加算
  8. r3にL1_S_SIZEを加算
  9. r1から1減算
  10. 三つ前までを4096回繰り返すループ

1MBを4096回繰り返せば4GBだからMap the entire address space VA==PAというのもなんとなく理解できる。で、mapするためのテーブルが0x4000番地から4kつかわれるということか?

以降のStep 2からStep 6はStep 1で初期化したVA==PAなテーブルに変更をかけていくということになるんですかねぇ?


[View Log(0)] [Trackback]
Name: Comment:

2005/06/13 (月)

3年と120日目

めずらしく早く起きましたよ。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

とりあえず、ハードウェアマニュアルのメモリマップを参考にVAとPAのマッピングを見よう見まねで作成してみた。

残念ですが、動きません。

書いたアセンブラも怪しいが、そもそもの考え方が間違っている可能性が高い。

そもそも、mov pc, r8で止まる理由とか解決していないし。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/14 (火)

3年と120日目

おれ自身が眠いっす。

夜に鼻血が出た。なんか、暑くなってきたからのぼせぎみなのかな。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

ちっとも動かないので気分転換にLinuxのコードを再び読む。

いまメモリマップでハマっているつもりなんだけど、実際のところはざっくりとマッピングすれば良い気がしてきた。

というのも、物理メモリと仮想メモリのマッピングはarch/arm/mach-ep93xx/mm.cの次の構造体ぐらいしか情報がなさそうに見える。mmがMemory Mapの略だというのに今日気づいたのがなかなかニブい自分をさらけ出す。

static struct map_desc ep93xx_io_desc[] __initdata = 
{
    //
    // Virtual Address                Physical Addresss    Size in Bytes  Domain     R  W  C  B Last
    { IO_BASE_VIRT,                   IO_BASE_PHYS,        IO_SIZE,       DOMAIN_IO, 0, 1, 0, 0 },
    { PCMCIA_BASE_VIRT,               PCMCIA_BASE_PHYS,    PCMCIA_SIZE,   DOMAIN_IO, 0, 1, 0, 0 },
#ifdef CONFIG_ARCH_ARMADILLO9
    { MISC8_BASE_VIRT,                MISC8_BASE_PHYS,     MISC8_SIZE,    DOMAIN_IO, 0, 1, 0, 0 },
    { MISC16_BASE_VIRT,               MISC16_BASE_PHYS,    MISC16_SIZE,   DOMAIN_IO, 0, 1, 0, 0 },
#endif
    LAST_DESC
};

また、IO_BASE_PHYSなどの定数類はinclude/asm-arm/arch-ep93xx/regmap.hで定義されているのでこれらを拾ってくれば良いということになる。

極端な話、VA==PA, IO_BASE, PCMCIA_BASEの三つを初期化すりゃ、動いてくれるんじゃないかなぁ。

そうはいっても、手がかりが全然つかめないのでevbarmの下をじろじろと眺める。

で、Armadillo-9のメモリマップではPAの0xc000000はVAの0xc000000にマッピングされるのがTS-7200との違い (TS-7200はVAが0x00000000) だなぁ、と思いつつevbarm/*/*_start.Sを眺める。

すると、tsarm (TS-7200) ではSDRAM at 0x00000000と書かれているのがadi_brhでSDRAM at 0xc000000と書かれている。これは、Armadillo-9と同じじゃないかなぁ。

evbarm/adi_brh/brh_start.Sを読むと色々なことがわかった。

tsarmのtsarm_start.Sで

        add     r8, pc, #Lunmapped
        bic     r8, r8, #0xff000000     /* clear upper 8 bits */

って、どういう意味じゃい。とか、

        mov     pc, r8                  /* Heave-ho! */

でハングアップするのはなんでだろ。とか思っていた。

brh_start.Sでは、

        add     r8, pc, #(.Lunmapped - . - 8)
        bic     r8, r8, #0xff000000     /* clear upper 8 bits */
        orr     r8, r8, #0xc0000000     /* OR in physical base address */

というように物理アドレスへのORをとっていて

        mov     pc, r8                  /* Heave-ho! */

てな感じで.Lunmappedなアドレスにジャンプするということがわかる。

conf/mk.adi_brhやconf/mk.tsarmをみるとkernelがロードされる物理アドレスと仮想アドレスが示されているけれど、これらも勘案すると0xc0000000な Armadillo-9はtsarmを参考にするよりもむしろadi_brhを参考にした方が良いのでは?

と思い、brh_start.Sを参考に、とりあえずIO_BASEは置いといてVA==PAなマップを作るだけのarmadillo9_start.Sを書いて、mk.armadillo9, std.armadillo9のアドレス指定も0xc0200000に直してkernelを作ってみた。

すると、これまで動かなかったmov pc, r8を通過し、armadill9_start.Sの最後の方のMMUをenableするところまで動いた (LEDが光った)。

ということで、adi_brhを参考にする作戦は良かったみたい。

もしかしたら、IO_BASEとかちゃんと書けば、もっと先に進むかも。

とか思っていたのだけど、ARMのアセンブラに阻まれる。

たとえば、こんなの。

        add     r0, pc, #(Ltable - . - 8)
(中略)
Ltable:
        .word   0xc0004000

この#(Lhoge - . - 8)という表現がわからん。r0 = pc + 0xc000400だと意味不明だし。

そのあとに

        ldr     r0, [r0]                        /* r0 = &l1table */

って書いてある。ようは、「r0に0xc0004000番地の内容をロードした」ということなんだろうか。結論はそうだとしても、mov r0 #Ltableじゃダメなのかなぁ、ダメなんだろうからこう書いているんだろうなぁ。

このアセンブラの表記はARMって言う話じゃなくてGNU asの表記方法なのだろうか。よくわからんよ。しかも、adi_brhしかこういう表記していないっぽい。

とにかく、もっとじっくり考えないとダメかな。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/15 (水)

3年と121日目

今日も、おれ自身が眠いっす。

朝にも鼻血が出た。鼻の粘膜が過敏になっているのかもしれない。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

さすがに睡眠不足なので、何もせずに寝る。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/16 (木)

3年と122日目

さすがによく寝たので朝から調子が良い。

雨はいやだなぁ。今日は小雨だけれども。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

掲示板や日記でアセンブラの指南をいただく。ありがたいことです。

#(Lhoge - . - 8)の表記についての謎が解けました。

adrはGNU asの疑似命令というのもなるほどという感じ。

ということで、adi_brhは「(一見まわりくどいが)ARMらしいコーディング」ということになるのでしょうか。

その他のadrを使っているevbarmは「GNU asの疑似命令を使って可読性を重視したコーディング」という感じなのかな。

個人的にはadrを使ってわかりやすい方が今のところ理解をしやすそうなので、そっちを使っていこうかな。

などと思いつつ、なんの作業もしないのでありました。

こういうとき元気を付ける読み物と言えばNetBSD/news68kへの道 (http://www.ceres.dti.ne.jp/~tsutsui/netbsd/port-news68k.html)でしょう。

読むだけで元気が出るのです。

news68kに比れば、文献やLinuxのソースがある私などは動かないほうがおかしい、という感じかもしれない。

printfが動くのはいつになるだろうか。

今週末のNBUG例会であっさりと動作報告とかありそうな気もするけれど。


[View Log(0)] [Trackback]
Name: Comment:

のみかい

ビール二杯、ホッピー二杯、ウーロン茶一杯。

サプライズが二つほど。

ついに買うものがなくなりましたかという話とついにそれに手を出しましたかという話。

なにごとも経験というのは大切ですね。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/17 (金)

3年と123日目

あさもよるも。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

ふとarch/arm/ep93xx/ep93xxreg.hにも定義があったなと思い出した。

関係しそうな三つは次のように変更した。

#define EP93XX_IO_VBASE    0xff000000UL
#define EP93XX_AHB_VBASE   0xff000000UL
#define EP93XX_APB_VBASE   0xff300000UL

で、ダンマリで先に進まず、やっぱり何も変わらないので原因を調査するべくobjdump -S netbsdと逆アセンブルしてみる。逆アセンブルなんて初めてやってみたな。

逆アセンブルの結果、一番始めには、まさに今さわっているarmadillo9_start.Sがあるようだ。見慣れたLunmappedなどというラベルも見える。

/export/o/20050529/evbarm/sys/arch/evbarm/compile/ARMADILLO9/netbsd:     file format elf32-littlearm
Disassembly of section .start:
00200000 <armadillo9_start>:
  200000:       e28f8020        add     r8, pc, #32     ; 0x20
  200004:       e3c884ff        bic     r8, r8, #-16777216      ; 0xff000000
  200008:       e3888103        orr     r8, r8, #-1073741824    ; 0xc0000000
  20000c:       ee112f10        mrc     15, 0, r2, cr1, cr0, {0}
  200010:       e3c22001        bic     r2, r2, #1      ; 0x1
  200014:       ee012f10        mcr     15, 0, r2, cr1, cr0, {0}
  200018:       e1a00000        nop                     (mov r0,r0)
  20001c:       e1a00000        nop                     (mov r0,r0)
  200020:       e1a00000        nop                     (mov r0,r0)
  200024:       e1a0f008        mov     pc, r8
00200028 <Lunmapped>:
  200028:       e28f40b4        add     r4, pc, #180    ; 0xb4
  20002c:       e5940000        ldr     r0, [r4]
  200030:       e3a01a01        mov     r1, #4096       ; 0x1000
  200034:       e3a02601        mov     r2, #1048576    ; 0x100000
  200038:       e3a03b01        mov     r3, #1024       ; 0x400
  20003c:       e3833002        orr     r3, r3, #2      ; 0x2
  200040:       e4803004        str     r3, [r0], #4
  200044:       e0833002        add     r3, r3, r2
  200048:       e2511001        subs    r1, r1, #1      ; 0x1
  20004c:       cafffffb        bgt     200040 <Lunmapped+0x18>
  200050:       e5940000        ldr     r0, [r4]
  200054:       e2800dff        add     r0, r0, #16320  ; 0x3fc0
  200058:       e3a03102        mov     r3, #-2147483648        ; 0x80000000
  20005c:       e3833b01        orr     r3, r3, #1024   ; 0x400
  200060:       e3833002        orr     r3, r3, #2      ; 0x2
  200064:       e4803004        str     r3, [r0], #4
  200068:       e5940000        ldr     r0, [r4]
  20006c:       e2800dff        add     r0, r0, #16320  ; 0x3fc0
  200070:       e2800020        add     r0, r0, #32     ; 0x20
  200074:       e3a03102        mov     r3, #-2147483648        ; 0x80000000
  200078:       e2833502        add     r3, r3, #8388608        ; 0x800000
  20007c:       e3833b01        orr     r3, r3, #1024   ; 0x400
  200080:       e3833002        orr     r3, r3, #2      ; 0x2
  200084:       e4803004        str     r3, [r0], #4
  200088:       e0833002        add     r3, r3, r2
  20008c:       e4803004        str     r3, [r0], #4
  200090:       e28f004c        add     r0, pc, #76     ; 0x4c
  200094:       e5900000        ldr     r0, [r0]
  200098:       ee020f10        mcr     15, 0, r0, cr2, cr0, {0}
  20009c:       ee080f17        mcr     15, 0, r0, cr8, cr7, {0}
  2000a0:       e3a00001        mov     r0, #1  ; 0x1
  2000a4:       ee030f10        mcr     15, 0, r0, cr3, cr0, {0}
  2000a8:       e59f1038        ldr     r1, [pc, #56]   ; 2000e8 <Lstart>
  2000ac:       e1a01001        mov     r1, r1
  2000b0:       ee112f10        mrc     15, 0, r2, cr1, cr0, {0}
  2000b4:       e3822001        orr     r2, r2, #1      ; 0x1
  2000b8:       ee012f10        mcr     15, 0, r2, cr1, cr0, {0}
  2000bc:       e1a00000        nop                     (mov r0,r0)
  2000c0:       e1a00000        nop                     (mov r0,r0)
  2000c4:       e1a00000        nop                     (mov r0,r0)
  2000c8:       ee122f10        mrc     15, 0, r2, cr2, cr0, {0}
  2000cc:       e1a02002        mov     r2, r2
  2000d0:       e3a03182        mov     r3, #-2147483616        ; 0x80000020
  2000d4:       e2833721        add     r3, r3, #8650752        ; 0x840000
  2000d8:       e3a02001        mov     r2, #1  ; 0x1
  2000dc:       e5832000        str     r2, [r3]
  2000e0:       e1a0f001        mov     pc, r1
002000e4 <Ltable>:
  2000e4:       c01fc000        andgts  ip, pc, r0
002000e8 <Lstart>:
  2000e8:       c02000ec        eorgt   r0, r0, ip, ror #1
Disassembly of section .text:
c02000ec <kernel_text>:
c02000ec:       e28f103c        add     r1, pc, #60     ; 0x3c
c02000f0:       e8912006        ldmia   r1, {r1, r2, sp}
c02000f4:       e0422001        sub     r2, r2, r1
c02000f8:       e3a03000        mov     r3, #0  ; 0x0
c02000fc:       e4813004        str     r3, [r1], #4
c0200100:       e2522004        subs    r2, r2, #4      ; 0x4
c0200104:       cafffffc        bgt     c02000fc <kernel_text+0x10>
c0200108:       e3a0b000        mov     fp, #0  ; 0x0
c020010c:       eb02ed99        bl      c02bb778 <initarm>
c0200110:       e1a0d000        mov     sp, r0
c0200114:       e3a0b000        mov     fp, #0  ; 0x0
c0200118:       e1a0c00d        mov     ip, sp
c020011c:       e92dd800        stmdb   sp!, {fp, ip, lr, pc}
c0200120:       e24cb004        sub     fp, ip, #4      ; 0x4
c0200124:       eb00adcb        bl      c022b858 <main>
c0200128:       e28f000c        add     r0, pc, #12     ; 0xc
c020012c:       ea016064        b       c02582c4 <panic>
c0200130:       c0349e84        eorgts  r9, r4, r4, lsl #29
c0200134:       c0356570        eorgts  r6, r5, r0, ror r5
c0200138:       c034a684        eorgts  sl, r4, r4, lsl #13
c020013c:       6e69616d        powvsez f6, f1, #5.0
c0200140:       72202928        eorvc   r2, r0, #655360 ; 0xa0000
c0200144:       72757465        rsbvcs  r7, r5, #1694498816     ; 0x65000000
c0200148:       0064656e        rsbeq   r6, r4, lr, ror #10
c020014c:       c0354170        eorgts  r4, r5, r0, ror r1

で、<Lstart>のあとの<kernel_text>というのがarmadillo9_start.Sのあとに実行されるのだろう。2000a8:で<Lstart>の値、つまりc02000ec、つまりc02000ec番地の<kernel_text>っていうことだからなぁ。

んで、<kernel_text>をしばし実行するとc020010cに<initarm>に飛ぶような命令になっている。おぉ、結構すぐにinitarm()に入るのだなと思い、<initarm>のアドレスであるc02bb778を見ると次のようになっている。

c02bb778 <initarm>:
c02bb778:       e1a0c00d        mov     ip, sp
c02bb77c:       e92ddff0        stmdb   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
c02bb780:       e3a03182        mov     r3, #-2147483616        ; 0x80000020
c02bb784:       e24cb004        sub     fp, ip, #4      ; 0x4
c02bb788:       e2833721        add     r3, r3, #8650752        ; 0x840000
c02bb78c:       e3a02002        mov     r2, #2  ; 0x2
c02bb790:       e24dd014        sub     sp, sp, #20     ; 0x14
c02bb794:       e5832000        str     r2, [r3]
c02bb798:       eb000252        bl      c02bc0e8 <consinit>
c02bb79c:       e59f0864        ldr     r0, [pc, #2148] ; c02bc008 <.text+0xbbf1c>
c02bb7a0:       ebfe7522        bl      c0258c30 <printf>

<initarm>に入るとすぐにLEDを光らせるコードが入っている (c02bb780:からc0bb78c:)。

それでもLEDが光らないってことは、armadillo9_start.Sをでてからinitarm()に入るまでの、ほんの数個の命令のところで死んでいるっていうことなんだろうか。

うーん、いよいよわかんなくなってきたぞ。

関係ないけど、逆アセンブルっておもしろいね。

armadillo_start.Sのソースはこんな感じ。ライセンスは元ファイル (evbarm/tsarm/tsarm_start.S) と同様。

#include <machine/asm.h>
#include <arm/armreg.h>
#include <arm/arm32/pte.h>
#include <arm/ep93xx/ep93xxreg.h>
        .section .start,"ax",%progbits
        .global _C_LABEL(armadillo9_start)
_C_LABEL(armadillo9_start):
        /*
         * We will go ahead and disable the MMU here so that we don't
         * have to worry about flushing caches, etc.
         *
         * Note that we may not currently be running VA==PA, which means
         * we'll need to leap to the next insn after disabing the MMU.
         */
        adr     r8, Lunmapped
        bic     r8, r8, #0xff000000     /* clear upper 8 bits */
        orr     r8, r8, #0xc0000000     /* OR in physical base address */
        /*
         * Setup coprocessor 15.
         */
        mrc     p15, 0, r2, c1, c0, 0
        bic     r2, r2, #CPU_CONTROL_MMU_ENABLE
        mcr     p15, 0, r2, c1, c0, 0
        nop
        nop
        nop
        mov     pc, r8                  /* Heave-ho! */
Lunmapped:
        /*
         * We want to construct a memory map that maps us
         * VA==PA (SDRAM at 0xc0000000). We create these
         * mappings uncached and unbuffered to be safe.
         */
        /*
         * Step 1: Map the entire address space VA==PA.
         */
        adr     r4, Ltable
        ldr     r0, [r4]                        /* r0 = &l1table */
        mov     r1, #(L1_TABLE_SIZE / 4)        /* 4096 entry */
        mov     r2, #(L1_S_SIZE)                /* 1MB / section */
        mov     r3, #(L1_S_AP(AP_KRW))          /* kernel read/write */
        orr     r3, r3, #(L1_TYPE_S)            /* L1 entry is section */
1:
        str     r3, [r0], #0x04
        add     r3, r3, r2
        subs    r1, r1, #1
        bgt     1b
        /*
         * Step 2: Map VA 0xff000000->0xff100000 to PA 0x80000000->0x80100000.
         */
        ldr     r0, [r4]
        add     r0, r0, #(0xff0 * 4)            /* offset to 0xff000000 */
        mov     r3, #0x80000000
        orr     r3, r3, #(L1_S_AP(AP_KRW))
        orr     r3, r3, #(L1_TYPE_S)
        str     r3, [r0], #4
        /*
         * Step 3: Map VA 0xff800000->0xffa00000 to PA 0x80800000->0x80a00000.
         */
        ldr     r0, [r4]
        add     r0, r0, #(0xff0 * 4)            /* offset to 0xff000000 */
        add     r0, r0, #(0x8 * 4)              /* offset to 0xff800000 */
        mov     r3, #0x80000000
        add     r3, r3, #0x00800000
        orr     r3, r3, #(L1_S_AP(AP_KRW))
        orr     r3, r3, #(L1_TYPE_S)
        str     r3, [r0], #0x4
        add     r3, r3, r2
        str     r3, [r0], #0x4
        /* OK!  Page table is set up.  Give it to the CPU. */
        adr     r0, Ltable
        ldr     r0, [r0]
        mcr     p15, 0, r0, c2, c0, 0
        /* Flush the old TLBs, just in case. */
        mcr     p15, 0, r0, c8, c7, 0
        /* Set the Domain Access register.  Very important! */
        mov     r0, #1
        mcr     p15, 0, r0, c3, c0, 0
        /* Get ready to jump to the "real" kernel entry point... */
        ldr     r1, Lstart
        mov     r1, r1                  /* Make sure the load completes! */
        /* OK, let's enable the MMU. */
        mrc     p15, 0, r2, c1, c0, 0
        orr     r2, r2, #CPU_CONTROL_MMU_ENABLE
        mcr     p15, 0, r2, c1, c0, 0
        nop
        nop
        nop
        
        /* CPWAIT sequence to make sure the MMU is on... */
        mrc     p15, 0, r2, c2, c0, 0   /* arbitrary read of CP15 */
        mov     r2, r2                  /* force it to complete */
        /* GPIO Port E (LED D1)*/
        mov     r3, #0x80000020
        add     r3, r3, #0x840000
        mov     r2, #1
        str     r2, [r3, #0]
        mov     pc, r1                  /* leap to kernel entry point! */
Ltable:
        .word   0xc0200000 - 0x00004000
Lstart:
        .word   start


[View Log(0)] [Trackback]
Name: Comment:

2005/06/18 (土)

3年と124日目

休みにしてはけっこう朝早く起きて、午前中から午後にかけてゴロゴロ。

午後からアキバにいきました。


[View Log(0)] [Trackback]
Name: Comment:

アキバ

あんまりウロウロできず、マウスを一個買いました。

光学式マウス, CB-MOU4-WH, クレバリー, 1,333円, クレバリーインターネット館, USB接続

あと、アソビットシティ2号館で両替目的に単4の電池を買ったり、ガシャポン二回とプラレールのレール (二倍直線、二倍曲線) を買ったり。

アソビットシティ2号館の上の方の鉄道模型の階は好きな人にはたまらないだろうなぁ。

最後に書泉でTECH-I Vol.18 ARMプロセッサ入門を買ってきた。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

何もやってませんがARMプロセッサ入門を買ってきたので勘弁してください。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/19 (日)

3年と125日目

近くの公園へ。

マジマジ言いすぎにつき、しばらくマジ断ち。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

Linux環境を整えるべくLinuxをインストールする、というのはできないので、coLinuxというのに手を出してみる。Windowsでも簡単にLinux環境が構築できる。

これは便利だ。

などと言っているが、NetBSDは全く進展がない。

kernelの開始アドレスが0xc0018000じゃなくて0xc0200000から始まっているのをIRCで指摘されて、そういえばそうだったぞ、と思い出す。

0xc0200000にしたのは、SDRAMが0xc0000000の他のevbarmな計算機が0xc0200000とmk.XXXXに指定していたから真似しました、という弱い理由だったりするので、やっぱり0xc001800が正しいのかもしれない。


[View Log(0)] [Trackback]
Name: Comment:

さよならMac OS X

Let's NoteにNetBSDとXを入れてしばらく使っていると、非常に具合がいい。

これは、単純に昔から使い慣れたキーバインドとかそういうものによるところが大きいと思うけど。

Mac OS Xが不便なわけじゃない。不便どころか、とても良くできたOSで、本当に便利で役に立ってくれている。日々のメールやWeb閲覧など日常生活で使ってきたし、Windowsよりも快適なんじゃないかと思えるところがたくさんあった。追加なしにshellやsshが使えるのも良かった。

さらに深入りすれば、もっともっと快適になるだろうな、という感触だけど、思うところがあってNetBSDを入れたくなった。

というわけで、Mac miniにNetBSDを入れる決心をつけたのが数週間前。

今日からついにHDDの整理を始めた。といっても、ほんの少しのファイルとiTunesの音楽ファイルくらいを吸い上げれば良いみたい。

これらも、CDからリッピングし直したり、ダウンロードしたりすれば復元できるので、本当に残さなければならないファイルはないのかもしれない。

HDDは40Gbytesなんだけど、やっぱりMac OS XとNetBSDとのDual bootかなぁ。Debian GNU/Linuxを入れたよ、という話も聞くけど三つもOS入れられるんだろうか。

なんか、ここまで書いてきて、新しいことを受け入れることができなくなった単なる年寄りのような気がしてきた。

そうじゃない、それは認めたくない、ちゃんと理由があるんだと理由を探す自分にさらに年寄りを感じるのであった。


[View Log(0)] [Trackback]
Name: Comment:

2005/06/20 (月)

3年と126日目

急きょ、多摩方面から応援をお願いする。


[View Log(0)] [Trackback]
Name: Comment:

Mac mini

ついにMac mini再インストール。

パーティションを半分にして、Mac OS Xをクリーンインストール。

Appleにユーザ登録させられるのが面倒臭いと思った。

とりあえず、NetBSD/macppcのISOイメージをftp://ftp.ki.nu/NetBSD/snapshot/20050416ts/からダウンロードした。

が、Mac OS Xを使ってCD-RにISOイメージを書き込む方法がわからず、今日はここまで。


[View Log(0)] [Trackback]
Name: Comment:

Armadillo-9

家の環境がほとんど使えなかったのを理由に何もできず。


[View Log(0)] [Trackback]
Name: Comment:


メールはこちらへ...[BSD小僧 (tokuda @(at) tokuda .(dot) net)]

この日記は、GNSを使用して作成されています。