# Copyright 2007, 2008, 2009 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/>.
#
# This file is part of the gdb testsuite.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
# Tests for 'info spu' commands.

set prms_id 0
set bug_id 0

if { ![istarget "spu-*-elf"] } then {
  verbose "Skipping SPU-only testcase"
  return
}

set testfile "spu-info"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set sources ${srcdir}/${subdir}/${srcfile}

if { [gdb_compile $sources ${binfile} executable { debug }] != "" } {
  return -1
}

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

# Continue to MARKER
proc c_to { marker } {
  global srcfile
  set line [gdb_get_line_number $marker]
  gdb_test "break $line" \
	   "Breakpoint.*at.*file.*$srcfile.*line $line.*" \
	   "break $line"
  gdb_test "continue" \
	   "Continuing.*Breakpoint.*at.*$srcfile.*$line.*" \
	   "continue to $line"
}



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

# Check the help.
gdb_test "info spu" \
	 ".*info spu.* must be followed by the name of an SPU facility.*" \
	 "info spu"
gdb_test "help info spu" \
	 "Various SPU specific commands.*List of info spu subcommands.*" \
	 "help info spu"

gdb_test "help info spu dma" \
	 "Display MFC DMA status." \
	 "help info spu dma"
gdb_test "help info spu event" \
	 "Display SPU event facility status." \
	 "help info spu event"
gdb_test "help info spu mailbox" \
	 "Display SPU mailbox facility status." \
	 "help info spu mailbox"
gdb_test "help info spu proxydma" \
	 "Display MFC Proxy-DMA status." \
	 "help info spu proxydma"
gdb_test "help info spu signal" \
	 "Display SPU signal notification facility status." \
	 "help info spu signal"


# architecture should be spu:256K.
gdb_test "show architecture" \
	 "The target architecture is set automatically.*currently spu:256K.*" \
	 "architecture = spu256K"

# 'info spu event'.
gdb_test "info spu event" \
	 "Event Status.*Event Mask.*" \
	 "info spu event"

# 'info spu signal'.
gdb_test "info spu signal" \
	 "Signal 1 not pending.*\(Type.*\).*Signal 2 not pending.*\(Type.*\).*" \
	 "info spu signal"

# 'info spu mailbox'.
gdb_test "info spu mailbox" \
	 "SPU Outbound Mailbox.*SPU Outbound Interrupt Mailbox.*" \
	 "info spu mailbox"

# 'info spu dma'.
gdb_test "info spu dma" \
	 "Tag-Group Status.*Tag-Group Mask.*Stall-and-Notify .*Atomic Cmd Status.*" \
	 "info spu dma"

# 'info spu proxydma'.
gdb_test "info spu proxydma" \
	 "Tag-Group Status.*Tag-Group Mask.*" \
	  "info spu proxydma"

# Event tests.
c_to "Marker Event"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000000.*" \
	"empty event status"

# MFC_MULTI_SRC_SYNC_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00001000.*" \
	"event mask 0x1000"
# MFC_PRIV_ATTN_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000800.*" \
	"event mask 0x0800"
# MFC_LLR_LOST_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000400.*" \
	"event mask 0x0400"
# MFC_SIGNAL_NOTIFY_1_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000200.*" \
	"event mask 0x0200"
# MFC_SIGNAL_NOTIFY_2_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000100.*" \
	"event mask 0x0100"
# MFC_OUT_MBOX_AVAILABLE_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000080.*" \
	"event mask 0x0080"
# MFC_OUT_INTR_MBOX_AVAILABLE_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000040.*" \
	"event mask 0x0040"
# MFC_DECREMENTER_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000020.*" \
	"event mask 0x0020"
# MFC_IN_MBOX_AVAILABLE_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000010.*" \
	"event mask 0x0010"
# MFC_COMMAND_QUEUE_AVAILABLE_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000008.*" \
	"event mask 0x0008"
# MFC_LIST_STALL_NOTIFY_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000002.*" \
	"event mask 0x0002"
# MFC_TAG_STATUS_UPDATE_EVENT.
gdb_test "next" "" "next"
gdb_test "info spu event" \
	"Event Status 0x00000000.*Event Mask   0x00000001.*" \
	"event mask 0x0001"


# DMA tests.
# 'info spu dma' should be empty.
c_to "Marker DMA"
gdb_test "info spu dma" \
	 "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000000.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000\[\r\n\]+" \
	 "info spu dma (empty)"

# 'info spu dma' should be filled with some data.
c_to "Marker DMAWait"
gdb_test "next" "" "next"
gdb_test "info spu dma" \
	 "Tag-Group Status.*0x00000000.*Tag-Group Mask.*0x00000020.*Stall-and-Notify.*0x00000000.*Atomic Cmd Status.*0x00000000.*Opcode.*Tag.*TId.*RId.*EA.*LSA.*Size.*LstAddr.*LstSize.*E.*get.*5.*0.*0.*0x00080\[ \r\n\]+" \
	 "info spu dma (non-empty)"
gdb_test "finish" "" "finish"

# Mailbox Test
# 'info spu mailbox' should be empty.
c_to "Marker Mbox"
set msg "info spu mailbox"
gdb_test_multiple "info spu mailbox" $msg {
    -re "SPU Outbound Mailbox.*0x00000000.*SPU Outbound Interrupt Mailbox.*0x00000000.*$gdb_prompt $" {
      pass $msg
    }
    -re "SPU Outbound Mailbox.*0x.*SPU Outbound Interrupt Mailbox.*0x.*$gdb_prompt $" {
      # Older kernels had a bug that caused them to return arbitrary values
      # when attempting to read from an empty mailbox via spufs.
      xfail $msg
    }
}

# 'info spu mailbox' should now contain data.
c_to "Marker MboxEnd"
gdb_test "info spu mailbox" \
	 "SPU Outbound Mailbox.*0x12345678.*SPU Outbound Interrupt Mailbox.*0x12345678.*" \
	 "info spu mailbox"

# Signal Test
# 'info spu signal'.
c_to "Marker Signal"
gdb_test "info spu signal" \
	 "Signal 1 not pending.*\(Type.*\).*Signal 2 not pending.*\(Type.*\).*" \
	 "info spu signal"

# 'info spu signal' with signal1 pending.
c_to "Marker Signal1"
gdb_test "info spu signal" \
	 "Signal 1 control word 0x801c0800.*Signal 2 not pending.*\(Type.*\).*" \
	 "info spu signal"

# 'info spu signal' with signal1 and signal2 pending.
c_to "Marker Signal2"
gdb_test "info spu signal" \
	 "Signal 1 control word 0x801c0800.*Signal 2 control word 0x801c0800.*" \
	 "info spu signal"

# Read signal1. Only signal2 is pending.
c_to "Marker SignalRead"
gdb_test "info spu signal" \
	 "Signal 1 not pending.*Signal 2 control word 0x801c0800.*" \
	 "info spu signal"


gdb_exit

return 0
