Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
Classes | Macros | Typedefs
gte-latency-lzcs.c File Reference
#include "common/hardware/cop2.h"
#include "common/syscalls/syscalls.h"
#include "exotic/cester.h"
Include dependency graph for gte-latency-lzcs.c:

Classes

struct  lzc_case_t
 
struct  lzc_arm_t
 

Macros

#define GTE_LATENCY_LZCS_HELPERS_DEFINED
 
#define MAX_N   8
 
#define DRAIN   24
 
#define LZC_STR_(x)   #x
 
#define LZC_STR(x)   LZC_STR_(x)
 
#define MK_LZC_FN(N)
 
#define KSEG1(p)   ((lzc_probe_fn)(((uint32_t)(p)) | 0xa0000000u))
 
#define NCASES   ((int)(sizeof(g_cases) / sizeof(g_cases[0])))
 
#define MK_LZC_ARM(NAME, FILLER)
 
#define NARMS   ((int)(sizeof(g_arms) / sizeof(g_arms[0])))
 
#define CESTER_NO_SIGNAL
 
#define CESTER_NO_TIME
 
#define EXIT_SUCCESS   0
 
#define EXIT_FAILURE   1
 

Typedefs

typedef uint32_t(* lzc_probe_fn) (uint32_t, uint32_t)
 

Macro Definition Documentation

◆ CESTER_NO_SIGNAL

#define CESTER_NO_SIGNAL

◆ CESTER_NO_TIME

#define CESTER_NO_TIME

◆ DRAIN

#define DRAIN   24

◆ EXIT_FAILURE

#define EXIT_FAILURE   1

◆ EXIT_SUCCESS

#define EXIT_SUCCESS   0

◆ GTE_LATENCY_LZCS_HELPERS_DEFINED

#define GTE_LATENCY_LZCS_HELPERS_DEFINED

◆ KSEG1

#define KSEG1 (   p)    ((lzc_probe_fn)(((uint32_t)(p)) | 0xa0000000u))

◆ LZC_STR

#define LZC_STR (   x)    LZC_STR_(x)

◆ LZC_STR_

#define LZC_STR_ (   x)    #x

◆ MAX_N

#define MAX_N   8

◆ MK_LZC_ARM

