From b86b14f3cdc76cdc6cce7ee2c8216ab7c6f23494 Mon Sep 17 00:00:00 2001 From: Lephe Date: Tue, 13 Oct 2020 22:48:56 +0200 Subject: [PATCH] gint/ram: add 32-bit access detection for SPU-owned memory Same in the hexadecimal memory browser, although there are currently no shortcuts and it appears to freeze when leaving the add-in. --- assets-fx/img/opt_gint_ram.png | Bin 2016 -> 2401 bytes src/gint/ram.c | 131 ++++++++++++++++++++++++++------- src/mem/mem.c | 16 +++- 3 files changed, 120 insertions(+), 27 deletions(-) diff --git a/assets-fx/img/opt_gint_ram.png b/assets-fx/img/opt_gint_ram.png index eb80d1e1e9d272ee19a589c27ddc8465d7af84de..2c6b9949c19f0a07ce68d1002bcc8584086b28f8 100644 GIT binary patch delta 2337 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 diff --git a/src/gint/ram.c b/src/gint/ram.c index b3ed3b2..7d14674 100644 --- a/src/gint/ram.c +++ b/src/gint/ram.c @@ -5,6 +5,8 @@ #include #include +/* Byte-based memory detection functions */ + static int writable(uint8_t volatile *mem) { int save = *mem; @@ -37,25 +39,69 @@ static int same_location(uint8_t volatile *m1, uint8_t volatile *m2) return equal1 && equal2 && equal3; } -static uint32_t region_size(uint8_t volatile *mem, int *reason) +/* Longword-based memory detection functions */ + +static int writable_lword(uint8_t volatile *mem_8) +{ + uint32_t volatile *mem = (void *)mem_8; + + uint32_t save = *mem; + *mem = save ^ 0xffffff00; + + uint32_t measured = *mem; + *mem = save; + + return (measured == (save ^ 0xffffff00)); +} + +static int same_location_lword(uint8_t volatile *m1_8, uint8_t volatile *m2_8) +{ + uint32_t volatile *m1 = (void *)m1_8, *m2 = (void *)m2_8; + uint32_t s1=*m1, s2=*m2; + + *m1 = s1 ^ 0xffff0000; + int equal1 = (*m2 == *m1); + + *m1 = s1 ^ 0x0000ff00; + int equal2 = (*m2 == *m1); + + *m1 = s1 ^ 0xffffff00; + int equal3 = (*m2 == *m1); + + *m1 = s1; + *m2 = s2; + + return equal1 && equal2 && equal3; +} + +/* Region size detection */ + +static uint32_t region_size(uint8_t volatile *mem, int *reason, int use_lword) { uint32_t size = 0; - while(size <= 16384) + while(size < (1 << 20)) { - if(!writable(mem+size)) - { - *reason = 1; - break; - } - if(size > 0 && same_location(mem, mem+size)) + int x = use_lword + ? writable_lword(mem + size) + : writable(mem + size); + + *reason = 1; + if(!x) return size; + + if(size > 0) { + int y = use_lword + ? same_location_lword(mem, mem+size) + : same_location(mem, mem+size); *reason = 2; - break; + if(y) return size; } - size++; + + size += use_lword ? 4 : 1; } + *reason = 3; return size; } @@ -65,18 +111,23 @@ void gintctl_gint_ram(void) uint8_t *ILRAM = (void *)0xe5200000; uint8_t *XRAM = (void *)0xe5007000; uint8_t *YRAM = (void *)0xe5017000; - uint8_t *MERAM = (void *)0xe8080000; + uint8_t *PRAM0 = (void *)0xfe200000; uint8_t *XRAM0 = (void *)0xfe240000; + uint8_t *YRAM0 = (void *)0xfe280000; + uint8_t *PRAM1 = (void *)0xfe300000; + uint8_t *XRAM1 = (void *)0xfe340000; + uint8_t *YRAM1 = (void *)0xfe380000; /* Size of these sections */ - uint32_t IL=0, X=0, Y=0, ME=0, X0=0; + GUNUSED uint32_t IL=0, X=0, Y=0, P0=0, X0=0, Y0=0, P1=0, X1=0, Y1=0; /* Reason why the region stops (1=not writable, 2=wraps around) */ - int ILr=0, Xr=0, Yr=0, MEr=0, X0r=0; + GUNUSED int ILr=0, Xr=0, Yr=0, P0r=0, X0r=0, Y0r=0, P1r=0, X1r=0,Y1r=0; GUNUSED char const *reasons[] = { "Not tested yet", "%d bytes (not writable)", "%d bytes (wraps around)", + "%d bytes", }; int key = 0; @@ -90,7 +141,6 @@ void gintctl_gint_ram(void) row_print(3, 2, "ILRAM: %d bytes", IL); row_print(4, 2, "XRAM: %d bytes", X); row_print(5, 2, "YRAM: %d bytes", Y); - row_print(6, 2, "MERAM: %d bytes", ME); extern bopti_image_t img_opt_gint_ram; dimage(0, 56, &img_opt_gint_ram); @@ -106,35 +156,64 @@ void gintctl_gint_ram(void) row_print(4, 2, "ILRAM:"); row_print(5, 2, "XRAM:"); row_print(6, 2, "YRAM:"); - row_print(7, 2, "MERAM:"); + row_print(7, 2, "PRAM0:"); row_print(8, 2, "XRAM0:"); + row_print(9, 2, "YRAM0:"); + row_print(10,2, "PRAM1:"); + row_print(11,2, "XRAM1:"); + row_print(12,2, "YRAM1:"); row_print(4, 10, "E5200000"); row_print(5, 10, "E5007000"); row_print(6, 10, "E5017000"); - row_print(7, 10, "E8080000"); + row_print(7, 10, "FE200000"); row_print(8, 10, "FE240000"); + row_print(9, 10, "FE280000"); + row_print(10,10, "FE300000"); + row_print(11,10, "FE340000"); + row_print(12,10, "FE380000"); row_print(4, 21, reasons[ILr], IL); row_print(5, 21, reasons[Xr], X); row_print(6, 21, reasons[Yr], Y); - row_print(7, 21, reasons[MEr], ME); + row_print(7, 21, reasons[P0r], P0); row_print(8, 21, reasons[X0r], X0); + row_print(9, 21, reasons[Y0r], Y0); + row_print(10,21, reasons[P1r], P1); + row_print(11,21, reasons[X1r], X1); + row_print(12,21, reasons[Y1r], Y1); fkey_button(1, "ILRAM"); - fkey_button(2, "XRAM"); - fkey_button(3, "YRAM"); - fkey_button(4, "MERAM"); - fkey_button(5, "XRAM0"); + fkey_button(2, "XYRAM"); + fkey_button(3, "DSP0"); + fkey_button(4, "DSP1"); #endif dupdate(); key = getkey().key; - if(key == KEY_F1) IL = region_size(ILRAM, &ILr); - if(key == KEY_F2) X = region_size(XRAM, &Xr); - if(key == KEY_F3) Y = region_size(YRAM, &Yr); - if(key == KEY_F4) ME = region_size(MERAM, &MEr); - if(key == KEY_F5) X0 = region_size(XRAM0, &X0r); + if(key == KEY_F1) + { + IL = region_size(ILRAM, &ILr, 0); + } + if(key == KEY_F2) + { + X = region_size(XRAM, &Xr, 0); + Y = region_size(YRAM, &Yr, 0); + } + #ifdef FXCG50 + if(key == KEY_F3) + { + P0 = region_size(PRAM0, &P0r, 1); + X0 = region_size(XRAM0, &X0r, 1); + Y0 = region_size(YRAM0, &Y0r, 1); + } + if(key == KEY_F4) + { + P1 = region_size(PRAM1, &P1r, 1); + X1 = region_size(XRAM1, &X1r, 1); + Y1 = region_size(YRAM1, &Y1r, 1); + } + #endif } } diff --git a/src/mem/mem.c b/src/mem/mem.c index 3ab5511..5f3c5f6 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -50,9 +50,23 @@ int line(uint8_t *mem, char *header, char *bytes, char *ascii, int n) return 1; } + /* Read single bytes when possible, but longwords when in SPU memory */ for(int k = 0; k < n; k++) { - int c = mem[k]; + uint32_t addr = mem; + int c = 0x11; + + /* XRAM, YRAM, PRAM */ + if((addr & 0xffc00000) == 0xfe000000) + { + uint32_t l = *(uint32_t *)(addr & ~3); + c = (l << (addr & 3) * 8) >> 24; + } + else + { + c = mem[k]; + } + ascii[k] = (c >= 0x20 && c < 0x7f) ? c : '.'; } ascii[n] = 0;