You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
2.6 KiB
C

#include <stdint.h>
#include "bios.h"
// arci stuff1
void tst_done(unsigned int rc);
unsigned int checkResult(unsigned int r, char* name);
// shouldn't need any of these if i use the .o from bios build???
//#include "generated/soc.h"
extern unsigned int tst_start;
extern unsigned int tst_end;
extern unsigned int tst_inits;
extern unsigned int tst_results;
extern unsigned int tst_expects;
int main(int tid) {
int *p;
int *fdata = _fdata;
unsigned int *inits = &tst_inits;
if (tid != 0) {
return -1;
}
// r/w memory init
// copy
for (p = _fdata_rom; p < _edata_rom; p++){
*(fdata++) = *p;
}
// zero
for (p = _fbss; p < _ebss; p++) {
*_fbss = 0;
}
// core init
set_epcr(0x03000000); // icm=gicm=1
set_dec(0);
set_tbh(0);
set_tbl(0);
set_tsr(0xFE000000); // mask: clear enw,wis,wrs,dis,fis,udis
set_xucr0(get_xucr0() & 0x00000200); // set tcs=0
set_tsr(0);
set_tcr(0); // disable all timers
// thread enable
// set_tens(0x3);
// run a .tst
// danger! once r1 is whacked, any c code like bad int handler, etc. needs
// to make sure it has a safe stack for calls
asm (
"mr 3,%0\n"
//"lis 4,init_tst@h\n"
//"ori 4,4,init_tst@l\n"
//"mtctr 4\n"
//"bcctr\n"
"b init_tst\n"
: // outputs
: "r"(inits) // inputs
: "r3" // clobbers
);
while(1) {}
return 0;
}
#define MAGIC 0x08675309
//void __attribute__((noreturn)) tst_done(unsigned int rc) {
void tst_done(unsigned int rc) {
unsigned int i, ok = 1, done = 0;
/*
char c;
char name[10];
unsigned int r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15;
unsigned int cr, xer, ctr, lr, tar;
unsigned int op, *cia;
*/
if (rc != MAGIC) {
ok = 0;
}
// ops
// cr, xer, ctr, lr, tar
ok = ok && checkResult(32, "CR");
ok = ok && checkResult(33, "XER");
ok = ok && checkResult(34, "CTR");
ok = ok && checkResult(35, "LR");
ok = ok && checkResult(36, "TAR");
}
unsigned int checkResult(unsigned int r, char* name) {
unsigned int init, act, exp, ok = 1;
init = *(&tst_inits + r);
act = *(&tst_results + r);
exp = *(&tst_expects + r);
ok = act != exp;
return ok;
}
// these are branched to!
void int_sc(int code, int srr0) {
asm (
"b tst_end\n"
: // outputs
: // inputs
: // clobbers
);
}
void int_unhandled(void) {
while(1) {}
}