#define MK_LZC_ARM (   NAME,
  FILLER 
)
Value:
uint32_t __attribute__((noinline)) \
lzc_arm_##NAME(uint32_t poison, uint32_t value) { \
uint32_t out, scratch; \
uint32_t a = 0x7fffffffu, b = 0x00000003u; \
uint32_t s = 0x00000007u; \
volatile uint32_t* io = (volatile uint32_t*)0xbf801070u; \
__asm__ volatile( \
".set push\n\t" \
".set noreorder\n\t" \
"mtc2 %2, $30\n\t" \
".rept " LZC_STR(DRAIN) "\n\tnop\n\t.endr\n\t" \
"mtc2 %3, $30\n\t" \
FILLER \
"mfc2 %0, $31\n\t" \
"nop\n\t" \
"nop\n\t" \
".set pop\n\t" \
: "=&r"(out), "=&r"(scratch) \
: "r"(poison), "r"(value), "r"(a), "r"(b), "r"(s), "r"(io) \
: "hi", "lo", "memory"); \
return out; \
}
__attribute__((weak))
Definition clz.c:56
uint32_t out
Definition cpu.c:62
uint8_t b
Definition gte-depthcue.c:41
#define DRAIN
Definition gte-latency-lzcs.c:71
#define LZC_STR(x)
Definition gte-latency-lzcs.c:74
__asm__(" .section .text.monitorSlotEntry, \"ax\", @progbits\n" " .align 2\n" " .global monitorSlotEntry\n" " .type monitorSlotEntry, @function\n" " .set push\n" " .set noreorder\n" " .set noat\n" "monitorSlotEntry:\n" " mfc0 $v0, $13\n" " nop\n" " andi $v0, $v0, 0x7c\n" " beqz $v0, 1f\n" " srl $v0, $v0, 2\n" " li $v1, " MON_STR(MON_SLOT_EXCMASK) "\n" " srlv $v1, $v1, $v0\n" " andi $v1, $v1, 1\n" " bnez $v1, 2f\n" " nop\n" " jr $ra\n" " nop\n" "1:\n" MON_SLOT_RX_TEST " jr $ra\n" " nop\n" "2:\n" " sw $a0, 0x10($k0)\n" " sw $a1, 0x14($k0)\n" " sw $a2, 0x18($k0)\n" " sw $a3, 0x1c($k0)\n" " mfc0 $a0, $12\n" " nop\n" " sw $a0, 0x8c($k0)\n" " mfc0 $a1, $13\n" " nop\n" " sw $a1, 0x90($k0)\n" " sw $k1, 0x6c($k0)\n" " sw $s0, 0x40($k0)\n" " sw $s1, 0x44($k0)\n" " sw $s2, 0x48($k0)\n" " sw $s3, 0x4c($k0)\n" " sw $s4, 0x50($k0)\n" " sw $s5, 0x54($k0)\n" " sw $s6, 0x58($k0)\n" " sw $s7, 0x5c($k0)\n" " sw $t0, 0x20($k0)\n" " sw $t1, 0x24($k0)\n" " sw $t2, 0x28($k0)\n" " sw $t3, 0x2c($k0)\n" " sw $t4, 0x30($k0)\n" " sw $t5, 0x34($k0)\n" " sw $t6, 0x38($k0)\n" " sw $t7, 0x3c($k0)\n" " sw $t8, 0x60($k0)\n" " sw $t9, 0x64($k0)\n" " sw $gp, 0x70($k0)\n" " sw $sp, 0x74($k0)\n" " sw $fp, 0x78($k0)\n" " mfhi $a0\n" " nop\n" " sw $a0, 0x84($k0)\n" " mflo $a0\n" " nop\n" " sw $a0, 0x88($k0)\n" " move $s0, $ra\n" " la $sp, monitorSlotStack + " MON_STR(MONITOR_SLOT_STACK_WORDS) " * 4 - 16\n" " jal monitorSlotDispatch\n" " nop\n" " lw $k0, 0x108($zero)\n" " move $ra, $s0\n" " lw $k0, 0($k0)\n" " nop\n" " addiu $k0, $k0, 8\n" " lw $a0, 0x84($k0)\n" " lw $a1, 0x88($k0)\n" " mthi $a0\n" " mtlo $a1\n" " lw $a0, 0x10($k0)\n" " lw $a1, 0x14($k0)\n" " lw $a2, 0x18($k0)\n" " lw $a3, 0x1c($k0)\n" " lw $t0, 0x20($k0)\n" " lw $t1, 0x24($k0)\n" " lw $t2, 0x28($k0)\n" " lw $t3, 0x2c($k0)\n" " lw $t4, 0x30($k0)\n" " lw $t5, 0x34($k0)\n" " lw $t6, 0x38($k0)\n" " lw $t7, 0x3c($k0)\n" " lw $t8, 0x60($k0)\n" " lw $t9, 0x64($k0)\n" " lw $s0, 0x40($k0)\n" " lw $sp, 0x74($k0)\n" " jr $ra\n" " nop\n" " .set pop\n" " .size monitorSlotEntry, . - monitorSlotEntry\n" " .previous\n")
char * s
Definition string.c:48
static int value
Definition syscalls.h:553

◆ MK_LZC_FN

#define MK_LZC_FN (   N)
Value:
uint32_t __attribute__((noinline)) \
lzc_probe_##N(uint32_t poison, uint32_t value) { \
uint32_t out; \
__asm__ volatile( \
".set push\n\t" \
".set noreorder\n\t" \
"mtc2 %1, $30\n\t" \
".rept " LZC_STR(DRAIN) "\n\tnop\n\t.endr\n\t" \
"mtc2 %2, $30\n\t" \
".rept " #N "\n\tnop\n\t.endr\n\t" \
"mfc2 %0, $31\n\t" \
"nop\n\t" \
"nop\n\t" \
".set pop\n\t" \
: "=&r"(out) \
: "r"(poison), "r"(value)); \
return out; \
}
#define N
Definition main.c:37

◆ NARMS

#define NARMS   ((int)(sizeof(g_arms) / sizeof(g_arms[0])))

◆ NCASES

#define NCASES   ((int)(sizeof(g_cases) / sizeof(g_cases[0])))

Typedef Documentation

◆ lzc_probe_fn

typedef uint32_t(* lzc_probe_fn) (uint32_t, uint32_t)