91 lines
3.2 KiB
Plaintext
91 lines
3.2 KiB
Plaintext
:name: X86_64-KVM Linux
|
|
:description: This script runs Linux on a bare x86_64 platform in KVM.
|
|
|
|
$name?="x86_64-kvm"
|
|
mach create $name
|
|
|
|
$bin?=@https://dl.antmicro.com/projects/renode/virt_x86_64--linux.bin-s_9012224-95afda97d7185427a02333412baa95daac72270a
|
|
$bios?=@https://dl.antmicro.com/projects/renode/virt_x86--kvmtool-bios.bin-s_687-dfaa7e98ad587f40df43a0d8eff5c320de72f9bf
|
|
|
|
machine LoadPlatformDescription @platforms/cpus/x86_64-kvm.repl
|
|
|
|
showAnalyzer uart
|
|
|
|
macro reset
|
|
"""
|
|
# Load linux headers (assuming 'setup_sects' = 0x1f)
|
|
sysbus LoadBinary $bin 0x10000 sysbus.cpu offset=0x0 size=0x4000
|
|
|
|
# Load bios
|
|
sysbus LoadBinary $bios 0xf0000 sysbus.cpu
|
|
|
|
# Load linux -- skip the header (assuming 'setup_sects' = 0x1f)
|
|
sysbus LoadBinary $bin 0x100000 sysbus.cpu offset=0x4000
|
|
|
|
|
|
# Setup e820 memory map at address 0x9fc00
|
|
# Set e820_entries
|
|
sysbus WriteDoubleWord 0x9fc00 4
|
|
# Set bios RAM
|
|
sysbus WriteQuadWord 0x9fc04 0 # Start address
|
|
sysbus WriteQuadWord 0x9fc0c 0x9fc00 # Size
|
|
sysbus WriteDoubleWord 0x9fc14 1 # Type RAM
|
|
# Set e820 Map
|
|
sysbus WriteQuadWord 0x9fc18 0x9fc00 # Start address
|
|
sysbus WriteQuadWord 0x9fc20 0x400 # Size
|
|
sysbus WriteDoubleWord 0x9fc28 2 # Type reserved
|
|
# Set BIOS ROM
|
|
sysbus WriteQuadWord 0x9fc2c 0xf0000 # Start address
|
|
sysbus WriteQuadWord 0x9fc34 0x10000 # Size
|
|
sysbus WriteDoubleWord 0x9fc3c 2 # Type reserved
|
|
# Set RAM
|
|
sysbus WriteQuadWord 0x9fc40 0x100000 # Start address
|
|
sysbus WriteQuadWord 0x9fc48 0x1ff00000 # Size
|
|
sysbus WriteDoubleWord 0x9fc50 1 # Type RAM
|
|
|
|
|
|
# Setup Interrupt Vector
|
|
# kvmtool's fake interrupt handler is loaded at address 0xf0030
|
|
sysbus FillWithConstantDoubleWord 0xf0000030 256
|
|
# Setup real 15-th interrupt handler loaded at address 0xf0080
|
|
sysbus WriteDoubleWord 0x54 0xf0000080
|
|
|
|
|
|
# Override kernel header values.
|
|
# For more info please refer to https://docs.kernel.org/arch/x86/zero-page.html
|
|
|
|
# Set 'cmd_line'. Do not use APIC/ACPI as it is not implemented yet.
|
|
sysbus WriteASCIIString 0x20000 "noapic noacpi earlyprintk=serial console=ttyS0 root=/dev/vda rw"
|
|
# Set address of 'cmd_line' in `cmd_line_ptr` field
|
|
sysbus WriteDoubleWord 0x10228 0x20000
|
|
|
|
# Set 'type_of_loader' to undefined
|
|
sysbus WriteByte 0x10210 0xff
|
|
|
|
# Set 'heap_end_ptr'
|
|
sysbus WriteWord 0x10212 0xfe00
|
|
# Set 'loadflags' with 'LOADED_HIGH' and 'CAN_USE_HEAP' flags
|
|
sysbus WriteByte 0x10211 0x81
|
|
|
|
|
|
# Set SegmentRegisters to start in real-mode
|
|
sysbus.cpu SetDescriptor CS 0x1000 0x10000 0xffff 0x9b00
|
|
sysbus.cpu SetDescriptor DS 0x1000 0x10000 0xffff 0x9300
|
|
sysbus.cpu SetDescriptor ES 0x1000 0x10000 0xffff 0x9300
|
|
sysbus.cpu SetDescriptor SS 0x1000 0x10000 0xffff 0x9300
|
|
sysbus.cpu SetDescriptor FS 0x1000 0x10000 0xffff 0x9300
|
|
sysbus.cpu SetDescriptor GS 0x1000 0x10000 0xffff 0x9300
|
|
|
|
# Set entrypoint to 0x10200 = (CS << 4) + RIP
|
|
sysbus.cpu RIP 0x200
|
|
# Set to safe, available memory
|
|
sysbus.cpu RBP 0x8000
|
|
sysbus.cpu RSP 0x8000
|
|
|
|
# Set IF flag
|
|
sysbus.cpu EFLAGS 0x202
|
|
"""
|
|
runMacro $reset
|
|
|
|
logLevel 3
|