#
# \brief  Test to start threads on all available CPUs
# \author Norman Feske
# \author Alexander Boettcher
#

if {
	![have_spec arndale]                           &&
	![have_spec wand_quad]                         &&
	![have_spec panda]                             &&
	![expr [have_spec x86_32] && [have_spec foc] ] &&
	![expr [have_spec x86_64] && [have_spec foc] ] &&
	![have_spec nova] &&
	![have_spec sel4]
} {
	puts "Platform is unsupported."
	exit 0
}


set build_components { core init test/affinity }

lappend_if [have_spec arndale] build_components drivers/platform

build $build_components

create_boot_directory

set config {
	<config>
		<parent-provides>
			<service name="LOG"/>
			<service name="CPU"/>
			<service name="PD"/>
			<service name="ROM"/>
			<service name="IO_MEM"/>
		</parent-provides>
		<default-route>
			<any-service> <parent/> </any-service>
		</default-route>
		<default caps="100"/>}

append_if [have_spec arndale] config {
	<start name="platform_drv">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Regulator"/></provides>
	</start> }

append config {
		<start name="test-affinity">
			<resource name="RAM" quantum="10M"/>
		</start>
	</config> }

install_config $config

set boot_modules { core ld.lib.so init test-affinity }

lappend_if [have_spec arndale] boot_modules platform_drv

build_boot_image $boot_modules

if {[have_include "power_on/qemu"]} {
	set want_cpus_x 4
	set want_cpus_y 1
	set want_cpus_total [expr $want_cpus_x*$want_cpus_y]
	set rounds "03"
	append qemu_args "-nographic  -smp $want_cpus_total,cores=$want_cpus_total "
} else {
	set rounds "10"
	if {[have_spec x86]} { set rounds "40" }
}

run_genode_until "Round $rounds:.*\n" 120

set cpus [regexp -inline {Detected [0-9x]+ CPU[s\.]} $output]
set cpus [regexp -all -inline {[0-9]+} $cpus]
set cpus [expr [lindex $cpus 0] * [lindex $cpus 1]]

if {[have_include "power_on/qemu"]} {
	if {$want_cpus_total != $cpus} {
		puts "CPU count is not as expected: $want_cpus_total != $cpus"
		exit 1;
	}
}

set good_string {}
for {set r 0} {$r <= $rounds} {incr r} {
	append good_string {[init -> test-affinity] Round } 
	append good_string [format "%02d" $r]
	append good_string ":"
	for {set i 0} {$i < $cpus} {incr i} {
		append good_string "  A"
	}
	append good_string "\n"
}

grep_output {\[init -\> test-affinity\] Round}

compare_output_to $good_string