Add a test to read from all SPRs
Make sure the SPRs are initialized and we can't read X state. (Mikey: rebased and added console/bin file for testing) Signed-off-by: Anton Blanchard <anton@linux.ibm.com> Signed-off-by: Michael Neuling <mikey@neuling.org>pull/274/head
parent
4c21587c4d
commit
d26a157cd7
@ -0,0 +1,3 @@
|
||||
TEST=spr_read
|
||||
|
||||
include ../Makefile.test
|
@ -0,0 +1,46 @@
|
||||
/* Copyright 2013-2014 IBM Corp.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
* implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define STACK_TOP 0x2000
|
||||
|
||||
/* Load an immediate 64-bit value into a register */
|
||||
#define LOAD_IMM64(r, e) \
|
||||
lis r,(e)@highest; \
|
||||
ori r,r,(e)@higher; \
|
||||
rldicr r,r, 32, 31; \
|
||||
oris r,r, (e)@h; \
|
||||
ori r,r, (e)@l;
|
||||
|
||||
.section ".head","ax"
|
||||
|
||||
/*
|
||||
* Microwatt currently enters in LE mode at 0x0, so we don't need to
|
||||
* do any endian fix ups
|
||||
*/
|
||||
. = 0
|
||||
.global _start
|
||||
_start:
|
||||
b boot_entry
|
||||
|
||||
.global boot_entry
|
||||
boot_entry:
|
||||
/* setup stack */
|
||||
LOAD_IMM64(%r1, STACK_TOP - 0x100)
|
||||
LOAD_IMM64(%r12, main)
|
||||
mtctr %r12
|
||||
bctrl
|
||||
attn // terminate on exit
|
||||
b .
|
@ -0,0 +1,13 @@
|
||||
SECTIONS
|
||||
{
|
||||
_start = .;
|
||||
. = 0;
|
||||
.head : {
|
||||
KEEP(*(.head))
|
||||
}
|
||||
. = 0x1000;
|
||||
.text : { *(.text) }
|
||||
. = 0x2000;
|
||||
.data : { *(.data) }
|
||||
.bss : { *(.bss) }
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "console.h"
|
||||
|
||||
#define TEST "Test "
|
||||
#define PASS "PASS\n"
|
||||
#define FAIL "FAIL\n"
|
||||
|
||||
// i < 100
|
||||
void print_test(char *str)
|
||||
{
|
||||
puts(TEST);
|
||||
puts(str);
|
||||
putchar(':');
|
||||
}
|
||||
|
||||
#define SPR_XER 1
|
||||
#define SPR_LR 8
|
||||
#define SPR_CTR 9
|
||||
#define SPR_TAR 815
|
||||
#define SPR_DSISR 18
|
||||
#define SPR_DAR 19
|
||||
#define SPR_TB 268
|
||||
#define SPR_TBU 269
|
||||
#define SPR_DEC 22
|
||||
#define SPR_SRR0 26
|
||||
#define SPR_SRR1 27
|
||||
#define SPR_CFAR 28
|
||||
#define SPR_HSRR0 314
|
||||
#define SPR_HSRR1 315
|
||||
#define SPR_SPRG0 272
|
||||
#define SPR_SPRG1 273
|
||||
#define SPR_SPRG2 274
|
||||
#define SPR_SPRG3 275
|
||||
#define SPR_SPRG3U 259
|
||||
#define SPR_HSPRG0 304
|
||||
#define SPR_HSPRG1 305
|
||||
#define SPR_PID 48
|
||||
#define SPR_PRTBL 720
|
||||
#define SPR_PVR 287
|
||||
|
||||
#define __stringify_1(x...) #x
|
||||
#define __stringify(x...) __stringify_1(x)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
console_init();
|
||||
|
||||
/*
|
||||
* Read all SPRs. Rely on the register file raising an assertion if we
|
||||
* write X state to a GPR.
|
||||
*/
|
||||
|
||||
#define DO_ONE(SPR) { \
|
||||
print_test(#SPR); \
|
||||
__asm__ __volatile__("mfspr %0," __stringify(SPR) : "=r" (tmp)); \
|
||||
puts(PASS); \
|
||||
}
|
||||
|
||||
DO_ONE(SPR_XER);
|
||||
DO_ONE(SPR_LR);
|
||||
DO_ONE(SPR_CTR);
|
||||
DO_ONE(SPR_TAR);
|
||||
DO_ONE(SPR_DSISR);
|
||||
DO_ONE(SPR_DAR);
|
||||
DO_ONE(SPR_TB);
|
||||
DO_ONE(SPR_TBU);
|
||||
DO_ONE(SPR_DEC);
|
||||
DO_ONE(SPR_SRR0);
|
||||
DO_ONE(SPR_SRR1);
|
||||
DO_ONE(SPR_CFAR);
|
||||
DO_ONE(SPR_HSRR0);
|
||||
DO_ONE(SPR_HSRR1);
|
||||
DO_ONE(SPR_SPRG0);
|
||||
DO_ONE(SPR_SPRG1);
|
||||
DO_ONE(SPR_SPRG2);
|
||||
DO_ONE(SPR_SPRG3);
|
||||
DO_ONE(SPR_SPRG3U);
|
||||
DO_ONE(SPR_HSPRG0);
|
||||
DO_ONE(SPR_HSPRG1);
|
||||
DO_ONE(SPR_PID);
|
||||
DO_ONE(SPR_PRTBL);
|
||||
DO_ONE(SPR_PVR);
|
||||
|
||||
puts(PASS);
|
||||
|
||||
return 0;
|
||||
}
|
Binary file not shown.
@ -0,0 +1,25 @@
|
||||
Test SPR_XER:PASS
|
||||
Test SPR_LR:PASS
|
||||
Test SPR_CTR:PASS
|
||||
Test SPR_TAR:PASS
|
||||
Test SPR_DSISR:PASS
|
||||
Test SPR_DAR:PASS
|
||||
Test SPR_TB:PASS
|
||||
Test SPR_TBU:PASS
|
||||
Test SPR_DEC:PASS
|
||||
Test SPR_SRR0:PASS
|
||||
Test SPR_SRR1:PASS
|
||||
Test SPR_CFAR:PASS
|
||||
Test SPR_HSRR0:PASS
|
||||
Test SPR_HSRR1:PASS
|
||||
Test SPR_SPRG0:PASS
|
||||
Test SPR_SPRG1:PASS
|
||||
Test SPR_SPRG2:PASS
|
||||
Test SPR_SPRG3:PASS
|
||||
Test SPR_SPRG3U:PASS
|
||||
Test SPR_HSPRG0:PASS
|
||||
Test SPR_HSPRG1:PASS
|
||||
Test SPR_PID:PASS
|
||||
Test SPR_PRTBL:PASS
|
||||
Test SPR_PVR:PASS
|
||||
PASS
|
Loading…
Reference in New Issue