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


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
