В
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 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:
Veduta tal-qiegħ:
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
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 sudo
għ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).
Jidher, x'iktar li tistenna - ħarxa inkorporata, x'tip ta 'kodiċi tas-sors hemm? Imma fi
(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.
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 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
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
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):
Sors: www.habr.com