Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
Macros | Functions | Variables
cpu.c File Reference
#include "common/hardware/dma.h"
#include "common/hardware/hwregs.h"
#include "common/syscalls/syscalls.h"
#include "exotic/cester.h"
#include "../cop0/cester-cop0.c"
Include dependency graph for cpu.c:

Macros

#define PCSX_TESTS   0
 
#define CESTER_MAYBE_TEST   CESTER_TEST
 
#define CESTER_NO_SIGNAL
 
#define CESTER_NO_TIME
 
#define EXIT_SUCCESS   0
 
#define EXIT_FAILURE   1
 

Functions

 CESTER_TEST (cpu_quiet, CESTER_TEST(cpu_tests, for(unsigned i=0;i< 200000;i++) __asm__ volatile("");cester_assert_uint_eq(0, s_got40);cester_assert_uint_eq(0, s_got80);)
 
 cester_assert_uint_eq (0x88bbccdd, out)
 
 CESTER_MAYBE_TEST (cpu_LWR_LWL_nodelay, cpu_tests, uint32_t buff[2]={0x11223344, 0x55667788};uint32_t out=cpu_LWR_LWL_nodelay(buff, 0xaabbccdd);cester_assert_uint_eq(0xaabbccdd, out);) CESTER_TEST(cpu_LWR_LWL_delayed
 
 cester_assert_uint_eq (0x88112233, out)
 
 CESTER_TEST (cpu_LWR_LWL_load_different, cpu_tests, uint32_t buff[3]={0x11223344, 0x55667788, 0xaabbccdd};uint32_t out=cpu_LWR_LWL_load_different(buff, 0xeeffeffe);cester_assert_uint_eq(0x88556677, out);) CESTER_TEST(cpu_LW_LWR
 
 cester_assert_uint_eq (0xaa112233, out)
 
 CESTER_TEST (cpu_delayed_load, cpu_tests, uint32_t buff[1]={1};uint32_t out=cpu_delayed_load(buff, 0);cester_assert_uint_eq(0, out);) CESTER_TEST(cpu_delayed_load_cancelled
 
 cester_assert_uint_eq (0, out)
 
 CESTER_MAYBE_TEST (cpu_delayed_load_load, cpu_tests, uint32_t buff[2]={1, 2};uint64_t out=cpu_delayed_load_load(buff, 4);out=((out > > 16)|out) &0xffffffff;cester_assert_uint_eq(0x00020004, out);) CESTER_MAYBE_TEST(cpu_BRANCH_BRANCH_slot
 
 cester_assert_uint_eq (0x189, out)
 
 cester_assert_uint_eq (9, out)
 
 CESTER_MAYBE_TEST (cpu_JUMP_JUMP_slot, cpu_tests, uint32_t out=jumpjump1();cester_assert_uint_eq(0x69, out);out=jumpjump2();cester_assert_uint_eq(21, out);) CESTER_TEST(cpu_DIV_by_zero
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "div $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0")
 
 cester_assert_int_eq (0, hi)
 
 cester_assert_int_eq (-1, lo)
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001a\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0")
 
 cester_assert_int_eq (42, hi)
 
 CESTER_TEST (cpu_DIVU_by_zero, cpu_tests, int32_t hi, lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "divu $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(0, hi);cester_assert_int_eq(-1, lo);__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001b\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(42, hi);cester_assert_int_eq(-1, lo);) CESTER_TEST(cpu_MULT_constant_operands
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 256\n" "li $v1, 384\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1")
 
 cester_assert_uint_eq (0, hi)
 
 cester_assert_uint_eq (98304, lo)
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1")
 
 cester_assert_uint_eq (0xffffffff, hi)
 
 cester_assert_uint_eq (0x3ffffffd, lo)
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 0x10000\n" "li $v1, 0x8000\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1")
 
 cester_assert_uint_eq (0x80000000, lo)
 
__asm__ __volatile__ ("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -7\n" "li $v1, 5\n" "mult $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1")
 
 cester_assert_uint_eq (0xffffffdd, lo)
 
 CESTER_TEST (cpu_MULTU_constant_operands, cpu_tests, uint32_t hi, lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "multu $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1");cester_assert_uint_eq(0x40000000, hi);cester_assert_uint_eq(0x3ffffffd, lo);) CESTER_TEST(links
 
 cester_assert_uint_eq (0, r)
 
 cester_assert_uint_ne (0, r)
 
 CESTER_TEST (delayslot_load_first_entry, cpu_tests, uint32_t buff[2]={0x12345678, 0x9abcdef0};uint32_t out[6]={0, 0, 0, 0, 0, 0};delayslot_load_first_entry(buff, out);cester_assert_uint_eq(0x1111, out[0]);cester_assert_uint_eq(0x12345678, out[1]);cester_assert_uint_eq(0x12345678, out[2]);cester_assert_uint_eq(0x2222, out[3]);cester_assert_uint_eq(0x9abcdef0, out[4]);cester_assert_uint_eq(3, out[5]);) CESTER_TEST(nolink
 

Variables

uint32_t out = cpu_LWR_LWL_half(buff, 0xaabbccdd)
 
 cpu_tests
 
uint32_t buff [2] = {0x11223344, 0x55667788}
 
int32_t hi
 
int32_t lo
 
uint32_t r = linkandload()
 

Macro Definition Documentation

◆ CESTER_MAYBE_TEST

#define CESTER_MAYBE_TEST   CESTER_TEST

◆ CESTER_NO_SIGNAL

#define CESTER_NO_SIGNAL

◆ CESTER_NO_TIME

#define CESTER_NO_TIME

◆ EXIT_FAILURE

#define EXIT_FAILURE   1

◆ EXIT_SUCCESS

#define EXIT_SUCCESS   0

◆ PCSX_TESTS

#define PCSX_TESTS   0

Function Documentation

◆ __volatile__() [1/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li  $v0,
-3\n" "li  $v1,
0x40000001\n" "mult  $v0 
)

◆ __volatile__() [2/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li  $v0,
-7\n" "li  $v1,
5\n" "mult  $v0 
)

◆ __volatile__() [3/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li  $v0,
0x10000\n" "li  $v1,
0x8000\n" "mult  $v0 
)

◆ __volatile__() [4/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li  $v0,
256\n" "li  $v1,
384\n" "mult  $v0 
)

◆ __volatile__() [5/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li  $v0 
)

◆ __volatile__() [6/6]

__asm__ __volatile__ ( "li  $v0,
0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "div  $0 
)

◆ cester_assert_int_eq() [1/3]

cester_assert_int_eq ( -  1,
lo   
)

◆ cester_assert_int_eq() [2/3]

cester_assert_int_eq ( 0  ,
hi   
)

◆ cester_assert_int_eq() [3/3]

cester_assert_int_eq ( 42  ,
hi   
)

◆ cester_assert_uint_eq() [1/13]

cester_assert_uint_eq ( 0  ,
hi   
)

◆ cester_assert_uint_eq() [2/13]

cester_assert_uint_eq ( 0  ,
out   
)

◆ cester_assert_uint_eq() [3/13]

cester_assert_uint_eq ( 0  ,
r   
)

◆ cester_assert_uint_eq() [4/13]

cester_assert_uint_eq ( 0x189  ,
out   
)

◆ cester_assert_uint_eq() [5/13]

cester_assert_uint_eq ( 0x3ffffffd  ,
lo   
)

◆ cester_assert_uint_eq() [6/13]

cester_assert_uint_eq ( 0x80000000  ,
lo   
)

◆ cester_assert_uint_eq() [7/13]

cester_assert_uint_eq ( 0x88112233  ,
out   
)

◆ cester_assert_uint_eq() [8/13]

cester_assert_uint_eq ( 0x88bbccdd  ,
out   
)

◆ cester_assert_uint_eq() [9/13]

cester_assert_uint_eq ( 0xaa112233  ,
out   
)

◆ cester_assert_uint_eq() [10/13]

cester_assert_uint_eq ( 0xffffffdd  ,
lo   
)

◆ cester_assert_uint_eq() [11/13]

cester_assert_uint_eq ( 0xffffffff  ,
hi   
)

◆ cester_assert_uint_eq() [12/13]

cester_assert_uint_eq ( 9  ,
out   
)

◆ cester_assert_uint_eq() [13/13]

cester_assert_uint_eq ( 98304  ,
lo   
)

◆ cester_assert_uint_ne()

cester_assert_uint_ne ( 0  ,
r   
)

◆ CESTER_MAYBE_TEST() [1/3]

CESTER_MAYBE_TEST ( cpu_delayed_load_load  ,
cpu_tests  ,
uint32_t  buff[2] = {1, 2};   uint64_t out = cpu_delayed_load_load(buff, 4); out = ((out >> 16) | out) & 0xffffffff; cester_assert_uint_eq(0x00020004, out); 
)

◆ CESTER_MAYBE_TEST() [2/3]

CESTER_MAYBE_TEST ( cpu_JUMP_JUMP_slot  ,
cpu_tests  ,
uint32_t  out = jumpjump1(); cester_assert_uint_eq(0x69, out); out = jumpjump2(); cester_assert_uint_eq(21, out); 
)

◆ CESTER_MAYBE_TEST() [3/3]

CESTER_MAYBE_TEST ( cpu_LWR_LWL_nodelay  ,
cpu_tests  ,
uint32_t  buff[2] = {0x11223344, 0x55667788};     uint32_t out = cpu_LWR_LWL_nodelay(buff, 0xaabbccdd); cester_assert_uint_eq(0xaabbccdd, out); 
)

◆ CESTER_TEST() [1/6]

CESTER_TEST ( cpu_delayed_load  ,
cpu_tests  ,
uint32_t  buff[1] = {1};     uint32_t out = cpu_delayed_load(buff, 0); cester_assert_uint_eq(0, out); 
)

◆ CESTER_TEST() [2/6]

CESTER_TEST ( cpu_DIVU_by_zero  ,
cpu_tests  ,
int32_t  hi,
lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "nop\n" "divu $0, $0\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(0, hi);cester_assert_int_eq(-1, lo);__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, 42\n" ".word 0x0040001b\n" "mfhi %0\n" "mflo %1\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0");cester_assert_int_eq(42, hi);cester_assert_int_eq(-1, lo);   
)

◆ CESTER_TEST() [3/6]

CESTER_TEST ( cpu_LWR_LWL_load_different  ,
cpu_tests  ,
uint32_t  buff[3] = {0x11223344, 0x55667788, 0xaabbccdd}; uint32_t out = cpu_LWR_LWL_load_different(buff, 0xeeffeffe); cester_assert_uint_eq(0x88556677, out); 
)

◆ CESTER_TEST() [4/6]

CESTER_TEST ( cpu_MULTU_constant_operands  ,
cpu_tests  ,
uint32_t  hi,
lo;__asm__ __volatile__("li $v0, 0x55555555\n" "mthi $v0\n" "mtlo $v0\n" "li $v0, -3\n" "li $v1, 0x40000001\n" "multu $v0, $v1\n" "mflo %1\n" "mfhi %0\n" "nop\n" :"=r"(hi), "=r"(lo) ::"v0", "v1");cester_assert_uint_eq(0x40000000, hi);cester_assert_uint_eq(0x3ffffffd, lo);   
)

◆ CESTER_TEST() [5/6]

CESTER_TEST ( cpu_quiet  ,
CESTER_TEST(  cpu_tests,
for(unsigned i=0;i< 200000;i++) __asm__ volatile("");cester_assert_uint_eq(0, s_got40);cester_assert_uint_eq(0, s_got80);   
)

◆ CESTER_TEST() [6/6]

CESTER_TEST ( delayslot_load_first_entry  ,
cpu_tests  ,
uint32_t  buff[2] = {0x12345678, 0x9abcdef0}; uint32_t out[6] = {0, 0, 0, 0, 0, 0}; delayslot_load_first_entry(buff, out); cester_assert_uint_eq(0x1111, out[0]); cester_assert_uint_eq(0x12345678, out[1]); cester_assert_uint_eq(0x12345678, out[2]); cester_assert_uint_eq(0x2222, out[3]); cester_assert_uint_eq(0x9abcdef0, out[4]); cester_assert_uint_eq(3, out[5]); 
)

Variable Documentation

◆ buff

uint32_t buff = {0x11223344, 0x55667788}

◆ cpu_tests

cpu_tests

◆ hi

uint32_t hi

◆ lo

uint32_t lo

◆ out

char out = cpu_LWR_LWL_half(buff, 0xaabbccdd)

◆ r

int r = linkandload()