# Copyright 2009, 2011-2012 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Testsuite for Cell Broadband Engine combined debugger
# This testcase checks if the "show architecture" command works properly.

load_lib cell.exp

set ppu_file "break"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "break-spu"
set spu_src ${srcdir}/${subdir}/${spu_file}.c
set spu_bin ${objdir}/${subdir}/${spu_file}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}]  != "" } {
  unsupported "Compiling spu binary failed."
  return -1
}
# Compile PPU binary.
if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}]  != "" } {
  unsupported "Embedding spu binary failed."
  return -1
}
if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } {
  unsupported "Compiling ppu binary failed."
  return -1
}

if [get_compiler_info] {
  return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${ppu_bin}

# No programm running, default architecture should be powerpc:common.
gdb_test "show architecture" \
	 "The target architecture is set automatically.*currently powerpc:common.*" \
	 "startup architecture is powerpc:common"

if ![runto_main] then {
  fail "Can't run to main"
  return 0
}

# In PPU thread, architecture should be powerpc:common.
gdb_test "show architecture" \
	 "The target architecture is set automatically.*currently powerpc:common.*" \
	 "ppu architecture is powerpc:common"

# Switch to SPU thread.
cont_spu_main
check_spu_arch ""

# Remember thread ID of first thread to hit SPU main.
send_gdb "thread\n"
gdb_expect 10 {
    -re "Current thread is (\[0-9\]*) .*\r\n$gdb_prompt $" {
	pass "Retrieve current thread"
	set thread_id $expect_out(1,string)
    }
    -re "$gdb_prompt $" {
	fail "Retrieve current thread"
	return 0
    }
    timeout {
	fail "Retrieve current thread (timed out)"
	return 0
    }
}

# Stress Test: Switching from PPU- to SPU-Thread and back 'rep' times.
set rep 100
for {set i 0} {$i < $rep} {incr i} {
  # Switch to PPU Thread.
  gdb_test "t 1" \
	   "Switching to thread 1.*" \
	   "switch back to thread 1 (PPU) #$i"
  # In PPU Thread, architecture should again be powerpc:common.
  gdb_test "show architecture" \
	   "The target architecture is set automatically.*currently powerpc:common.*" \
	   "ppu architecture is powerpc:common again #$i"
  # Thread switching to SPU.
  gdb_test "t $thread_id" \
	   "Switching to thread $thread_id.*at.*$spu_file.c.*" \
	   "switch back to thread $thread_id (spu) #$i"
  # Standing in SPU thread again, architecture should be spu:256K again.
  check_spu_arch "spu architecture is spu256K again #$i"
}
# End of Stress Test loop

gdb_exit

return 0
