Files

91 lines
3.2 KiB
Plaintext
Raw Permalink Normal View History

: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