if { [file exists ata.raw] == 0 } then {
	# create empty block device file
	catch { exec dd if=/dev/zero of=ata.raw bs=512 count=20480 }
	# create to tro primary partitions (one is extented) and two logical paritions
	puts "using sfdisk to partition disk image, requires root privileges"
	catch { exec echo "2048,4096,c\n4096,16386,5\n0,0\n0,0\n6144,4096,c\n12288,8192,c\n" | sudo sfdisk -uS -f ata.raw }
}

#
# Build
#

set build_components {
	core init drivers/pci drivers/timer
	drivers/atapi drivers/sd_card
	server/part_blk test/part_blk
}
build $build_components

create_boot_directory

#
# Generate config
#

append config {
<config prio_levels="1" verbose="yes">
	<parent-provides>
		<service name="ROM"/>
		<service name="RAM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="CAP"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
		<service name="SIGNAL" />
	</parent-provides>
	<default-route>
		<any-service> <parent/> <any-child/> </any-service>
	</default-route>
	<start name="timer">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Timer"/></provides>
	</start>
}

# ATA driver on PCI
append_if [have_spec pci] config {
	<start name="pci">
		<resource name="RAM" quantum="2M"/>
		<binary name="pci_drv"/>
		<provides><service name="PCI"/></provides>
	</start>
	<start name="atapi_drv">
		<resource name="RAM" quantum="1M" />
		<provides><service name="Block"/></provides>
		<config ata="yes" />
	</start>
	<start name="part_blk">
		<resource name="RAM" quantum="10M" />
		<provides><service name="Block" /></provides>
		<route>
			<any-service><child name="atapi_drv"/> <parent/><any-child/></any-service>
		</route>
		<config>
			<policy label="test-part1" partition="6"/>
			<policy label="test-part2" partition="1"/>
		</config>
	</start>
}

# SD/MMC driver for PL180
append_if [have_spec pl180] config {
	<start name="sd_card_drv">
		<resource name="RAM" quantum="1M" />
		<provides><service name="Block"/></provides>
	</start>
	<start name="part_blk">
		<resource name="RAM" quantum="10M" />
		<provides><service name="Block" /></provides>
		<route>
			<any-service><child name="sd_card_drv"/> <parent/><any-child/></any-service>
		</route>
		<config>
			<policy label="test-part1" partition="6"/>
			<policy label="test-part2" partition="1"/>
		</config>
	</start>
}

append config {
	<start name="test-part1">
		<binary name="test-part"/>
		<resource name="RAM" quantum="10M" />
		<route>
			<any-service> <child name="part_blk" /> <parent/> <any-child/> </any-service>
		</route>
		<config pattern="0x44" />
	</start>
	<start name="test-part2">
		<binary name="test-part"/>
		<resource name="RAM" quantum="10M" />
		<route>
			<any-service> <child name="part_blk" /> <parent/> <any-child/> </any-service>
		</route>
		<config pattern="0x33" />
	</start>
</config>
}

install_config $config

#
# Boot modules
#

set boot_modules {
	core init timer part_blk test-part
}

append_if [have_spec pci]   boot_modules { pci_drv atapi_drv }
append_if [have_spec pl180] boot_modules { sd_card_drv }

build_boot_image $boot_modules

#
# Qemu
#

append qemu_args " -nographic -m 64 "
append_if [have_spec   pci] qemu_args " -boot d -hda ata.raw "
append_if [have_spec pl180] qemu_args " -drive file=ata.raw,if=sd "

run_genode_until "Success.*\n.*Success.*\n" 10

grep_output {^\[init -> test-part}
unify_output {[0-9]} "x"

compare_output_to {
[init -> test-partx] Success
[init -> test-partx] Success
}
