091006

|



ちょっと気になっていたところを直した。ここ、ラジエターホースがハイテン
ションコードと干渉している。ここでE/Gの振動が不用意にプラグに伝わって
キャップが摩耗してノイズが飛ぶのかも..と思い



取り廻しを変更しました。

ブレーキフルードを交換して、火入れの確認してOK。今回から水を出す時は ウォーターポンプのドレンからも抜いておくことにした。あそこにたまってい ると腐食して消耗の原因になるかもしれない。ウォーターポンプのシールはで きる限り交換したくない。ちょっと今のE/Gの廻りに不満なんだ。

岡山のS8は指定ガソリンじゃないといけないので、余ってる筑波ガソリンを予 備容器に移してカラッポに。ここずっと倉庫となっていた後部座席を掃除。車 中泊の準備。筑波まで1時間20分。富士まで1時間30分故、車中泊は岡山だけな のだ。
冷蔵庫、ポット、エアマット、電気毛布、シュラフ。寝間着。もりあがってきた。
今週、東名の集中工事なのだけど、連休中は金曜の18時から解除だから多分大 丈夫でしょう。今回はちゃんと伊勢湾岸道で行こう。豊田Jctで入って、四日市 Jct.で鈴鹿、亀山の方に行って、亀山Jct.で新名神か。不安だ。
はじめて筑波に行った時(19年前、ちょうどCXができた後だ)首都高を抜ける自 信がなくて延々と環七廻って加平から入ったくらいのへたれだからね...。当時 の箱崎は3車線くらいまたがないといけなくて大変だったんだよ。
帰りの予測を調べると大和TNで1時間渋滞っぽい。京都あたりでぶらぶらしてく かな。

SH4A続き。
strtollを使うようになると(newlib)
	.data :
	{
		_data_start = .;
		*(.eh_fram*)
		*(.data)
		 . = ALIGN (4);
	} > ram
	_data_end = .;
eh_frameが必要になる。strtolなら不用。なんなのか不明。


32bitアドレス拡張モードで自分が走ってるリージョンを変更してみます。変更
途中にメモリをアクセスするとリセットしてしまうのでここはアセンブラで確
実にレジスタだけで更新できるようにします。P1とP2を一気に変更。

// void sh4a_pmb_entry_set_self (uint32_t aa0, uint32_t da0, uint32_t aa1,
//	uint32_t da1)
FUNC (_sh4a_pmb_entry_set_self)
	mov.l	r8,	@-r15
	mov.l	r9,	@-r15
	mov.l	r10,	@-r15
	mov.l	.L_MMUCR,	r8
	mov	#4,		r9	// MMUCR.TI
	mov.l	.L_PMB_AA0,	r0
	mov.l	.L_PMB_DA0,	r1
	mov.l	.L_PMB_AA1,	r2
	mov.l	.L_PMB_DA1,	r3
	mov.l	r4,	@r0
	mov.l	r5,	@r1
	mov.l	r6,	@r2
	mov.l	r7,	@r3
	// MMUCR.TI = 1
	mov.l	@r8,	r10
	or	r9,	r10
	mov.l	r10,	@r8
	// Sync resrouce.
	icbi	@r0
	mov.l	@r15+,	r10
	mov.l	@r15+,	r9
	rts
	 mov.l	@r15+,	r8
	.align	2
.L_MMUCR:
	.long	0xff000010
.L_PMB_AA0:
	.long	0xf6100000
.L_PMB_AA1:
	.long	0xf6100100
.L_PMB_DA0:
	.long	0xf7100000
.L_PMB_DA1:
	.long	0xf7100100


