diff options
| author | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-12 18:05:21 +0200 |
|---|---|---|
| committer | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-12 18:05:21 +0200 |
| commit | 513a6e99dd1f9cf5531d55f544478bec72efb910 (patch) | |
| tree | 47d7789347ba596dca54704df24e85b6763f26a2 | |
| parent | 4230715311892502452f326f3618e5ef4dc81972 (diff) | |
| download | psn00bsdk-513a6e99dd1f9cf5531d55f544478bec72efb910.tar.gz | |
Downgrade GCC to 12.3, add setjmp(), fix CdGetRegion()
| -rw-r--r-- | .github/workflows/build.yml | 2 | ||||
| -rw-r--r-- | CHANGELOG.md | 5 | ||||
| -rw-r--r-- | libpsn00b/include/psxapi.h | 136 | ||||
| -rw-r--r-- | libpsn00b/include/setjmp.h | 31 | ||||
| -rw-r--r-- | libpsn00b/libc/setjmp.s | 48 | ||||
| -rw-r--r-- | libpsn00b/psxcd/common.c | 4 | ||||
| -rw-r--r-- | libpsn00b/psxetc/interrupts.c | 3 |
7 files changed, 154 insertions, 75 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e84dbca..00926ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ on: [ push, pull_request ] env: BINUTILS_VERSION: '2.40' BINUTILS_OPTIONS: '--disable-docs --disable-nls --disable-werror --with-float=soft' - GCC_VERSION: '13.1.0' + GCC_VERSION: '12.3.0' GCC_OPTIONS: '--disable-docs --disable-nls --disable-werror --disable-libada --disable-libssp --disable-libquadmath --disable-threads --disable-libgomp --disable-libstdcxx-pch --disable-hosted-libstdcxx --enable-languages=c,c++ --without-isl --without-headers --with-float=soft --with-gnu-as --with-gnu-ld' GCC_TARGET: 'mipsel-none-elf' diff --git a/CHANGELOG.md b/CHANGELOG.md index 971b71c..2d6a313 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,8 +21,11 @@ to ensure the changelog can be parsed correctly. ## 2023-05-11: 0.23 +spicyjpeg: + - libc: Added some missing C++ STL headers (`cassert`, `cctype`, `cstdint`, - `cstdio`, `cstdlib`, `cstring`). + `cstdio`, `cstdlib`, `cstring`). Added `setjmp()` and `longjmp()` as well as + the `jmp_buf` type. - psxgpu: Added `SetDrawOpType()` and the `GPU_DrawOpType` enum for more flexibility when using custom drawing queue callbacks with `EnqueueDrawOp()`. diff --git a/libpsn00b/include/psxapi.h b/libpsn00b/include/psxapi.h index 35ee040..49d1620 100644 --- a/libpsn00b/include/psxapi.h +++ b/libpsn00b/include/psxapi.h @@ -19,69 +19,73 @@ #include <stdint.h> #include <stddef.h> +#include <setjmp.h> #include <hwregs_c.h> /* Definitions */ -// TODO: these desperately need to be cleaned up - -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 - -#define DescMask 0xff000000 // Event descriptor mask -#define DescTH DescMask -#define DescHW 0xf0000000 // Hardware event (IRQ) -#define DescEV 0xf1000000 // Event event -#define DescRC 0xf2000000 // Root counter event -#define DescUEV 0xf3000000 // User event -#define DescSW 0xf4000000 // BIOS event - -#define HwVBLANK (DescHW|0x01) // VBlank -#define HwGPU (DescHW|0x02) // GPU -#define HwCdRom (DescHW|0x03) // CDROM -#define HwDMAC (DescHW|0x04) // DMA -#define HwRTC0 (DescHW|0x05) // Timer 0 -#define HwRTC1 (DescHW|0x06) // Timer 1 -#define HwRTC2 (DescHW|0x07) // Timer 2 -#define HwCNTL (DescHW|0x08) // Controller -#define HwSPU (DescHW|0x09) // SPU -#define HwPIO (DescHW|0x0a) // PIO & lightgun -#define HwSIO (DescHW|0x0b) // Serial - -#define HwCPU (DescHW|0x10) // Processor exception -#define HwCARD (DescHW|0x11) // Memory card (lower level BIOS functions) -#define HwCard_0 (DescHW|0x12) -#define HwCard_1 (DescHW|0x13) -#define SwCARD (DescSW|0x01) // Memory card (higher level BIOS functions) -#define SwMATH (DescSW|0x02) - -#define EvSpIOE 0x0004 -#define EvSpERROR 0x8000 -#define EvSpTIMOUT 0x0100 -#define EvSpNEW 0x0200 - -#define EvMdINTR 0x1000 -#define EvMdNOINTR 0x2000 - -// Root counter (timer) definitions -#define DescRC 0xf2000000 - -#define RCntCNT0 (DescRC|0x00) -#define RCntCNT1 (DescRC|0x01) -#define RCntCNT2 (DescRC|0x02) -#define RCntCNT3 (DescRC|0x03) - -#define RCntMdINTR 0x1000 // Turns on IRQ -#define RCntMdNOINTR 0x2000 // Polling mode -#define RCntMdSC 0x0001 // IRQ when counter target -#define RCntMdSP 0x0000 -#define RCntMdFR 0x0000 -#define RCntMdGATE 0x0010 +typedef enum _SeekMode { + SEEK_SET = 0, + SEEK_CUR = 1, + SEEK_END = 2 +} SeekMode; + +typedef enum _EventDescriptor { + DescMask = 0xff000000, // Event descriptor mask + DescTH = 0xff000000, + DescHW = 0xf0000000, // Hardware event (IRQ) + DescEV = 0xf1000000, // Event event + DescRC = 0xf2000000, // Root counter event + DescUEV = 0xf3000000, // User event + DescSW = 0xf4000000 // BIOS event +} EventDescriptor; + +typedef enum _EventType { + HwVBLANK = DescHW | 0x01, // VBlank + HwGPU = DescHW | 0x02, // GPU + HwCdRom = DescHW | 0x03, // CDROM + HwDMAC = DescHW | 0x04, // DMA + HwRTC0 = DescHW | 0x05, // Timer 0 + HwRTC1 = DescHW | 0x06, // Timer 1 + HwRTC2 = DescHW | 0x07, // Timer 2 + HwCNTL = DescHW | 0x08, // Controller + HwSPU = DescHW | 0x09, // SPU + HwPIO = DescHW | 0x0a, // PIO & lightgun + HwSIO = DescHW | 0x0b, // Serial + HwCPU = DescHW | 0x10, // Processor exception + HwCARD = DescHW | 0x11, // Memory card (lower level BIOS functions) + HwCARD_0 = DescHW | 0x12, + HwCARD_1 = DescHW | 0x13, + + RCntCNT0 = DescRC | 0x00, + RCntCNT1 = DescRC | 0x01, + RCntCNT2 = DescRC | 0x02, + RCntCNT3 = DescRC | 0x03, + + SwCARD = DescSW | 0x01, // Memory card (higher level BIOS functions) + SwMATH = DescSW | 0x02 +} EventType; + +typedef enum _EventFlag { + EvSpIOE = 1 << 2, + EvSpTIMOUT = 1 << 8, + EvSpNEW = 1 << 9, + EvSpERROR = 1 << 15, + + EvMdINTR = 1 << 12, + EvMdNOINTR = 1 << 13, + + RCntMdSP = 0 << 0, + RCntMdFR = 0 << 0, + RCntMdSC = 1 << 0, // IRQ when counter target + RCntMdGATE = 1 << 4, + RCntMdINTR = 1 << 12, // Turns on IRQ + RCntMdNOINTR = 1 << 13 // Polling mode +} EventFlag; /* Structure definitions */ -typedef struct { // Thread control block +typedef struct _TCB { // Thread control block int status; int mode; union { @@ -106,11 +110,11 @@ typedef struct { // Thread control block int _reserved[9]; } TCB; -typedef struct { // Process control block +typedef struct _PCB { // Process control block TCB *thread; } PCB; -typedef struct { // Device control block +typedef struct _DCB { // Device control block char *name; int flags; int ssize; @@ -133,7 +137,7 @@ typedef struct { // Device control block void *f_testdevice; } DCB; -typedef struct { // File control block +typedef struct _FCB { // File control block int status; uint32_t diskid; void *trns_addr; @@ -147,7 +151,7 @@ typedef struct { // File control block uint32_t fcbnum; } FCB; -struct DIRENTRY { // Directory entry +struct DIRENTRY { // Directory entry char name[20]; int attr; int size; @@ -165,13 +169,7 @@ struct EXEC { uint32_t sp, fp, rp, ret, base; }; -struct JMP_BUF { - uint32_t ra, sp, fp; - uint32_t s0, s1, s2, s3, s4, s5, s6, s7; - uint32_t gp; -}; - -typedef struct { +typedef struct _INT_RP { uint32_t *next; uint32_t *func2; uint32_t *func1; @@ -303,10 +301,8 @@ int Exec(struct EXEC *exec, int argc, const char **argv); int LoadExec(const char *path, int argc, const char **argv); void FlushCache(void); -void b_setjmp(struct JMP_BUF *buf); -void b_longjmp(const struct JMP_BUF *buf, int param); void ResetEntryInt(void); -void HookEntryInt(const struct JMP_BUF *buf); +void HookEntryInt(jmp_buf buf); void ReturnFromException(void); int SetConf(int evcb, int tcb, uint32_t sp); diff --git a/libpsn00b/include/setjmp.h b/libpsn00b/include/setjmp.h new file mode 100644 index 0000000..0f05b67 --- /dev/null +++ b/libpsn00b/include/setjmp.h @@ -0,0 +1,31 @@ +/* + * PSn00bSDK standard library + * (C) 2023 spicyjpeg - MPL licensed + * + * This setjmp() implementation is compatible with the one in the BIOS, making + * it possible to pass a jmp_buf structure as-is to BIOS functions such as + * HookEntryInt(). + */ + +#pragma once + +#include <stdint.h> + +typedef struct _JumpBuffer { + uint32_t ra, sp, fp; + uint32_t s0, s1, s2, s3, s4, s5, s6, s7; + uint32_t gp; +} JumpBuffer; + +typedef JumpBuffer *jmp_buf; + +#ifdef __cplusplus +extern "C" { +#endif + +int setjmp(jmp_buf buf); +void longjmp(jmp_buf buf, int value); + +#ifdef __cplusplus +} +#endif diff --git a/libpsn00b/libc/setjmp.s b/libpsn00b/libc/setjmp.s new file mode 100644 index 0000000..465a712 --- /dev/null +++ b/libpsn00b/libc/setjmp.s @@ -0,0 +1,48 @@ +# PSn00bSDK setjmp/longjmp +# (C) 2023 spicyjpeg - MPL licensed +# +# This is not a "proper" implementation of setjmp/longjmp as it does not save +# COP0 and GTE registers, but it is fully compatible with the version found in +# the BIOS. + +.set noreorder + +.section .text.setjmp +.global setjmp +.type setjmp, @function +setjmp: + sw $ra, 0x00($a0) + sw $sp, 0x04($a0) + sw $fp, 0x08($a0) + sw $s0, 0x0c($a0) + sw $s1, 0x10($a0) + sw $s2, 0x14($a0) + sw $s3, 0x18($a0) + sw $s4, 0x1c($a0) + sw $s5, 0x20($a0) + sw $s6, 0x24($a0) + sw $s7, 0x28($a0) + sw $gp, 0x2c($a0) + + jr $ra + li $v0, 0 + +.section .text.longjmp +.global longjmp +.type longjmp, @function +longjmp: + lw $ra, 0x00($a0) + lw $sp, 0x04($a0) + lw $fp, 0x08($a0) + lw $s0, 0x0c($a0) + lw $s1, 0x10($a0) + lw $s2, 0x14($a0) + lw $s3, 0x18($a0) + lw $s4, 0x1c($a0) + lw $s5, 0x20($a0) + lw $s6, 0x24($a0) + lw $s7, 0x28($a0) + lw $gp, 0x2c($a0) + + jr $ra + move $v0, $a1 diff --git a/libpsn00b/psxcd/common.c b/libpsn00b/psxcd/common.c index 461ab91..438fcc1 100644 --- a/libpsn00b/psxcd/common.c +++ b/libpsn00b/psxcd/common.c @@ -12,6 +12,7 @@ #define CD_ACK_TIMEOUT 0x100000 #define CD_SYNC_TIMEOUT 0x100000 +#define MAX_RESULT_SIZE 32 /* Internal globals */ @@ -134,7 +135,7 @@ static void _cd_irq_handler(void) { if (_result_ptr) { _result_ptr[0] = first_byte; - for (int i = 1; (CD_REG(0) & 0x20) && (i < 8); i++) + for (int i = 1; (CD_REG(0) & 0x20) && (i < MAX_RESULT_SIZE); i++) _result_ptr[i] = CD_REG(1); } @@ -257,7 +258,6 @@ int CdCommandF(CdlCommand cmd, const void *param, int length) { // Keep track of the last mode and seek location set (so retries can be // attempted). - if (cmd == CdlSetloc) { _last_pos.minute = _param[0]; _last_pos.second = _param[1]; diff --git a/libpsn00b/psxetc/interrupts.c b/libpsn00b/psxetc/interrupts.c index 8bd11fc..acb5736 100644 --- a/libpsn00b/psxetc/interrupts.c +++ b/libpsn00b/psxetc/interrupts.c @@ -5,6 +5,7 @@ #include <stdint.h> #include <assert.h> +#include <setjmp.h> #include <psxapi.h> #include <psxetc.h> #include <hwregs_c.h> @@ -36,7 +37,7 @@ static uint8_t _isr_stack[ISR_STACK_SIZE]; extern uint8_t _gp[]; static void _global_isr(void); -static const struct JMP_BUF _isr_jmp_buf = { +static const JumpBuffer _isr_jmp_buf = { .ra = (uint32_t) &_global_isr, .sp = (uint32_t) &_isr_stack[ISR_STACK_SIZE], .fp = 0, |
