| # Copyright 2007-2015 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 |