Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip В parti preċedenti ġie implimentat kontrollur tal-memorja bejn wieħed u ieħor li jaħdem, jew aħjar, tgeżwir fuq IP Core minn Quartus, li huwa adapter għal TileLink. Illum, fit-taqsima "Qed nittrasferixxu RocketChip għal bord Ċiniż ftit magħruf b'Cyclone" se tara console li taħdem. Il-proċess ħa ftit itwal: kont diġà naħseb li malajr inniedi Linux u nkompli, iżda dan ma kienx il-każ. F'din il-parti, nipproponi li nħares lejn il-proċess tat-tnedija ta 'U-Boot, BBL, u t-tentattivi timidi tal-kernel Linux biex jinizjalizza. Iżda hemm console - U-Boot, u pjuttost avvanzata, li għandha ħafna minn dak li tistenna minn console sħiħa.

Il-ħardwer se jinkludi karta SD konnessa permezz tal-interface SPI, kif ukoll UART. Fil-parti tas-softwer, BootROM se jiġi sostitwit bi xip fuq sdboot u, fil-fatt, l-istadji tat-tagħbija li ġejjin ġew miżjuda (fuq il-karta SD).

Irfinar tal-ħardwer

Allura, il-kompitu: trid taqleb għal qalba "kbir" u tikkonnettja UART (minn Raspberry) u adapter SD (użajna karta minn Catalex b'sitt pinnijiet: GND, VCC, MISO, MOSI, SCK, CS) .

Fil-prinċipju, kollox kien pjuttost sempliċi. Iżda qabel ma rrealizzajt dan, tfajt xi ftit minn naħa għal oħra: wara l-ħin ta’ qabel, iddeċidejt li għal darb’oħra kelli bżonn biss li nħallat System xi ħaġa simili HasPeripheryUART (u l-implimentazzjoni kif xieraq), l-istess għall-karta SD - u kollox ikun lest. Imbagħad iddeċidejt li nara kif ġiet implimentata f'disinn "serju". Allura, x'hemm serju dwar dan? Arty, apparentement, ma jaqbilx - il-mostru jibqa ' unleahshed.DevKitConfigs. U f'daqqa waħda rriżulta li kien hemm xi overlays kullimkien, li ġew miżjuda permezz ta 'parametri minn ċwievet. Naħseb li dan huwa probabbilment flessibbli ħafna u konfigurabbli, imma nixtieq għall-inqas imexxi xi ħaġa l-ewwel... M'għandekx l-istess ħaġa, biss aktar sempliċi u aktar tedjanti?... Dakinhar iltqajt vera.iofpga.FPGAChip għal Microsemi FPGAs u immedjatament ħaditha għal kwotazzjonijiet u ppruvajt nagħmel l-implimentazzjoni tiegħi stess b'analoġija, fortunatament hemm xi ftit jew wisq it-"tqassim tal-motherboard" kollu f'fajl wieħed.

Irriżulta li int verament bżonn biss li żżid System.scala linji

class System(implicit p: Parameters) extends RocketSubsystem
...
  with HasPeripherySPI
  with HasPeripheryUART
...
{
  val tlclock = new FixedClockResource("tlclk", p(DevKitFPGAFrequencyKey))
  ...
}

class SystemModule[+L <: System](_outer: L)
  extends RocketSubsystemModuleImp(_outer)
...
    with HasPeripheryUARTModuleImp
    with HasPeripheryGPIOModuleImp
...

Linja fil-korp tal-klassi System iżid informazzjoni dwar il-frekwenza li biha topera din il-parti tas-SoC tagħna mal-fajl dts. Sa fejn nifhem jien, DTS/DTB huwa analogu statiku tat-teknoloġija plug-and-play għal apparati inkorporati: is-siġra tad-deskrizzjoni tad-dts hija miġbura f'fajl dtb binarju u trasferita mill-bootloader lejn il-qalba sabiex tkun tista' tikkonfigura b'mod korrett il- ħardwer. Interessanti, mingħajr il-linja ma tlclock kollox jissintetizza perfettament, iżda kumpilazzjoni BootROM (ħalluni nfakkarkom, issa dan se jkun diġà sdboot) mhux se taħdem - matul il-proċess ta 'kumpilazzjoni teżamina l-fajl dts u toħloq header b'makro TL_CLK, li grazzi għalih ikun jista 'jikkonfigura b'mod korrett diviżuri tal-frekwenza għal interfaces esterni.

Ikollok bżonn ukoll tikkoreġi kemmxejn il-"wiring":

Platform.scala:

class PlatformIO(implicit val p: Parameters) extends Bundle {

...

  // UART
  io.uart_tx := sys.uart(0).txd
  sys.uart(0).rxd := RegNext(RegNext(io.uart_rx))

  // SD card
  io.sd_cs := sys.spi(0).cs(0)
  io.sd_sck := sys.spi(0).sck
  io.sd_mosi := sys.spi(0).dq(0).o
  sys.spi(0).dq(0).i := false.B
  sys.spi(0).dq(1).i := RegNext(RegNext(io.sd_miso))
  sys.spi(0).dq(2).i := false.B
  sys.spi(0).dq(3).i := false.B
}

Il-ktajjen tar-reġistru, biex inkun onest, ġew miżjuda sempliċement b'analoġija ma 'xi postijiet oħra fil-kodiċi oriġinali. Ħafna probabbli, għandhom jipproteġu kontra metastabbiltà. Forsi fi xi wħud il-blokki diġà għandhom il-protezzjoni tagħhom stess, iżda l-ewwel irrid inniediha mill-inqas "f'livell ta 'kwalità għolja." Mistoqsija aktar interessanti għalija hija għaliex MISO u MOSI hang fuq differenti dq? Għadni ma sibtx it-tweġiba, iżda jidher li l-bqija tal-kodiċi jiddependi biss fuq konnessjoni bħal din.

Fiżikament, jien sempliċement assenjat il-labar tad-disinn għall-kuntatti ħielsa fuq il-blokka u mċaqlaq il-jumper tal-għażla tal-vultaġġ għal 3.3V.

adapter SD

Ara minn fuq:

Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Veduta tal-qiegħ:

Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Debugging tas-Softwer: Għodod

L-ewwel, ejja nitkellmu dwar l-għodod ta 'debugging disponibbli u l-limitazzjonijiet tagħhom.

Minicom

L-ewwel, ser ikollna bżonn naqraw b'xi mod x'inhu l-bootloader u l-output tal-kernel. Biex tagħmel dan fuq Linux (f'dan il-każ, fuq dak fuq ir-RaspberryPi), għandna bżonn il-programm Minicom. B'mod ġenerali, kwalunkwe programm li jaħdem ma 'port serjali se jagħmel.

Jekk jogħġbok innota li meta tibda, l-isem tal-apparat tal-port għandu jiġi speċifikat bħala -D /dev/ttyS0 - wara l-għażla -D. Ukoll, l-informazzjoni ewlenija: biex toħroġ, uża Ctrl-A, X. Fil-fatt kelli każ meta din il-kombinazzjoni ma ħadmitx - allura tista 'sempliċement tgħid minn sessjoni SSH ġirien killall -KILL minicom.

Hemm karatteristika waħda oħra. Speċifikament, ir-RaspberryPi għandu żewġ UARTs, u ż-żewġ portijiet diġà jistgħu jiġu adattati għal xi ħaġa: wieħed għall-Bluetooth, l-ieħor b'mod awtomatiku joħroġ il-console tal-kernel. Fortunatament, din l-imġieba tista 'tiġi annullata skond dan il-manwal.

Kitba mill-ġdid tal-memorja

Meta niddebuggja, biex nittestja ipoteżi, kultant kelli tagħbija bootloader (jiddispjacini) f'RAM direttament mill-host. Forsi dan jista 'jsir direttament minn GDB, iżda fl-aħħar segwejt triq sempliċi: I kkupjajt il-fajl meħtieġ lill-Raspberry, ukoll bagħtet port 4444 permezz SSH (telnet minn OpenOCD) u użajt il-kmand load_image. Meta tagħmel dan, jidher li kollox huwa ffriżat, iżda fil-fatt "ma jorqodx, biss teptip bil-mod": Jniżżel il-fajl, jagħmel biss b'veloċità ta' ftit kilobytes kull sekonda.

Karatteristiċi ta 'installazzjoni ta' breakpoints

Ħafna nies probabbilment ma kellhomx għalfejn jaħsbu dwar dan meta jiddebuggjaw programmi regolari, iżda breakpoints mhux dejjem ikunu stabbiliti fil-hardware. Xi drabi l-iffissar ta’ breakpoint jinvolvi temporanjament tikteb struzzjonijiet speċjali fil-post it-tajjeb direttament fil-kodiċi tal-magna. Pereżempju, dan huwa kif ħadem il-kmand standard tiegħi b fil-GDB. Hawn dak li ġej:

  • ma tistax tpoġġi tikka ġewwa BootROM minħabba ROM
  • Tista 'tissettja breakpoint fuq il-kodiċi mgħobbi f'RAM mill-karta SD, iżda trid tistenna sakemm titgħabba. Inkella, mhux se nerġgħu nikteb biċċa kodiċi, iżda l-loader se jikteb mill-ġdid il-breakpoint tagħna

Jien ċert li tista' titlob b'mod espliċitu biex tuża breakpoints tal-ħardwer, iżda xorta waħda hemm numru limitat minnhom.

Sostituzzjoni Quick BootROM

Fl-istadju inizjali tad-debugging, ħafna drabi jkun hemm xewqa li tiffissa l-BootROM u erġa' pprova. Iżda hemm problema: BootROM hija parti mid-disinn mgħobbi fl-FPGA, u s-sinteżi tagħha hija kwistjoni ta 'ftit minuti (u dan wara kumpilazzjoni kważi immedjata tal-immaġni BootROM innifsu minn C u Assembler...). Fortunatament, fir-realtà kollox ħafna aktar malajr: is-sekwenza tal-azzjonijiet hija kif ġej:

  • riġenera bootrom.mif (Qilejt għal MIF minflok HEX, għax dejjem kelli xi problemi bil-HEX, u l-MIF hija l-format nattiv ta’ Alter)
  • fi Quartus ngħidu Processing -> Update Memory Initialization File
  • fuq l-oġġett Assembler (fil-kolonna tax-xellug tal-Kompiti) kmand Ibda mill-ġdid

Kollox dwar kollox - ftit għexieren ta 'sekondi.

Tħejjija tal-karta SD

Kollox hawnhekk huwa relattivament sempliċi, iżda trid tkun paċenzjuż u jkollok madwar 14Gb ta' spazju fuq disk:

git clone https://github.com/sifive/freedom-u-sdk
git submodule update --recursive --init
make

Wara li għandek bżonn daħħal nadif, jew aħjar, wieħed li ma fih xejn meħtieġ, SD card, u tesegwixxi

sudo make DISK=/dev/sdX format-boot-loader

… Fejn sdX — apparat assenjat lill-karta. ATTENZJONI: id-dejta fuq il-karta se titħassar, tinkiteb fuq il-post u b'mod ġenerali! Huwa bilkemm jiswew li tagħmel l-assemblaġġ kollu minn taħt sudogħaliex allura l-artifacts kollha jibnu se jappartjenu għal root, u l-assemblaġġ ikollu jsir minn taħt sudo kontinwament.

Ir-riżultat huwa karta mmarkata f'GPT b'erba 'diviżorji, li waħda minnhom għandha XAĦAM bi uEnv.txt u immaġni bootable f'format FIT (fiha diversi sub-immaġini, kull waħda bl-indirizz tat-tniżżil tagħha), il-partizzjoni l-oħra hija vojta, suppost tkun ifformattjata f'Ext4 għal Linux. Żewġ taqsimiet oħra - misterjuża: U-Boot jgħix fuq wieħed (l-offset tiegħu, sa fejn nifhem, huwa hardcoded fil-BootROM), fuq l-oħra, jidher, il-varjabbli ambjentali tiegħu ħajjin, iżda għadni ma nużahomx.

Livell wieħed, BootROM

L-​għerf popolari jgħid: “Jekk fl-​ipprogrammar ikun hemm żfin bit-​tamburin, allura fl-​elettronika hemm ukoll żfin bit-​tifi tan-​nar.” Lanqas biss dwar il-fatt li ladarba kważi nħaraq il-bord, iddeċidejt li "Well, GND huwa l-istess livell baxx." (milli jidher, resistor ma jweġġax wara kollox...) Huwa aktar dwar il-fatt li jekk l-idejn ma jikbrux minn hemm, allura l-elettronika qatt ma tieqaf iġġib sorpriżi: meta issaldjar il-konnettur fuq il-bord, xorta ma stajtx issaldjar il-kuntatti kif suppost - il-video juri kif l-istann jinfirex direttament fuq il-konnessjoni kollha, biss applika ħadida tal-issaldjar, Għalija, huwa "slapped" bl-addoċċ. Ukoll, forsi l-istann ma kienx adattat għat-temperatura tal-ħadid tal-issaldjar, forsi xi ħaġa oħra... B'mod ġenerali, meta rajt li diġà kelli tużżana kuntatti, ċeda u bdejt niddibaggja. U mbagħad beda misterjuża: I konnessi RX/TX minn UART, I tagħbija l-firmware - jgħid

INIT
CMD0
ERROR

Ukoll, kollox huwa loġiku - ma qabbadx il-modulu tal-karta SD. Aħna nikkoreġu s-sitwazzjoni, tagħbija l-firmware... U silenzju... Għaliex ma bdiltx moħħi, iżda l-kaxxa ċkejkna għadha kif infetħet: wieħed mill-labar tal-modulu kellu jkun imqabbad ma 'VCC. Fil-każ tiegħi, il-modulu appoġġa 5V għall-provvista tal-enerġija, għalhekk mingħajr ma ħsibt darbtejn, daħħalt il-wajer li ġej mill-modulu għan-naħa opposta tal-bord. Bħala riżultat, il-konnettur issaldjat b'mod mgħawweġ sar skewed, u Il-kuntatt UART kien sempliċement mitluf. facepalm.jpg B'mod ġenerali, "ras ħażina ma tagħtix mistrieħ lir-riġlejn," u idejn mgħawweġ ma jagħtux mistrieħ lir-ras...

Bħala riżultat, rajt dak li tant mistenni

INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING /

Barra minn hekk, jiċċaqlaq u l-indikatur tat-tagħbija jdur. Minnufih niftakar il-ġranet tal-iskola tiegħi u t-tagħbija bil-mimduda ta’ MinuetOS minn floppy disk. Sakemm id-drajv ma jitħanx.

Il-problema hija li wara l-messaġġ BOOT ma jiġri xejn. Dan ifisser li wasal iż-żmien li tikkonnettja permezz ta 'OpenOCD ma' Raspberry, ma 'GDB fuq il-host, u tara x'inhu.

L-ewwelnett, il-konnessjoni bl-użu ta 'GDB immedjatament wera li $pc (counter tal-programm, indirizz tal-istruzzjoni kurrenti) itir lejn 0x0 - dan probabbilment jiġri wara żbalji multipli. Għalhekk, immedjatament wara li jinħareġ il-messaġġ BOOT Ejja nżidu linja infinita. Dan se jittardjah għal ftit...

diff --git a/bootrom/sdboot/sd.c b/bootrom/sdboot/sd.c
index c6b5ede..bca1b7f 100644
--- a/bootrom/sdboot/sd.c
+++ b/bootrom/sdboot/sd.c
@@ -224,6 +224,8 @@ int main(void)

        kputs("BOOT");

+    while(*(volatile char *)0x10000){}
+
        __asm__ __volatile__ ("fence.i" : : : "memory");
        return 0;
 }

Kodiċi delikat bħal dan jintuża "għall-affidabbiltà": smajt x'imkien li linja bla tarf hija Imġieba mhux definita, iżda l-kompilatur mhux probabbli li raden (infakkarkom li skond 0x10000 jinsab BootROM).

Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Jidher, x'iktar li tistenna - ħarxa inkorporata, x'tip ta 'kodiċi tas-sors hemm? Imma fi dak l-artikolu l-awtur kien qed jiddibaggja l-kodiċi C... Kreks-fex-pex:

(gdb) file builds/zeowaa-e115/sdboot.elf
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from builds/zeowaa-e115/sdboot.elf...done.

Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Għandek bżonn biss li tniżżel mhux il-fajl MIF jew bin, iżda l-verżjoni oriġinali fil-format ELF.

Issa tista 'raden bl-nth tentattiv l-indirizz fejn l-eżekuzzjoni se tkompli (din hija raġuni oħra għaliex il-kompilatur ma kellux raden li l-linja hija infinita). Tim

set variable $pc=0xADDR

jippermettilek tibdel il-valur tar-reġistru fuq il-fly (f'dan il-każ, l-indirizz tal-istruzzjoni kurrenti). Bl-għajnuna tagħha, tista 'tbiddel il-valuri miktuba fil-memorja (u r-reġistri mmappjati bil-memorja).

Fl-aħħar mill-aħħar, wasalt għall-konklużjoni (mhux ċert liema hija korretta) li għandna "immaġni tal-karta SD tas-sistema ħażina", u rridu mmorru mhux sal-bidu nett tad-dejta mniżżla, iżda biex 0x89800 bytes aktar:

diff --git a/bootrom/sdboot/head.S b/bootrom/sdboot/head.S
index 14fa740..2a6c944 100644
--- a/bootrom/sdboot/head.S
+++ b/bootrom/sdboot/head.S
@@ -13,7 +13,7 @@ _prog_start:
   smp_resume(s1, s2)
   csrr a0, mhartid
   la a1, dtb
-  li s1, PAYLOAD_DEST
+  li s1, (PAYLOAD_DEST + 0x89800)
   jr s1

   .section .rodata

Forsi dan kien affettwat ukoll mill-fatt li ma kellix karta ta' 4Gb bla bżonn f'idejna, ħadt waħda ta' 2Gb u biddejtha fil-Makefile bl-addoċċ DEMO_END=11718750 fuq DEMO_END=3078900 (ma tfittexx tifsira f'tifsira speċifika - m'hemm xejn, huwa biss li issa l-immaġni titqiegħed fuq il-karta).

Livell tnejn, U-Boot

Issa għadna "naqgħu", iżda diġà qegħdin fil-post it-tajjeb 0x0000000080089a84. Hawnhekk irrid nammetti: fil-fatt, il-preżentazzjoni ma tmurx "bil-waqfiet kollha", iżda hija miktuba parzjalment "wara", għalhekk hawn diġà rnexxieli ndaħħal il-fajl dtb korrett mis-SoC tagħna, ikkoreġih fis-settings HiFive_U-Boot varjabbli CONFIG_SYS_TEXT_BASE=0x80089800 (minflok 0x08000000) sabiex l-indirizz tat-tniżżil jaqbel ma' dak attwali. Issa aħna tagħbija l-mappa tal-livell li jmiss, immaġni oħra:

(gdb) file ../freedom-u-sdk/work/HiFive_U-Boot/u-boot
(gdb) tui en

U naraw:

   │304     /*                                               │
   │305      * trap entry                                    │
   │306      */                                              │
   │307     trap_entry:                                      │
   │308         addi sp, sp, -32*REGBYTES                    │
  >│309         SREG x1, 1*REGBYTES(sp)                      │
   │310         SREG x2, 2*REGBYTES(sp)                      │
   │311         SREG x3, 3*REGBYTES(sp)                      │

Barra minn hekk, naqbżu bejn il-linji 308 u 309. U mhux sorprendenti, peress li fil- $sp tinsab it-tifsira 0xfffffffe31cdc0a0. Alas, huwa wkoll kontinwament "taħrab" minħabba l-linja 307. Għalhekk, ejja nippruvaw nissettjaw breakpoint fuq trap_entry, u mbagħad mur lura għal 0x80089800 (Il-punt tad-dħul ta' U-Boot), u nittamaw li ma teħtieġx li r-reġistri jiġu ssettjati b'mod korrett qabel ma jaqbżu... Jidher li jaħdem:

(gdb) b trap_entry
Breakpoint 1 at 0x80089a80: file /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S, line 308.
(gdb) set variable $pc=0x80089800
(gdb) c
Continuing.

Breakpoint 1, trap_entry () at /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S:308
(gdb) p/x $sp
$4 = 0x81cf950

Il-punter tal-munzell huwa hekk, franchement: jindika li jinjora r-RAM għal kollox (sakemm, ovvjament, ma jkollniex diġà traduzzjoni tal-indirizzi, iżda ejja nittamaw għal għażla sempliċi).

Ejja nippruvaw nissostitwixxu l-pointer bi 0x881cf950. Bħala riżultat, naslu għall-konklużjoni li handle_trap sejjaħ u sejjaħ, u fl-istess ħin nidħlu _exit_trap b’argument epc=2148315240 (f'deċimali):

(gdb) x/10i 2148315240
   0x800cb068 <strnlen+12>:     lbu     a4,0(a5)
   0x800cb06c <strnlen+16>:     bnez    a4,0x800cb078 <strnlen+28>
   0x800cb070 <strnlen+20>:     sub     a0,a5,a0
   0x800cb074 <strnlen+24>:     ret
   0x800cb078 <strnlen+28>:     addi    a5,a5,1
   0x800cb07c <strnlen+32>:     j       0x800cb064 <strnlen+8>
   0x800cb080 <strdup>: addi    sp,sp,-32
   0x800cb084 <strdup+4>:       sd      s0,16(sp)
   0x800cb088 <strdup+8>:       sd      ra,24(sp)
   0x800cb08c <strdup+12>:      li      s0,0

Issettja breakpoint għal strnlen, inkomplu u naraw:

(gdb) bt
#0  strnlen (s=s@entry=0x10060000 "", count=18446744073709551615) at lib/string.c:283
#1  0x00000000800cc14c in string (buf=buf@entry=0x881cbd4c "", end=end@entry=0x881cc15c "", s=0x10060000 "", field_width=<optimized out>, precision=<optimized out>, flags=<optimized out>) at lib/vsprintf.c:265
#2  0x00000000800cc63c in vsnprintf_internal (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=0x800d446e "s , epc %08x , ra %08lxn", fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=0x881cc1a0,
    args@entry=0x881cc188) at lib/vsprintf.c:619
#3  0x00000000800cca54 in vsnprintf (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=args@entry=0x881cc188) at lib/vsprintf.c:710
#4  0x00000000800cca68 in vscnprintf (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=args@entry=0x881cc188) at lib/vsprintf.c:717
#5  0x00000000800ccb50 in printf (fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn") at lib/vsprintf.c:792
#6  0x000000008008a9f0 in _exit_trap (regs=<optimized out>, epc=2148315240, code=<optimized out>) at arch/riscv/lib/interrupts.c:92
#7  handle_trap (mcause=<optimized out>, epc=<optimized out>, regs=<optimized out>) at arch/riscv/lib/interrupts.c:55
#8  0x0000000080089b10 in trap_entry () at /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S:343
Backtrace stopped: frame did not save the PC

Jidher li hu, _exit_trap irid jipprovdi informazzjoni ta' debugging dwar l-eċċezzjoni li seħħet, imma ma jistax. Allura, b'xi mod is-sorsi tagħna ma jerġgħux jintwerew. set directories ../freedom-u-sdk/HiFive_U-Boot/ DWAR! Issa murija!

Tajjeb, ejja nerġgħu nħaddmu, u ara mill-munzell traċċa l-kawża tal-problema oriġinali li kkawża l-ewwel żball (mcause == 5). Jekk fhimt sewwa x’inhu miktub hawn f’paġna 37, allura din l-eċċezzjoni tfisser Load access fault. Ir-raġuni tidher li hija li hawn

arch/riscv/cpu/HiFive/start.S:

call_board_init_f:
    li  t0, -16
    li  t1, CONFIG_SYS_INIT_SP_ADDR
    and sp, t1, t0  /* force 16 byte alignment */

#ifdef CONFIG_DEBUG_UART
    jal debug_uart_init
#endif

call_board_init_f_0:
    mv  a0, sp
    jal board_init_f_alloc_reserve
    mv  sp, a0
    jal board_init_f_init_reserve

    mv  a0, zero    /* a0 <-- boot_flags = 0 */
    la t5, board_init_f
    jr t5       /* jump to board_init_f() */

$sp għandha l-istess tifsira żbaljata, u ġewwa board_init_f_init_reserve iseħħ żball. Jidher li dan huwa l-ħati: varjabbli b'isem mhux ambigwu CONFIG_SYS_INIT_SP_ADDR. Huwa definit fil-fajl HiFive_U-Boot/include/configs/HiFive-U540.h. F'xi punt, anke ħsibt, forsi, ukoll, għandi nżid bootloader għall-proċessur - forsi jkun aktar faċli li tiffissa l-proċessur ftit? Imma mbagħad rajt li kien aktar bħal artifact minn mhux komplut għal kollox#if 0-settings speċifiċi għal konfigurazzjoni ta 'memorja differenti, u tista' tipprova tagħmel dan:

diff --git a/include/configs/HiFive-U540.h b/include/configs/HiFive-U540.h
index ca89383..245542c 100644
--- a/include/configs/HiFive-U540.h
+++ b/include/configs/HiFive-U540.h
@@ -65,12 +65,9 @@
 #define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_0
 #endif
 #if 1
-/*#define CONFIG_NR_DRAM_BANKS 1*/
+#define CONFIG_NR_DRAM_BANKS   1
 #define PHYS_SDRAM_0   0x80000000              /* SDRAM Bank #1 */
-#define PHYS_SDRAM_1   
-       (PHYS_SDRAM_0 + PHYS_SDRAM_0_SIZE)      /* SDRAM Bank #2 */
-#define PHYS_SDRAM_0_SIZE      0x80000000      /* 2 GB */
-#define PHYS_SDRAM_1_SIZE      0x10000000      /* 256 MB */
+#define PHYS_SDRAM_0_SIZE      0x40000000      /* 1 GB */
 #define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_0
 #endif
 /*
@@ -81,7 +78,7 @@
 #define CONSOLE_ARG                            "console=ttyS0,115200 "

 /* Init Stack Pointer */
-#define CONFIG_SYS_INIT_SP_ADDR                (0x08000000 + 0x001D0000 - 
+#define CONFIG_SYS_INIT_SP_ADDR                (0x80000000 + 0x001D0000 - 
                                        GENERATED_GBL_DATA_SIZE)

 #define CONFIG_SYS_LOAD_ADDR           0xa0000000      /* partway up SDRAM */

F'xi punt in-numru ta 'krozzi qfieli teknoloġiċi laħqet punt kritiku. Wara li tħabtu ftit, wasalt għall-ħtieġa li nagħmel il-port korrett għall-bord tiegħi. Biex nagħmlu dan, għandna bżonn nikkopjaw u naġġustaw numru ta 'fajls biex ikunu adattati għall-konfigurazzjoni tagħna.

Ukoll, bejn wieħed u ieħor, hawn tabella żgħira

trosinenko@trosinenko-pc:/hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot$ git show --name-status
commit 39cd67d59c16ac87b46b51ac1fb58f16f1eb1048 (HEAD -> zeowaa-1gb)
Author: Anatoly Trosinenko <[email protected]>
Date:   Tue Jul 2 17:13:16 2019 +0300

    Initial support for Zeowaa A-E115FB board

M       arch/riscv/Kconfig
A       arch/riscv/cpu/zeowaa-1gb/Makefile
A       arch/riscv/cpu/zeowaa-1gb/cpu.c
A       arch/riscv/cpu/zeowaa-1gb/start.S
A       arch/riscv/cpu/zeowaa-1gb/timer.c
A       arch/riscv/cpu/zeowaa-1gb/u-boot.lds
M       arch/riscv/dts/Makefile
A       arch/riscv/dts/zeowaa-1gb.dts
A       board/Zeowaa/zeowaa-1gb/Kconfig
A       board/Zeowaa/zeowaa-1gb/MAINTAINERS
A       board/Zeowaa/zeowaa-1gb/Makefile
A       board/Zeowaa/zeowaa-1gb/Zeowaa-A-E115FB.c
A       configs/zeowaa-1gb_defconfig
A       include/configs/zeowaa-1gb.h

Id-dettalji jistgħu jinstabu fi repożitorji.

Kif irriżulta, fuq dan il-bord SiFive ir-reġistri ta 'xi apparati għandhom indirizzi differenti. Irriżulta wkoll li U-Boot huwa kkonfigurat bl-użu tal-mekkaniżmu Kconfig, diġà familjari mill-qalba tal-Linux - per eżempju, tista 'tikkmanda make menuconfig, u interface test konvenjenti se jidher quddiemek li turi deskrizzjonijiet tal-parametri minn ? eċċ. B'mod ġenerali, wara li cobbled flimkien deskrizzjoni tat-tielet mid-deskrizzjonijiet ta 'żewġ bordijiet, jitfa' kull xorta ta 'rikonfigurazzjonijiet PLL pretenzjużi minn hemm (apparentement, dan huwa b'xi mod konness mal-kontroll mill-kompjuter ospitanti permezz ta' PCIe, iżda dan mhux ċert) , Irċevejt xi firmware, li, fit-temp it-tajjeb fuq Mars tatni messaġġ permezz tal-UART dwar liema commit hash ġie kkompilat minnu, u dwar kemm għandi DRAM (imma jien stess ktibt din l-informazzjoni fl-header).

L-unika ħasra hija li wara dan il-bord normalment waqaf jirrispondi permezz tal-proċessur JTAG, u t-tagħbija minn karta SD hija, sfortunatament, mhux veloċi fil-konfigurazzjoni tiegħi. Min-naħa l-oħra, xi kultant BootROM ta messaġġ li ERROR, naqas li boot, u U-Boot immedjatament tfaċċat. Kien imbagħad li ħarġet fuqi: apparentement, wara li rebooting bitstream fl-FPGA, il-memorja ma titħassarx, m'għandhiex ħin biex "untrain", eċċ. Fil-qosor, tista 'sempliċement meta jidher messaġġ LOADING / qabbad ma 'debugger u kmand set variable $pc=0x80089800, u b'hekk tevita din it-tagħbija twila (naturalment, fuq is-suppożizzjoni li l-aħħar darba kissret kmieni biżżejjed li ma kellux ħin biex jgħabbi xi ħaġa fuq il-kodiċi oriġinali).

Mill-mod, huwa ġeneralment normali li l-proċessur jiffriża kompletament u d-debugger JTAG ma jistax jgħaqqad miegħu b'messaġġi?

Error: unable to halt hart 0
Error:   dmcontrol=0x80000001
Error:   dmstatus =0x00030c82

Allura, stenna! Diġà rajt dan! Xi ħaġa simili tiġri meta TileLink ikun imblokkat, u b'xi mod ma nafdax lill-awtur tal-kontrollur tal-memorja - ktibt jien stess... F'daqqa waħda, wara l-ewwel bini mill-ġdid b'suċċess tal-proċessur wara li editja l-kontrollur, rajt:

INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING
BOOT

U-Boot 2018.09-g39cd67d-dirty (Jul 03 2019 - 13:50:33 +0300)

DRAM:  1 GiB
MMC:
BEFORE LOAD ENVBEFORE FDTCONTROLADDRBEFORE LOADADDRIn:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  3

Għal din il-linja stramba qabel In: serial toqgħodx attenta - kont qed nipprova nifhem fuq proċessur imdendel jekk jaħdimx sew mal-ambjent. Xi trid tfisser, "Ilu mdendel hekk għaxar minuti"? Mill-inqas irnexxielha tirriloka u tmur fil-menu tal-boot! Digressjoni żgħira: għalkemm U-Boot jitgħabba fl-ewwel 2^24 bytes mill-karta SD, meta jibda, jikkopja ruħu f'indirizz aktar 'il bogħod, jew miktub fl-header tal-konfigurazzjoni, jew sempliċiment fl-indirizzi ogħla tar-RAM , u jwettaq karattri ta 'rilokazzjoni ELF, u jittrasferixxi l-kontroll hemmhekk. Allura: jidher li aħna għadda minn dan il-livell u rċevejna bonus li l-proċessur ma hang sewwa wara dak.

Allura għaliex it-tajmer mhux qed jaħdem? Jidher li l-arloġġ mhux qed jaħdem għal xi raġuni...

(gdb) x/x 0x0200bff8
0x200bff8:      0x00000000

X'jiġri jekk iddawwar il-vleġeġ manwalment?

(gdb) set variable *0x0200bff8=310000000
(gdb) c

Imbagħad:

Hit any key to stop autoboot:  0
MMC_SPI: 0 at 0:1 hz 20000000 mode 0

Konklużjoni: l-arloġġ mhux jimmarka. Dan huwa probabbilment għaliex l-input tat-tastiera ma jaħdimx:

HiFive_U-Boot/cmd/bootmenu.c:

static void bootmenu_loop(struct bootmenu_data *menu,
        enum bootmenu_key *key, int *esc)
{
    int c;

    while (!tstc()) {
        WATCHDOG_RESET();
        mdelay(10);
    }

    c = getc();

    switch (*esc) {
    case 0:
        /* First char of ANSI escape sequence 'e' */
        if (c == 'e') {
            *esc = 1;
            *key = KEY_NONE;
        }
        break;
    case 1:
        /* Second char of ANSI '[' */
        if (c == '[') {
...

Il-problema rriżulta li kont xi ftit għaqlija wisq: żidt iċ-ċavetta għall-konfigurazzjoni tal-proċessur:

  case DTSTimebase => BigInt(0)

... ibbażat fuq il-fatt li l-kumment qal "jekk ma tafx, ħalli 0." U wara kollox WithNBigCores I biss issettjah għal 1MHz (kif, mill-mod, kien indikat fil-konfigurazzjoni U-Boot). Imma kkritikat, jien pulit u metikoluż: ma nafx hemm, hawn 25MHz! Fl-aħħar, xejn ma jaħdem. Neħħejt it-“titjib” tiegħi u...

Hit any key to stop autoboot:  0
MMC_SPI: 0 at 0:1 hz 20000000 mode 0
## Unknown partition table type 0
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
** No partition table - mmc 0 **
## Info: input data size = 34 = 0x22
Running uEnv.txt boot2...
## Error: "boot2" not defined
HiFive-Unleashed #

Tista 'saħansitra tidħol kmandi! Pereżempju, wara li toqgħod ftit, fl-aħħar tista’ taqta’ li tidħol mmc_spi 1 10000000 0; mmc part, tnaqqas il-frekwenza SPI minn 20MHz għal 10MHz. Għaliex? Ukoll, il-frekwenza massima ta '20MHz inkitbet fil-konfigurazzjoni, u għadha miktuba hemmhekk. Iżda, safejn nifhem, l-interfaces, għall-inqas hawn, jaħdmu hekk: il-kodiċi jaqsam il-frekwenza tal-unità tal-ħardwer (minjiera hija 25MHz kullimkien) bil-mira, u tistabbilixxi l-valur li jirriżulta bħala diviżur fil-kontroll korrispondenti jirreġistra. Il-problema hija li jekk għal UART ta '115200Hz hemm bejn wieħed u ieħor dak li huwa meħtieġ, allura jekk taqsam 25000000 b'20000000 ikollok 1, i.e. se taħdem f'25MHz. Forsi dan huwa normali, imma jekk jiġu stabbiliti restrizzjonijiet, ifisser li xi ħadd għandu bżonnha (iżda dan mhux ċert)... B'mod ġenerali, huwa aktar faċli li titwaqqaf u timxi 'l quddiem - 'il bogħod u, sfortunatament, għal żmien twil. 25MHz mhuwiex Core i9.

Output tal-console

HiFive-Unleashed # env edit mmcsetup
edit: mmc_spi 1 10000000 0; mmc part
HiFive-Unleashed # boot
MMC_SPI: 1 at 0:1 hz 10000000 mode 0

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000800      0x0000ffde      "Vfat Boot"
        attrs:  0x0000000000000000
        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        type:   data
        guid:   76bd71fd-1694-4ff3-8197-bfa81699c2fb
  2     0x00040800      0x002efaf4      "root"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        type:   linux
        guid:   9f3adcc5-440c-4772-b7b7-283124f38bf3
  3     0x0000044c      0x000007e4      "uboot"
        attrs:  0x0000000000000000
        type:   5b193300-fc78-40cd-8002-e86c45580b47
        guid:   bb349257-0694-4e0f-9932-c801b4d76fa3
  4     0x00000400      0x0000044b      "uboot-env"
        attrs:  0x0000000000000000
        type:   a09354ac-cd63-11e8-9aff-70b3d592f0fa
        guid:   4db442d0-2109-435f-b858-be69629e7dbf
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
2376 bytes read in 0 ms
Running uEnv.txt boot2...
15332118 bytes read in 0 ms
## Loading kernel from FIT Image at 90000000 ...
   Using 'config-1' configuration
   Trying 'bbl' kernel subimage
     Description:  BBL/SBI/riscv-pk
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x900000d4
     Data Size:    74266 Bytes = 72.5 KiB
     Architecture: RISC-V
     OS:           Linux
     Load Address: 0x80000000
     Entry Point:  0x80000000
     Hash algo:    sha256
     Hash value:   28972571467c4ad0cf08a81d9cf92b9dffc5a7cb2e0cd12fdbb3216cf1f19cbd
   Verifying Hash Integrity ... sha256+ OK
## Loading fdt from FIT Image at 90000000 ...
   Using 'config-1' configuration
   Trying 'fdt' fdt subimage
     Description:  unavailable
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x90e9d31c
     Data Size:    6911 Bytes = 6.7 KiB
     Architecture: RISC-V
     Load Address: 0x81f00000
     Hash algo:    sha256
     Hash value:   10b0244a5a9205357772ea1c4e135a4f882409262176d8c7191238cff65bb3a8
   Verifying Hash Integrity ... sha256+ OK
   Loading fdt from 0x90e9d31c to 0x81f00000
   Booting using the fdt blob at 0x81f00000
## Loading loadables from FIT Image at 90000000 ...
   Trying 'kernel' loadables subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x900123e8
     Data Size:    10781356 Bytes = 10.3 MiB
     Architecture: RISC-V
     OS:           Linux
     Load Address: 0x80200000
     Entry Point:  unavailable
     Hash algo:    sha256
     Hash value:   72a9847164f4efb2ac9bae736f86efe7e3772ab1f01ae275e427e2a5389c84f0
   Verifying Hash Integrity ... sha256+ OK
   Loading loadables from 0x900123e8 to 0x80200000
## Loading loadables from FIT Image at 90000000 ...
   Trying 'ramdisk' loadables subimage
     Description:  buildroot initramfs
     Type:         RAMDisk Image
     Compression:  gzip compressed
     Data Start:   0x90a5a780
     Data Size:    4467411 Bytes = 4.3 MiB
     Architecture: RISC-V
     OS:           Linux
     Load Address: 0x82000000
     Entry Point:  unavailable
     Hash algo:    sha256
     Hash value:   883dfd33ca047e3ac10d5667ffdef7b8005cac58b95055c2c2beda44bec49bd0
   Verifying Hash Integrity ... sha256+ OK
   Loading loadables from 0x90a5a780 to 0x82000000

Tajjeb, lħaqna l-livell li jmiss, iżda għadu jiffriża. U xi kultant ibexxex ukoll eċċezzjonijiet. Tista 'tara mcause billi tistenna l-kodiċi fl-indirizz speċifikat $pc u wara si tkun fuq trap_entry. L-U-Boot handler innifsu jista' joħroġ biss għal mcause = 0..4, għalhekk lesti biex teħel f'boot mhux korrett. Imbagħad dħalt fil-konfigurazzjoni, bdejt inħares lejn dak li kont qed nibdel, u ftakart: hemm ġewwa conf/rvboot-fit.txt miktub:

fitfile=image.fit
# below much match what's in FIT (ugha)

Ukoll, ejja nġibu l-fajls kollha f'konformità, ibdel il-linja tal-kmand tal-kernel b'xi ħaġa bħal din, peress li hemm suspetti li SIF0 - dan huwa l-output x'imkien permezz ta' PCIe:

-bootargs=console=ttySIF0,921600 debug
+bootargs=console=ttyS0,125200 debug

U ejja nbiddlu l-algoritmu tal-hashing minn SHA-256 għal MD5: M'għandix bżonn saħħa kriptografika (speċjalment meta niddebuggja), jieħu żmien twil ħafna, u biex jinqabad żbalji ta 'integrità waqt it-tagħbija, MD5 huwa faċli wisq. X'inhu r-riżultat finali? Bdejna nlestu l-livell preċedenti notevolment aktar malajr (minħabba hashing aktar sempliċi), u dak li jmiss infetaħ:

...
   Verifying Hash Integrity ... md5+ OK
   Loading loadables from 0x90a5a758 to 0x82000000
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
chosen {
        linux,initrd-end = <0x00000000 0x83000000>;
        linux,initrd-start = <0x00000000 0x82000000>;
        riscv,kernel-end = <0x00000000 0x80a00000>;
        riscv,kernel-start = <0x00000000 0x80200000>;
        bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
};
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
chosen {
        linux,initrd-end = <0x00000000 0x83000000>;
        linux,initrd-start = <0x00000000 0x82000000>;
        riscv,kernel-end = <0x00000000 0x80a00000>;
        riscv,kernel-start = <0x00000000 0x80200000>;
        bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
};
   Loading Kernel Image ... OK
Booting kernel in
3

Imma l-arloġġ mhux qed jimmarka...

(gdb) x/x 0x0200bff8
0x200bff8:      0x00000000

Oops, jidher li l-korrezzjoni tal-arloġġ irriżulta li kienet plaċebo, għalkemm f'dak iż-żmien deherli li għen. Le, ovvjament jeħtieġ li jiġi ffissat, imma l-ewwel ejja ddawwar il-vleġeġ manwalment u naraw x'jiġri:

0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=1000000
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=2000000
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=3000000
(gdb) c
Continuing.

Sadanittant…

   Loading Kernel Image ... OK
Booting kernel in
3
2
1
0
## Starting application at 0x80000000 ...

Le, se mmur awtomat l-arloġġ - inkella forsi jiddeċiedi li jikkalibra t-tajmer hemmhekk!

Sadanittant, l-indirizz tal-istruzzjoni attwali jindika x'imkien

0000000080001c20 <poweroff>:
    80001c20:   1141                    addi    sp,sp,-16
    80001c22:   e022                    sd      s0,0(sp)
    80001c24:   842a                    mv      s0,a0
    80001c26:   00005517                auipc   a0,0x5
    80001c2a:   0ca50513                addi    a0,a0,202 # 80006cf0 <softfloat_countLeadingZeros8+0x558>
    80001c2e:   e406                    sd      ra,8(sp)
    80001c30:   f7fff0ef                jal     ra,80001bae <printm>
    80001c34:   8522                    mv      a0,s0
    80001c36:   267000ef                jal     ra,8000269c <finisher_exit>
    80001c3a:   00010797                auipc   a5,0x10
    80001c3e:   41e78793                addi    a5,a5,1054 # 80012058 <htif>
    80001c42:   639c                    ld      a5,0(a5)
    80001c44:   c399                    beqz    a5,80001c4a <poweroff+0x2a>
    80001c46:   72c000ef                jal     ra,80002372 <htif_poweroff>
    80001c4a:   45a1                    li      a1,8
    80001c4c:   4501                    li      a0,0
    80001c4e:   dc7ff0ef                jal     ra,80001a14 <send_ipi_many>
    80001c52:   10500073                wfi
    80001c56:   bff5                    j       80001c52 <poweroff+0x32>

ġewwa l-Berkeley Boot Loader mgħobbija. Personalment, dak li jħawwadni dwar dan huwa l-aċċenn htif — host interface użat għat-tnedija marbuta tal-kernel (jiġifieri, f'kooperazzjoni mal-host ARM), assumejt waħdu. Madankollu, jekk issib din il-funzjoni fil-kodiċi tas-sors, tista 'tara li mhux kollox huwa daqshekk ħażin:

void poweroff(uint16_t code)
{
  printm("Power offrn");
  finisher_exit(code);
  if (htif) {
    htif_poweroff();
  } else {
    send_ipi_many(0, IPI_HALT);
    while (1) { asm volatile ("wfin"); }
  }
}

Tfittxija: ibda l-arloġġ

It-tfittxija għar-reġistri f'CLINT twassalna għal

    val io = IO(new Bundle {
      val rtcTick = Bool(INPUT)
    })

    val time = RegInit(UInt(0, width = timeWidth))
    when (io.rtcTick) { time := time + UInt(1) }

Li jgħaqqad mal-RTC, jew mal-misterjuż MockAON, li fil-bidu ħsibt dwaru: “Mela, x’għandna hawn? Mhux ċar? Ejja nitfih!" Peress li għadni ma nifhimx x'tip ta 'maġija ta' arloġġ qed issir hemmhekk, għalhekk ser nimplimenta mill-ġdid din il-loġika f' System.scala:

  val rtcDivider = RegInit(0.asUInt(16.W)) // на всякий случай поддержу до 16ГГц, я оптимист :)
  val mhzInt = p(DevKitFPGAFrequencyKey).toInt
  // Преположим, частота равна целому числу мегагерц
  rtcDivider := Mux(rtcDivider === (mhzInt - 1).U, 0.U, rtcDivider + 1.U)
  outer.clintOpt.foreach { clint =>
    clint.module.io.rtcTick := rtcDivider === 0.U
  }

Nagħmlu triqtna lejn il-kernel tal-Linux

Hawnhekk l-istorja diġà mkaxkra u saret xi ftit monotona, għalhekk ser niddeskriviha minn fuq għal isfel:

BBL assumiet il-preżenza ta 'FDT at 0xF0000000, imma diġà kkoreġejtha! Ukoll, ejja nħarsu mill-ġdid... Sibtha fi HiFive_U-Boot/arch/riscv/lib/boot.c, mibdul bi 0x81F00000, speċifikat fil-konfigurazzjoni tal-boot U-Boot.

Imbagħad BBL ilmenta li ma kienx hemm memorja. It-triq tiegħi kienet fil-funzjoni mem_prop, x'in riscv-pk/machine/fdt.c: minn hemm tgħallimt li għandek bżonn timmarka l-fdt ram node bħala device_type = "memory" - allura, forsi, il-ġeneratur tal-proċessur ikollu bżonn jiġi kkoreġut, iżda għalissa nikteb biss manwalment - xorta waħda, ittrasferijt dan il-fajl manwalment.

Issa sibt il-messaġġ (provdut f'forma fformattjata, b'ritorni bil-ġarr):

This is bbl's dummy_payload.  To boot a real kernel, reconfigure bbl
with the flag --with-payload=PATH, then rebuild bbl. Alternatively,
bbl can be used in firmware-only mode by adding device-tree nodes
for an external payload and use QEMU's -bios and -kernel options.

Jidher li l-għażliet huma indikati kif meħtieġ riscv,kernel-start и riscv,kernel-end f'DTB, iżda żerijiet huma parsed. Debugging query_chosen wera li BBL qed jipprova jparsa indirizz ta '32-bit, iżda jiltaqa' ma 'par <0x0 0xADDR>, u l-ewwel valur jidher li huwa l-inqas bits sinifikanti. Miżjud mat-taqsima chosen

chosen {
      #address-cells = <1>;
      #size-cells = <0>;
      ...
}

u kkoreġuta l-ġenerazzjoni tal-valuri: iżżidx 0x0 l-ewwel element.

Dawn il-100500 pass sempliċi se jagħmluha faċli biex tara pingwin jaqa':

Test moħbi

   Verifying Hash Integrity ... md5+ OK
   Loading loadables from 0x90a5a758 to 0x82000000
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
chosen {
        linux,initrd-end = <0x83000000>;
        linux,initrd-start = <0x82000000>;
        riscv,kernel-end = <0x80a00000>;
        riscv,kernel-start = <0x80200000>;
        #address-cells = <0x00000001>;
        #size-cells = <0x00000000>;
        bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
        stdout-path = "uart0:38400n8";
};
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
chosen {
        linux,initrd-end = <0x83000000>;
        linux,initrd-start = <0x82000000>;
        riscv,kernel-end = <0x80a00000>;
        riscv,kernel-start = <0x80200000>;
        #address-cells = <0x00000001>;
        #size-cells = <0x00000000>;
        bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
        stdout-path = "uart0:38400n8";
};
   Loading Kernel Image ... OK
Booting kernel in
3
2
1
0
## Starting application at 0x80000000 ...
bbl loader

                SIFIVE, INC.

         5555555555555555555555555
        5555                   5555
       5555                     5555
      5555                       5555
     5555       5555555555555555555555
    5555       555555555555555555555555
   5555                             5555
  5555                               5555
 5555                                 5555
5555555555555555555555555555          55555
 55555           555555555           55555
   55555           55555           55555
     55555           5           55555
       55555                   55555
         55555               55555
           55555           55555
             55555       55555
               55555   55555
                 555555555
                   55555
                     5

           SiFive RISC-V Core IP
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Wed Jul 3 21:29:21 MSK 2019
[    0.000000] bootconsole [early0] enabled
[    0.000000] Initial ramdisk at: 0x(____ptrval____) (16777216 bytes)
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000]   Normal   [mem 0x00000000c0000000-0x00000bffffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[    0.000000] On node 0 totalpages: 261632
[    0.000000]   DMA32 zone: 3577 pages used for memmap
[    0.000000]   DMA32 zone: 0 pages reserved
[    0.000000]   DMA32 zone: 261632 pages, LIFO batch:63
[    0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)

(il-logo jintwera minn BBL, u dak bil-timestamps jintwera mill-qalba).

Fortunatament, ma nafx kif inhi kullimkien, iżda fuq RocketChip, meta tqabbad debugger permezz ta 'JTAG, tista' taqbad in-nases barra mill-kaxxa - id-debugger jieqaf eżattament f'dan il-punt.

Program received signal SIGTRAP, Trace/breakpoint trap.
0xffffffe0000024ca in ?? ()
(gdb) bt
#0  0xffffffe0000024ca in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) file work/linux/vmlinux
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from work/linux/vmlinux...done.
(gdb) bt
#0  0xffffffe0000024ca in setup_smp () at /hdd/trosinenko/fpga/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:75
#1  0x0000000000000000 in ?? ()
Backtrace stopped: frame did not save the PC

freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:

void __init setup_smp(void)
{
    struct device_node *dn = NULL;
    int hart;
    bool found_boot_cpu = false;
    int cpuid = 1;

    while ((dn = of_find_node_by_type(dn, "cpu"))) {
        hart = riscv_of_processor_hartid(dn);
        if (hart < 0)
            continue;

        if (hart == cpuid_to_hartid_map(0)) {
            BUG_ON(found_boot_cpu);
            found_boot_cpu = 1;
            continue;
        }

        cpuid_to_hartid_map(cpuid) = hart;
        set_cpu_possible(cpuid, true);
        set_cpu_present(cpuid, true);
        cpuid++;
    }

    BUG_ON(!found_boot_cpu); // < ВЫ НАХОДИТЕСЬ ЗДЕСЬ
}

Kif qalet iċ-ċajta l-antika, CPU ma nstabx, qed jaħdem emulazzjoni tas-softwer. Ukoll, jew mhux qed taħdem. Mitluf f'qalba waħda tal-proċessur.

/* The lucky hart to first increment this variable will boot the other cores */
atomic_t hart_lottery;
unsigned long boot_cpu_hartid;

Kumment sabiħ fi linux/arch/riscv/kernel/setup.c - tip ta 'pittura ta' ċint bl-użu tal-metodu Tom Sawyer. B'mod ġenerali, għal xi raġuni ma kienx hemm rebbieħa llum, il-premju jiġi trasferit għat-tlugħ li jmiss...

Hawnhekk nipproponi li jintemm l-artiklu diġà twil.

Ser jitkompla aktar il-quddiem. Se jkun hemm ġlieda ma 'bug cunning li jirnexxielu jaħbi jekk inti bil-mod creep up fuqha ma singlestep.

Test download screencast (link esterna):
Parti 3: Kważi tagħbija Linux minn SD card għal RocketChip

Sors: www.habr.com

Żid kumment