void
pmb_setup ()
{
  struct
  {
    uint32_t aa;
    uint32_t da;
  } pmb [] = {
このOSが走っている16MBの部分だけを登録しなおします。
    // P1
    { 0x89000000 | PMB_AA_V,
      0x09000000 | PMB_DA_V | PMB_DA_C | PMB_DA_SZ_16M },
    // P2
    { 0xa9000000 | PMB_AA_V,
      0x09000000 | PMB_DA_V | PMB_DA_SZ_16M },
PLDのレジスタ領域もマップし直します。
    // PLD
    { 0xa4000000 | PMB_AA_V,
      0x04000000 | PMB_DA_V | PMB_DA_SZ_16M },
ここは32bitモードでDDR2が512MBマップされているエリア。一気にマップできないので
128MBごとにマップしてテスト。
    // RAM
    //    { 0x90000000 | PMB_AA_V,
    //      0x40000000 | PMB_AA_V | PMB_DA_C | PMB_DA_SZ_128M },
全領域のメモリテストでリセットしたところから、ここがエリア2,3
(0x08000000-0x0fffffff)にマップされているのではないかと仮定します
          { 0x90000000 | PMB_AA_V,
      0x48000000 | PMB_AA_V | PMB_DA_C | PMB_DA_SZ_128M },//memtest failed.
    ///   { 0x90000000 | PMB_AA_V,
    //      0x50000000 | PMB_AA_V | PMB_DA_C | PMB_DA_SZ_128M },
    //    { 0x90000000 | PMB_AA_V,
    //      0x58000000 | PMB_AA_V | PMB_DA_C | PMB_DA_SZ_128M },
  };
ここはクリティカルなので前述のアセンブラルーチンで更新。
  // Change PMB setting P1/P2
  sh4a_pmb_entry_set_self (pmb[0].aa, pmb[0].da, pmb[1].aa, pmb[1].da);

ここからはアクセスされない限り何も起こらないので、Cルーチンで更新。
  // Additional PMB.
  size_t i;
  for (i = 2; i < sizeof pmb / sizeof (pmb[0]); i++)
    {
ここでページサイズとVPN,PPNが合致しているかどうかチェック。C
合致していないまま動かせばリセットです。
      if (!sh4a_pmb_align_check (pmb[i].aa, pmb[i].da))
	continue;
      sh4a_pmb_entry_set (i, pmb[i].aa, pmb[i].da);
      *SH4A_MMUCR |= MMUCR_TI;	// Invalidate TLB
      CPU_SYNC_RESOURCE ();	// For MMUCR
    }
}

これで実行。

=> go 0x89000000
## Starting application at 0x89000000 ...
stack_start: 0x89010000
RAM data: 0x89007144-0x8900767c 1336byte
bss: 0x89007680-0x8900b40c 15756byte
Privilege-mode, bank 1, Exception disabled, FPU enabled, IMASK=0xf
bss memory check passed.
PMB page size 16MB mask=ffffff VPN:a4000000 PPN:4000000
PMB page size 128MB mask=7ffffff VPN:90000000 PPN:48000000
md_thread_create: [2]:uart recv pc=890047b4 sp=8900aed8 stack=1024byte
thread_start: [2]
md_thread_create: [3]:uart send pc=89004744 sp=8900b3b0 stack=1024byte
thread_start: [3]
md_thread_create: [4]:test pc=89001854 sp=8900a1dc stack=1024byte
thread_start: [4]
test_thread:1234abcd
INTC: fffffff6 1f000000
hello 0
test4> pmb
--------------------PMB--------------------
paddr 32bit mode.
VPN:89000000 (V) PPN:9000000 (V) 16MB, bufferd write, cacheable, write-back, 
VPN:a9000000 (V) PPN:9000000 (V) 16MB, bufferd write, uncacheable, write-back, 
VPN:a4000000 (V) PPN:4000000 (V) 16MB, bufferd write, uncacheable, write-back, 
これはDDR2エリア512MBのうち、128MB目からの128MB。
VPN:90000000 (V) PPN:48000000 (V) 128MB, bufferd write, cacheable, write-back, 
--------------------ITLB--------------------
VPN:89000000 ASID:0 (-) PPN:9000000 (-) PMB 16MB U cacheable, shared
VPN:89000000 ASID:0 (-) PPN:9000000 (-) PMB 16MB U cacheable, shared
VPN:a9000000 ASID:0 (V) PPN:9000000 (V) PMB 16MB U uncacheable, shared
VPN:89000000 ASID:0 (V) PPN:9000000 (V) PMB 16MB U cacheable, shared
現在のOSの原点の値を取ります。
test4> mem r 89000000
(r)89000000: 402bd001
この0x402bd001がある場所を検索します。
test4> mem f 0 402bd001                                         
Find pattern 402bd001...
402bd001 found at 91000000
0x91000000に見つかったので確かめます。
test4> mem r 91000000
(r)91000000: 402bd001
ここに0xdeadbeafを書き込みます。
test4> mem w 91000000 deadbeaf                                  
(w)91000000: deadbeaf
書き込んだのを確認します。
test4> mem r 91000000
(r)91000000: deadbeaf
0x89000000の値を読んでみます。
test4> mem r 89000000
(r)89000000: 402bd001
キャッシュフラッシュしてみます。
test4> cacheflush
ここに書かれていました。 ここでキャッシュフラッシュしないと値が見えない
のは本当の物理的には同じメモリだけれど、CPU的には別の物理アドレスなので、
キャッシュシステムにおけるPPNが違うのでマッチしない。
test4> mem r 89000000                                           
(r)89000000: deadbeaf
test4> 

ということで、物理アドレスの0x4000000から512MBマップされているRAMのうち、
128MB-256MBが物理アドレス0x08000000-0x0fffffffにもマップされている様子。