https://www.xilinx.com/video/soc/runnin ... -line.html - тут, якобы можно эмулировать Zynq с кучей устройств. Верится очень слабо, конечно. Но надо попробовать.
Брекпойнт на значение lr:
Код: Выделить всё
tb *$lr
Код: Выделить всё
tb *$lr
Код: Выделить всё
qemu-system-aarch64 \
-M arm-generic-fdt-7series \
-machine linux=on \
-serial /dev/null -serial mon:stdio \
-display none \
-kernel <guest image path> \
-dtb <Zynq7000 DTB path> \
-m <DDR memory size> \
-device loader,addr=0xf8000008,data=0xDF0D,data-len=4 \
-device loader,addr=0xf8000140,data=0x00500801,data-len=4 \
-device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 \
-device loader,addr=0xf8000108,data=0x0001e008,data-len=4 \
-device loader,addr=0xf8000910,data=0x0000000F,data-len=4
Код: Выделить всё
qemu-img convert -f raw -O qcow2 /y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img /e/ea2/ZyboZ710.ZynqA2.qcow2
Код: Выделить всё
den@d18:/y/jaos/Linux64/work/build$ qemu-img convert -f raw -O qcow2 ZyboZ710.ZynqA2.img /e/ea2/ZyboZ710.ZynqA2.qcow2
den@d18:/y/jaos/Linux64/work/build$ sudo modprobe nbd max_part=8
den@d18:/y/jaos/Linux64/work/build$ sudo qemu-nbd --connect=/dev/nbd0 /e/ea2/ZyboZ710.ZynqA2.qcow2
den@d18:/y/jaos/Linux64/work/build$ cd /e/ea2
den@d18:/e/ea2$ mkdir check-mount
den@d18:/e/ea2$ cd check-mount/
den@d18:/e/ea2/check-mount$ mkdir p1; mkdir p2; mkdir p3
den@d18:/e/ea2/check-mount$ sudo mount /dev/nbd
nbd0 nbd0p2 nbd1 nbd11 nbd13 nbd15 nbd3 nbd5 nbd7 nbd9
nbd0p1 nbd0p3 nbd10 nbd12 nbd14 nbd2 nbd4 nbd6 nbd8
den@d18:/e/ea2/check-mount$ sudo mount /dev/nbd0p1 p1
den@d18:/e/ea2/check-mount$ sudo mount /dev/nbd0p2 p2
mount: /e/ea2/check-mount/p2: wrong fs type, bad option, bad superblock on /dev/nbd0p2, missing codepage or helper program, or other error.
den@d18:/e/ea2/check-mount$ sudo mount /dev/nbd0p3 p3
mount: /e/ea2/check-mount/p3: wrong fs type, bad option, bad superblock on /dev/nbd0p3, missing codepage or helper program, or other error.
den@d18:/e/ea2/check-mount$ ls p1
BOOT.BIN
den@d18:/e/ea2/check-mount$ sudo fdisk /dev/nbd0 -l
Диск /dev/nbd0: 400 MiB, 419430400 байт, 819200 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x0d670d66
Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип
/dev/nbd0p1 63 132047 131985 64,5M b W95 FAT32
/dev/nbd0p2 132048 264095 132048 64,5M 4c неизвестный
/dev/nbd0p3 264096 789263 525168 256,4M 4c неизвестный
Код: Выделить всё
sudo apt install device-tree-compiler
Код: Выделить всё
IDE=zynq-zybo-z7
SRC=$IDE.dts
TMP=$IDE.tmp.dts
DST=$IDE.dtb
cpp -nostdinc -I include -undef -x assembler-with-cpp $SRC > $TMP
dtc -O dtb -b 0 -o $DST $TMP
rm $TMP
Код: Выделить всё
# https://support.xilinx.com/s/question/0D52E00006hpQ3eSAE/petalinux-qemu-sd-card-boot-with-ext4-root-fs?language=en_US
qemu-system-aarch64 -M arm-generic-fdt-7series \
-serial /dev/null -serial mon:stdio \
-display none \
-dtb /e/xlnx-dtb/zynq-zybo-z7.dtb \
-device loader,addr=0xf8000008,data=0xDF0D,data-len=4 \
-device loader,addr=0xf8000140,data=0x00500801,data-len=4 \
-device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 \
-device loader,addr=0xf8000108,data=0x0001e008,data-len=4 \
-device loader,addr=0xF8000910,data=0xF,data-len=0x4 \
-drive file=/e/ea2/ZyboZ710.ZynqA2.qcow2,if=sd,format=raw \
-device loader,file=/y/jaos/Linux64/work/Zbl.Bin,addr=0x0 \
-boot mode=3 -drive index=0 \
-S -s
Код: Выделить всё
module Platform key: FE0CD7B4E
modEntry =0
loading Platform 132 00000070 0000007C 0000007C
module Board key: FC944B1A2
modEntry =0
loading Board 28 00000100 00000100 00000100
module TclInit key: FB899AD06
modEntry =0
loading TclInit 28 0000011C 0000011C 0000011C
module ZynqInitializer key: FE84042B4
modEntry =0
loading ZynqInitializer 10636 00000138 00000138 00000138
module FPE64 key: FC40CBAA4
modEntry =0
loading FPE64 8224 00002AC4 00002AC4 00002AC4
module Builtins key: 01B87C79F
modEntry =0
loading Builtins 8548 00004AE4 00004AE4 00004AE4
module PsUartMin key: 02EF1FDBF
modEntry =0
loading PsUartMin 3312 00006C48 00006C58 00006C58
module Trace key: 05F97A620
modEntry =0
loading Trace 5884 00007948 00007950 00007950
module TraceDevice key: FD42C9F61
modEntry =0
loading TraceDevice 512 0000904C 00009050 00009050
module Caches key: 073D47F79
modEntry =0
loading Caches 1580 00009250 00009250 00009250
module Memory key: FEFCB8E6A
modEntry =0
loading Memory 1852 0000987C 00009888 00009888
module MemoryMapping key: 063660879
modEntry =0
loading MemoryMapping 360 00009FC4 00009FC4 00009FC4
module Interrupts key: 04BA0C495
modEntry =0
loading Interrupts 6260 0000A12C 0000C144 0000C144
module Bit key: FB69894EB
modEntry =0
loading Bit 2120 0000D9B8 0000D9B8 0000D9B8
module Clocks key: FD17E6585
modEntry =0
loading Clocks 692 0000E200 0000E220 0000E220
module KernelUtils key: FBE9A78FC
modEntry =0
loading KernelUtils 996 0000E4D4 0000E4D8 0000E4D8
module GlobalTimer key: FF0DE6C5E
modEntry =0
loading GlobalTimer 1864 0000E8BC 0000E8BC 0000E8BC
module Kernel key: 04D18946E
modEntry =0
loading Kernel 1500 0000F004 0000F394 0000F394
module Utils key: FD31E4701
modEntry =0
loading Utils 144 0000F970 0000F970 0000F970
module Strings key: F9A0D453A
modEntry =0
loading Strings 8712 0000FA00 0000FA00 0000FA00
module Heaps key: FF5BA1618
modEntry =0
loading Heaps 2360 00011C08 00011C14 00011C14
module OFS key: F89EB6595
modEntry =0
loading OFS 43428 0001254C 000135EC 000135EC
module Modules key: 000C80C35
modEntry =0
loading Modules 4788 0001DF90 0001DFB8 0001DFB8
module SdEnvironment key: FF1CB22B0
modEntry =0
loading SdEnvironment 1752 0001F26C 0001F2A8 0001F2A8
module Sd key: F9C915D8A
modEntry =0
loading Sd 30492 0001F980 0001F9C4 0001F9C4
module Disks key: FEC7E25EB
modEntry =0
loading Disks 4384 000270E0 000270E4 000270E4
module SdDisks key: FEA59A5C2
modEntry =0
loading SdDisks 5116 00028204 0002820C 0002820C
module SdControllers key: 052F4C277
modEntry =0
loading SdControllers 1516 00029608 00029610 00029610
module OFSDiskVolumes key: 060606776
modEntry =0
loading OFSDiskVolumes 5212 00029BFC 00029DFC 00029DFC
module Bootstrap key: 03D452385
modEntry =0
loading Bootstrap 676 0002B258 0002B264 0002B264
Wrote image file Zbl.Bin
Output file length =181508 First entry at 00000007C
Creating Zynq BootROM image...Copied 181508/181508B.
done
Код: Выделить всё
qemu-system-aarch64 -M arm-generic-fdt-7series \
-serial /dev/null -serial mon:stdio \
-display none \
-dtb /e/xlnx-dtb/zynq-zybo-z7.dtb \
-device loader,addr=0xf8000008,data=0xDF0D,data-len=4 \
-device loader,addr=0xf8000140,data=0x00500801,data-len=4 \
-device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 \
-device loader,addr=0xf8000108,data=0x0001e008,data-len=4 \
-device loader,addr=0xF8000910,data=0xF,data-len=0x4 \
-drive file=/e/ea2/ZyboZ710.ZynqA2.qcow2,if=sd,format=raw \
-device loader,file=/y/jaos/Linux64/work/Zbl.Bin,addr=0x0 \
-boot mode=3 -drive index=0 \
-S -s
Код: Выделить всё
Тело MINOS:/hal/zynq/SDControllers
SdEnvironment.Enable
NEW(hc0 (* типа Sd.HostController, просто запись*));
Sd.InitHostController(hc0, ..., ..., );
Код: Выделить всё
den@d18:/e$ fdisk -l /y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img
Диск /y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img: 400 MiB, 419430400 байт, 819200 секторов
Размер сектора (логический/физический): 512 байт / 512 байт
Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип
/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img1 63 132047 131985 64,5M b W95 FAT32
/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img2 132048 264095 132048 64,5M 4c неизвестный
/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img3 264096 789263 525168 256,4M 4c неизвестный
$ python3 -c 'print(hex(512 * 132048), "номер сектора: ",hex(132048))'
0x407a000 номер сектора: 0x203d0
$ python3 -c 'print(hex(512 * 264096), "номер сектора: ",hex(264096))'
0x80f4000 номер сектора: 0x407a0
Код: Выделить всё
/y/jaos/ARM/zbl/OFSDiskVolumes.Mos/New - инициализация SD-карты
InitVol - инициализация тома
GetOberonFs - читает заголовок обероновой партиции (пока неудачно)
/y/jaos/ARM/Minos/SdDisks.Mos/InitBlockDevice - здесь ставится размер буфера
Read - отвечает за чтение с карты блоков (не знает о размере сектора).
SD.Mod/Read - собственно читает сектора.
Код: Выделить всё
../configure --enable-trace-backends=simple --target-list=aarch64-softmmu --enable-debug
Код: Выделить всё
/e/run$ cat /e/run/tracing-events.txt
sdcard_read_block
sdcard_set_blocklen
sdcard_reset
Код: Выделить всё
qemu-system-aarch64 -M arm-generic-fdt-7series \
--trace events=/e/run/tracing-events.txt \
-serial /dev/null -serial stdio \
-dtb /e/xlnx-dtb/zynq-zybo-z7.dtb \
-device loader,addr=0xf8000008,data=0xDF0D,data-len=4 \
-device loader,addr=0xf8000140,data=0x00500801,data-len=4 \
-device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 \
-device loader,addr=0xf8000108,data=0x0001e008,data-len=4 \
-device loader,addr=0xF8000910,data=0xF,data-len=0x4 \
-drive file=/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img,if=sd,format=raw \
-device loader,file=/y/jaos/Linux64/work/Zbl.Bin,addr=0x0 \
-m 1G
Код: Выделить всё
/e/xemu/scripts/simpletrace.py /e/xemu/build/trace-events-all trace-4034 | less
Карты SDHC несовместимы с устройствами, изначально рассчитанными только на SD-карты. Ключевым нововведением для SDHC-карт, позволившим им превзойти объём в 4 ГБ, стало введение посекторной адресации (аналогично жёстким дискам), в то время как обычные SD-карты имеют побайтную адресацию (как оперативная память) и, соответственно, при 32-разрядном адресе могут иметь объём не более 4 ГБ.
Код: Выделить всё
qemu-img convert -f raw -O qcow2 /y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img /e/run/ZyboZ710.ZynqA2.qcow2
qemu-img resize /e/run/ZyboZ710.ZynqA2.qcow2 4GB
Код: Выделить всё
ZBL:Ofs.mos/NewFs
GetSector
GetBlock ->
ZBL:OfsDiskVolumes.Mos/GetBlock
Код: Выделить всё
installing UART - ZBL:Bootloader.Mos/InitShellUART (вызывается из тела)
Oberon Embedded Bootloader started - начало тела ZBL:Bootloader.Mos
INFO: Enter - встречается в ZBL:tools/OEBLoopbackInterfaces.Mod, ZBL:tools/OEBSerialInterfaces.Mod, ZBL:tools/OEBUdpInterfaces.Mod
INFO: Leave - то же.
Код: Выделить всё
FSTools.CreateFile BLAOSFS:/init.txt timeout 3
setinput UART
~
Код: Выделить всё
deploy bs ZynqFpga
deploy bootconfig A2Config
deploy a2 memory 100000H 0 1
start
Код: Выделить всё
ProgramCmd = "deploy"; (** Planning Command to deploy a resource on a device *)
StartCmd = "start"; (** Execute Plan command *)
Код: Выделить всё
qemu-system-aarch64 -M arm-generic-fdt-7series \
--trace events=/e/run/tracing-events.txt \
-serial /dev/null -serial stdio \
-dtb /e/xlnx-dtb/zynq-zybo-z7.dtb \
-device loader,addr=0xf8000008,data=0xDF0D,data-len=4 \
-device loader,addr=0xf8000140,data=0x00500801,data-len=4 \
-device loader,addr=0xf800012c,data=0x1ed044d,data-len=4 \
-device loader,addr=0xf8000108,data=0x0001e008,data-len=4 \
-device loader,addr=0xF8000910,data=0xF,data-len=0x4 \
-drive file=/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img,if=sd,format=raw \
-device loader,file=/y/jaos/Linux64/work/Zbl.Bin,addr=0x0 \
-m 1G
Код: Выделить всё
SetFirstLevelEntry: virtual/physical/entry address/entry: 00000000 0001BC00 0002C000 0001BC01
Entering SetSecondLevelEntry, vAddr = 00001000, phAddress = 00001000, flags = 0000047C
SetSecondLevelEntry: address in table = 0001BC04
...
Entering SetSecondLevelEntry, vAddr = 000FF000, phAddress = 000FF000, flags = 0000047C
SetSecondLevelEntry: address in table = 0001BFFC
SetFirstLevelEntry: virtual/physical/entry address/entry: FFF00000 FFF00000 0002FFFC FFF11C0E
SetFirstLevelEntry: virtual/physical/entry address/entry: 00100000 00100000 0002C004 00111C0E
...
SetFirstLevelEntry: virtual/physical/entry address/entry: 1BF00000 1BF00000 0002C6FC 1BF11C0E
SetFirstLevelEntry: virtual/physical/entry address/entry: 1C000000 1C000000 0002C700 1C011C0E
SetFirstLevelEntry: virtual/physical/entry address/entry: 40000000 40000000 0002D000 40010C06
SetFirstLevelEntry: virtual/physical/entry address/entry: 40100000 40100000 0002D004 40110C06
...
SetFirstLevelEntry: virtual/physical/entry address/entry: FDE00000 FDE00000 0002FF78 FDE10C06
SetFirstLevelEntry: virtual/physical/entry address/entry: FDF00000 FDF00000 0002FF7C FDF10C06
SetFirstLevelEntry: virtual/physical/entry address/entry: 1C100000 0001C400 0002C704 0001C401
SetFirstLevelEntry: virtual/physical/entry address/entry: 1C200000 0001C800 0002C708 0001C801
...
SetFirstLevelEntry: virtual/physical/entry address/entry: 1FE00000 0002B800 0002C7F8 0002B801
SetFirstLevelEntry: virtual/physical/entry address/entry: 1FF00000 0002BC00 0002C7FC 0002BC01
Entering SetSecondLevelEntry, vAddr = 1FFFF000, phAddress = 1FFFF000, flags = 0000047C
SetSecondLevelEntry: address in table = 0002BFFC
Код: Выделить всё
System Start: 00000000
System Stop: 00030000
System Size: 00030000
Interrupt Stack Start: 00001000
Interrupt Stack Stop: 00008000
Interrupt Stack Size: 00007000
First Page Table Start: 0002C000
First Page Table Stop: 00030000
First Page Table Size: 00004000
Second Page Table Start: 0001BC00
Код: Выделить всё
Second Page Table Stop: 0002C000
Second Page Table Size: 00010400
Heap Start: 00100000
Heap Stop: 1C100000
Heap Size: 1C000000
Stack Start: 1C100000
Stack Stop: 1FFFF000
Stack Size: 03EFF000
Config Start: 1FFFF000
Config Stop: 20000000
Config Size: 00001000
Код: Выделить всё
I/O Start: 40000000
I/O Stop: FE000000
I/O Size: BE000000
SysHigh Start: FFF00000
SysHigh Stop: FFFFFFFE
Interrupt Vector Start: FFFF0000
Interrupt Vector Stop: FFFF1000
Interrupt Vector Size: 00001000
Cache References Start: FFFF1000
Код: Выделить всё
Cache References Stop: FFFF50C0
Cache References Size: 000040C0
Cache References Stack Offset: 000001C0