diff --git a/source/gfx/gfx.c b/source/gfx/gfx.c index a8d7598..926feec 100644 --- a/source/gfx/gfx.c +++ b/source/gfx/gfx.c @@ -414,6 +414,7 @@ void gfx_print_header() gfx_con.fntsz = prevFontSize; } +#ifdef DEBUG void gfx_hexdump(u32 base, const u8 *buf, u32 len) { if (gfx_con.mute) @@ -467,87 +468,6 @@ void gfx_hexdump(u32 base, const u8 *buf, u32 len) gfx_con.fntsz = prevFontSize; } -// static int abs(int x) -// { -// if (x < 0) -// return -x; -// return x; -// } - -void gfx_set_pixel(u32 x, u32 y, u32 color) -{ - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = color; -} - -void gfx_line(int x0, int y0, int x1, int y1, u32 color) -{ - int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; - int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1; - int err = (dx > dy ? dx : -dy) / 2, e2; - - while (1) - { - gfx_set_pixel(x0, y0, color); - if (x0 == x1 && y0 == y1) - break; - e2 = err; - if (e2 >-dx) - { - err -= dy; - x0 += sx; - } - if (e2 < dy) - { - err += dx; - y0 += sy; - } - } -} - -void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 pos = 0; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - { - memset(&gfx_ctxt.fb[x + y*gfx_ctxt.stride], buf[pos], 4); - pos++; - } - } -} - - -void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 pos = 0; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - { - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[pos + 2] | (buf[pos + 1] << 8) | (buf[pos] << 16); - pos+=3; - } - } -} - -void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 *ptr = (u32 *)buf; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - for (u32 x = pos_x; x < (pos_x + size_x); x++) - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = *ptr++; -} - -void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[(size_y + pos_y - 1 - y ) * size_x + x - pos_x]; - } -} - u8 *gfx_bmp_screenshot(u32 *size) { // 14 bytes @@ -626,4 +546,79 @@ u8 *gfx_bmp_screenshot(u32 *size) *size = file_size; return buffer; +} +#endif + +void gfx_set_pixel(u32 x, u32 y, u32 color) +{ + gfx_ctxt.fb[x + y * gfx_ctxt.stride] = color; +} + +void gfx_line(int x0, int y0, int x1, int y1, u32 color) +{ + int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) / 2, e2; + + while (1) + { + gfx_set_pixel(x0, y0, color); + if (x0 == x1 && y0 == y1) + break; + e2 = err; + if (e2 >-dx) + { + err -= dy; + x0 += sx; + } + if (e2 < dy) + { + err += dx; + y0 += sy; + } + } +} + +void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) +{ + u32 pos = 0; + for (u32 y = pos_y; y < (pos_y + size_y); y++) + { + for (u32 x = pos_x; x < (pos_x + size_x); x++) + { + memset(&gfx_ctxt.fb[x + y*gfx_ctxt.stride], buf[pos], 4); + pos++; + } + } +} + + +void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) +{ + u32 pos = 0; + for (u32 y = pos_y; y < (pos_y + size_y); y++) + { + for (u32 x = pos_x; x < (pos_x + size_x); x++) + { + gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[pos + 2] | (buf[pos + 1] << 8) | (buf[pos] << 16); + pos+=3; + } + } +} + +void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) +{ + u32 *ptr = (u32 *)buf; + for (u32 y = pos_y; y < (pos_y + size_y); y++) + for (u32 x = pos_x; x < (pos_x + size_x); x++) + gfx_ctxt.fb[x + y * gfx_ctxt.stride] = *ptr++; +} + +void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) +{ + for (u32 y = pos_y; y < (pos_y + size_y); y++) + { + for (u32 x = pos_x; x < (pos_x + size_x); x++) + gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[(size_y + pos_y - 1 - y ) * size_x + x - pos_x]; + } } \ No newline at end of file diff --git a/source/gfx/gfx.h b/source/gfx/gfx.h index 05f8c82..f2feb5a 100644 --- a/source/gfx/gfx.h +++ b/source/gfx/gfx.h @@ -38,8 +38,10 @@ void gfx_putc(char c); void gfx_puts(const char *s); void gfx_printf(const char *fmt, ...); void gfx_print_header(); +#ifdef DEBUG void gfx_hexdump(u32 base, const u8 *buf, u32 len); - +u8 *gfx_bmp_screenshot(u32 *size); +#endif void gfx_set_pixel(u32 x, u32 y, u32 color); void gfx_line(int x0, int y0, int x1, int y1, u32 color); void gfx_put_small_sep(); @@ -48,7 +50,6 @@ void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -u8 *gfx_bmp_screenshot(u32 *size); // Global gfx console and context. gfx_ctxt_t gfx_ctxt; diff --git a/source/incognito/incognito.c b/source/incognito/incognito.c index 1f759cd..c422bbd 100644 --- a/source/incognito/incognito.c +++ b/source/incognito/incognito.c @@ -45,6 +45,20 @@ #include "io/io.h" #include +#define RETRY_COUNT 5 +#define RETRY(exp) \ + ({ \ + u8 _attemptc_ = RETRY_COUNT; \ + bool _resultb_; \ + while (_attemptc_--) \ + { \ + if ((_resultb_ = exp)) \ + break; \ + gfx_printf("%kretry %d/%d...\n", COLOR_RED, RETRY_COUNT - _attemptc_, RETRY_COUNT); \ + } \ + _resultb_; \ + }) + extern bool sd_mount(); extern void sd_unmount(); extern int sd_save_to_file(void *buf, u32 size, const char *filename); @@ -208,8 +222,8 @@ bool dump_keys() if (memcmp(keyblob_block, keyblob_mac, 0x10)) { EPRINTFARGS("Keyblob %x corrupt.", i); - gfx_hexdump(i, keyblob_block, 0x10); - gfx_hexdump(i, keyblob_mac, 0x10); + // gfx_hexdump(i, keyblob_block, 0x10); + // gfx_hexdump(i, keyblob_mac, 0x10); continue; } @@ -423,7 +437,7 @@ bool readData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32, while (clusterOffset + sectorCount > SECTORS_IN_CLUSTER) { u32 sectorsToRead = SECTORS_IN_CLUSTER - clusterOffset; - if (!prodinfo_read(tmp + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorsToRead)) + if (!RETRY(prodinfo_read(tmp + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorsToRead))) goto out; sector += sectorsToRead; @@ -438,7 +452,7 @@ bool readData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32, if (sectorCount == 0) goto done; - if (!prodinfo_read(tmp + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorCount)) + if (!RETRY(prodinfo_read(tmp + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorCount))) goto out; memcpy(buffer, tmp + newOffset, length); @@ -482,11 +496,11 @@ bool writeData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32 { bytesToWrite = length; } - if (!prodinfo_read(tmp_sec, sector, 1)) + if (!RETRY(prodinfo_read(tmp_sec, sector, 1))) goto out; memcpy(tmp_sec + newOffset, buffer, bytesToWrite); - if (!prodinfo_write(tmp_sec, sector, 1)) + if (!RETRY(prodinfo_write(tmp_sec, sector, 1))) goto out; sector++; @@ -511,7 +525,7 @@ bool writeData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32 while (clusterOffset + sectorCount >= SECTORS_IN_CLUSTER) { u32 sectorsToRead = SECTORS_IN_CLUSTER - clusterOffset; - if (!prodinfo_write(buffer + newOffset + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorsToRead)) + if (!RETRY(prodinfo_write(buffer + newOffset + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorsToRead))) goto out; sector += sectorsToRead; @@ -529,7 +543,7 @@ bool writeData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32 // write remaining sectors if (sectorCount > 0) { - if (!prodinfo_write(buffer + newOffset + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorCount)) + if (!RETRY(prodinfo_write(buffer + newOffset + (sectorOffset * NX_EMMC_BLOCKSIZE), sector, sectorCount))) goto out; length -= sectorCount * NX_EMMC_BLOCKSIZE; @@ -552,11 +566,11 @@ bool writeData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32 goto out; } - if (!prodinfo_read(tmp_sec, sector, 1)) + if (!RETRY(prodinfo_read(tmp_sec, sector, 1))) goto out; memcpy(tmp_sec, buffer + newOffset + (sectorOffset * NX_EMMC_BLOCKSIZE), length); - if (!prodinfo_write(tmp_sec, sector, 1)) + if (!RETRY(prodinfo_write(tmp_sec, sector, 1))) goto out; done: @@ -592,6 +606,7 @@ out: return result; } +#ifdef DEBUG void screenshot(const char *filename) { sd_mount(); @@ -609,6 +624,7 @@ void screenshot(const char *filename) f_close(&fp); free(buffer); } +#endif bool verifyHash(u32 hashOffset, u32 offset, u32 sz) { @@ -627,8 +643,8 @@ bool verifyHash(u32 hashOffset, u32 offset, u32 sz) if (memcmp(hash1, hash2, 0x20)) { EPRINTF("error: hash verification failed\n"); - gfx_hexdump(0, hash1, 0x20); - gfx_hexdump(0, hash2, 0x20); + // gfx_hexdump(0, hash1, 0x20); + // gfx_hexdump(0, hash2, 0x20); goto out; } diff --git a/source/incognito/io/io.c b/source/incognito/io/io.c index 5cb0355..889a044 100644 --- a/source/incognito/io/io.c +++ b/source/incognito/io/io.c @@ -84,7 +84,7 @@ bool prodinfo_read( u32 count /* Number of sectors to read */ ) { - + bool result = false; __attribute__((aligned(16))) static u8 tweak[0x10]; __attribute__((aligned(16))) static u64 prev_cluster = -1; __attribute__((aligned(16))) static u32 prev_sector = 0; @@ -109,13 +109,13 @@ bool prodinfo_read( } // fatfs will never pull more than a cluster - _emmc_xts(9, 8, 0, tweak, regen_tweak, tweak_exp, prev_cluster, buff, buff, count * 0x200); + result = _emmc_xts(9, 8, 0, tweak, regen_tweak, tweak_exp, prev_cluster, buff, buff, count * 0x200); prev_sector = sector + count - 1; - return true; + return result; } - return false; + return result; } bool prodinfo_write( @@ -124,7 +124,6 @@ bool prodinfo_write( u32 count /* Number of sectors to read */ ) { - __attribute__((aligned(16))) static u8 tweak[0x10]; __attribute__((aligned(16))) static u64 prev_cluster = -1; __attribute__((aligned(16))) static u32 prev_sector = 0; @@ -147,7 +146,9 @@ bool prodinfo_write( } // fatfs will never pull more than a cluster - _emmc_xts(9, 8, 1, tweak, regen_tweak, tweak_exp, prev_cluster, buff, buff, count * 0x200); + if(!_emmc_xts(9, 8, 1, tweak, regen_tweak, tweak_exp, prev_cluster, buff, buff, count * 0x200)){ + return false; + } if (nx_emmc_part_write(&storage, prodinfo_part, sector, count, buff)) { prev_sector = sector + count - 1;