Merge pull request #274 from mikey/read-sprs
Fix reading DSISR/DAR before writing and add a test to read from all SPRspull/281/head
commit
6523acc743
@ -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