From cc3768145667aef20eab35da0908755d5bd395ab Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 5 Mar 2016 03:20:41 +0200 Subject: large file support not tested if it actually reads over 2GB --- configure | 13 +++++++++- libpcsxcore/cdriso.c | 72 +++++++++++++++++++++++++++++----------------------- 2 files changed, 52 insertions(+), 33 deletions(-) diff --git a/configure b/configure index 4ffa3a2..4d9b566 100755 --- a/configure +++ b/configure @@ -24,7 +24,13 @@ compile_binary() check_define() { - $CC -E -dD $CFLAGS include/arm_features.h | grep -q $1 || return 1 + $CC -E -dD $CFLAGS include/arm_features.h | grep -q "$1" || return 1 + return 0 +} + +check_define_val() +{ + $CC -E -dD $CFLAGS include/arm_features.h | grep "$1" | awk '{print $3}' return 0 } @@ -477,6 +483,11 @@ if [ "x$need_xlib" = "xyes" ]; then check_xlib_headers || fail "please install libx11-dev" fi +sizeof_long=`check_define_val __SIZEOF_LONG__` +if [ "x$sizeof_long" = "x4" ]; then + CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64" +fi + cat > $TMPC < #include +#define OFF_T_MSB ((off_t)1 << (sizeof(off_t) * 8 - 1)) + unsigned int cdrIsoMultidiskCount; unsigned int cdrIsoMultidiskSelect; @@ -83,7 +85,7 @@ static unsigned int pregapOffset; static struct { unsigned char buff_raw[16][CD_FRAMESIZE_RAW]; unsigned char buff_compressed[CD_FRAMESIZE_RAW * 16 + 100]; - unsigned int *index_table; + off_t *index_table; unsigned int index_len; unsigned int block_shift; unsigned int current_block; @@ -787,8 +789,9 @@ static int handlepbp(const char *isofile) { unsigned int dontcare[6]; } index_entry; char psar_sig[11]; - unsigned int t, cd_length, cdimg_base; - unsigned int offsettab[8], psisoimg_offs; + off_t psisoimg_offs, cdimg_base; + unsigned int t, cd_length; + unsigned int offsettab[8]; const char *ext = NULL; int i, ret; @@ -797,7 +800,7 @@ static int handlepbp(const char *isofile) { if (ext == NULL || (strcmp(ext, ".pbp") != 0 && strcmp(ext, ".PBP") != 0)) return -1; - fseek(cdHandle, 0, SEEK_SET); + fseeko(cdHandle, 0, SEEK_SET); numtracks = 0; @@ -807,7 +810,7 @@ static int handlepbp(const char *isofile) { goto fail_io; } - ret = fseek(cdHandle, pbp_hdr.psar_offs, SEEK_SET); + ret = fseeko(cdHandle, pbp_hdr.psar_offs, SEEK_SET); if (ret != 0) { SysPrintf("failed to seek to %x\n", pbp_hdr.psar_offs); goto fail_io; @@ -818,7 +821,7 @@ static int handlepbp(const char *isofile) { psar_sig[10] = 0; if (strcmp(psar_sig, "PSTITLEIMG") == 0) { // multidisk image? - ret = fseek(cdHandle, pbp_hdr.psar_offs + 0x200, SEEK_SET); + ret = fseeko(cdHandle, pbp_hdr.psar_offs + 0x200, SEEK_SET); if (ret != 0) { SysPrintf("failed to seek to %x\n", pbp_hdr.psar_offs + 0x200); goto fail_io; @@ -844,9 +847,9 @@ static int handlepbp(const char *isofile) { psisoimg_offs += offsettab[cdrIsoMultidiskSelect]; - ret = fseek(cdHandle, psisoimg_offs, SEEK_SET); + ret = fseeko(cdHandle, psisoimg_offs, SEEK_SET); if (ret != 0) { - SysPrintf("failed to seek to %x\n", psisoimg_offs); + SysPrintf("failed to seek to %llx\n", (long long)psisoimg_offs); goto fail_io; } @@ -860,9 +863,9 @@ static int handlepbp(const char *isofile) { } // seek to TOC - ret = fseek(cdHandle, psisoimg_offs + 0x800, SEEK_SET); + ret = fseeko(cdHandle, psisoimg_offs + 0x800, SEEK_SET); if (ret != 0) { - SysPrintf("failed to seek to %x\n", psisoimg_offs + 0x800); + SysPrintf("failed to seek to %llx\n", (long long)psisoimg_offs + 0x800); goto fail_io; } @@ -896,7 +899,7 @@ static int handlepbp(const char *isofile) { sec2msf(t, ti[numtracks].length); // seek to ISO index - ret = fseek(cdHandle, psisoimg_offs + 0x4000, SEEK_SET); + ret = fseeko(cdHandle, psisoimg_offs + 0x4000, SEEK_SET); if (ret != 0) { SysPrintf("failed to seek to ISO index\n"); goto fail_io; @@ -954,6 +957,7 @@ static int handlecbin(const char *isofile) { unsigned char rsv_06[2]; } ciso_hdr; const char *ext = NULL; + unsigned int *index_table = NULL; unsigned int index = 0, plain; int i, ret; @@ -975,7 +979,7 @@ static int handlecbin(const char *isofile) { return -1; } if (ciso_hdr.header_size != 0 && ciso_hdr.header_size != sizeof(ciso_hdr)) { - ret = fseek(cdHandle, ciso_hdr.header_size, SEEK_SET); + ret = fseeko(cdHandle, ciso_hdr.header_size, SEEK_SET); if (ret != 0) { SysPrintf("failed to seek to %x\n", ciso_hdr.header_size); return -1; @@ -990,30 +994,33 @@ static int handlecbin(const char *isofile) { compr_img->current_block = (unsigned int)-1; compr_img->index_len = ciso_hdr.total_bytes / ciso_hdr.block_size; - compr_img->index_table = malloc((compr_img->index_len + 1) * sizeof(compr_img->index_table[0])); - if (compr_img->index_table == NULL) + index_table = malloc((compr_img->index_len + 1) * sizeof(index_table[0])); + if (index_table == NULL) goto fail_io; - ret = fread(compr_img->index_table, sizeof(compr_img->index_table[0]), compr_img->index_len, cdHandle); + ret = fread(index_table, sizeof(index_table[0]), compr_img->index_len, cdHandle); if (ret != compr_img->index_len) { SysPrintf("failed to read index table\n"); goto fail_index; } + compr_img->index_table = malloc((compr_img->index_len + 1) * sizeof(compr_img->index_table[0])); + if (compr_img->index_table == NULL) + goto fail_index; + for (i = 0; i < compr_img->index_len + 1; i++) { - index = compr_img->index_table[i]; + index = index_table[i]; plain = index & 0x80000000; index &= 0x7fffffff; - compr_img->index_table[i] = (index << ciso_hdr.align) | plain; + compr_img->index_table[i] = (off_t)index << ciso_hdr.align; + if (plain) + compr_img->index_table[i] |= OFF_T_MSB; } - if ((long long)index << ciso_hdr.align >= 0x80000000ll) - SysPrintf("warning: ciso img too large, expect problems\n"); return 0; fail_index: - free(compr_img->index_table); - compr_img->index_table = NULL; + free(index_table); fail_io: if (compr_img != NULL) { free(compr_img); @@ -1116,8 +1123,9 @@ static int uncompress2(void *out, unsigned long *out_size, void *in, unsigned lo static int cdread_compressed(FILE *f, unsigned int base, void *dest, int sector) { unsigned long cdbuffer_size, cdbuffer_size_expect; - unsigned int start_byte, size; + unsigned int size; int is_compressed; + off_t start_byte; int ret, block; if (base) @@ -1136,16 +1144,16 @@ static int cdread_compressed(FILE *f, unsigned int base, void *dest, int sector) return -1; } - start_byte = compr_img->index_table[block] & 0x7fffffff; - if (fseek(cdHandle, start_byte, SEEK_SET) != 0) { - SysPrintf("seek error for block %d at %x: ", - block, start_byte); + start_byte = compr_img->index_table[block] & ~OFF_T_MSB; + if (fseeko(cdHandle, start_byte, SEEK_SET) != 0) { + SysPrintf("seek error for block %d at %llx: ", + block, (long long)start_byte); perror(NULL); return -1; } - is_compressed = !(compr_img->index_table[block] & 0x80000000); - size = (compr_img->index_table[block + 1] & 0x7fffffff) - start_byte; + is_compressed = !(compr_img->index_table[block] & OFF_T_MSB); + size = (compr_img->index_table[block + 1] & ~OFF_T_MSB) - start_byte; if (size > sizeof(compr_img->buff_compressed)) { SysPrintf("block %d is too large: %u\n", block, size); return -1; @@ -1276,11 +1284,11 @@ static long CALLBACK ISOopen(void) { SysPrintf("[+sbi]"); } - fseek(cdHandle, 0, SEEK_END); + fseeko(cdHandle, 0, SEEK_END); // maybe user selected metadata file instead of main .bin .. bin_filename = GetIsoFile(); - if (ftell(cdHandle) < 2352 * 0x10) { + if (ftello(cdHandle) < 2352 * 0x10) { static const char *exts[] = { ".bin", ".BIN", ".img", ".IMG" }; FILE *tmpf = NULL; size_t i; @@ -1301,12 +1309,12 @@ static long CALLBACK ISOopen(void) { bin_filename = alt_bin_filename; fclose(cdHandle); cdHandle = tmpf; - fseek(cdHandle, 0, SEEK_END); + fseeko(cdHandle, 0, SEEK_END); } } // guess whether it is mode1/2048 - if (ftell(cdHandle) % 2048 == 0) { + if (ftello(cdHandle) % 2048 == 0) { unsigned int modeTest = 0; fseek(cdHandle, 0, SEEK_SET); fread(&modeTest, 4, 1, cdHandle); -- cgit v1.2.3 From 8638b7ee92c5bad04f724b056efb47e390b2ad8c Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 1 Apr 2016 01:16:56 +0300 Subject: use __ARM_ARCH --- include/arm_features.h | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/include/arm_features.h b/include/arm_features.h index 1f749da..f35e0b7 100644 --- a/include/arm_features.h +++ b/include/arm_features.h @@ -1,33 +1,49 @@ #ifndef __ARM_FEATURES_H__ #define __ARM_FEATURES_H__ -#if defined(__ARM_ARCH_8A__) +/* note: features only available since: + * __ARM_ARCH gcc 4.8/clang 3.2 + * ARMv8 support gcc 4.8/clang 3.4 + * ARM64 support gcc 4.8/clang 3.5 + */ + +#if defined(__aarch64__) + +#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 8) #define HAVE_ARMV8 #define HAVE_ARMV7 #define HAVE_ARMV6 #define HAVE_ARMV5 -#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ - || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ - || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__) +#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) \ + || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ + || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ + || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__) #define HAVE_ARMV7 #define HAVE_ARMV6 #define HAVE_ARMV5 -#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ - || defined(__ARM_ARCH_6M__) +#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 6) \ + || defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ + || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ + || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ + || defined(__ARM_ARCH_6M__) #define HAVE_ARMV6 #define HAVE_ARMV5 +#define HAVE_PRE_ARMV7 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5E__) \ || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) #define HAVE_ARMV5 +#define HAVE_PRE_ARMV7 + +#elif defined(__arm__) + +#define HAVE_PRE_ARMV7 #endif -- cgit v1.2.3 From 8f2bb0cbd20c00475196d1efb72103b65e57bc66 Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 1 Apr 2016 01:49:55 +0300 Subject: don't use __ARM_ARCH_7A__ github issue #68 --- frontend/libretro.c | 4 ++-- frontend/main.c | 5 +++-- frontend/menu.c | 9 +++++---- libpcsxcore/cdrom.c | 3 ++- libpcsxcore/new_dynarec/linkage_arm.S | 10 +++++----- plugins/dfsound/arm_utils.S | 4 ++-- plugins/dfsound/spu.c | 2 +- plugins/gpu_unai/gpulib_if.cpp | 3 ++- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/frontend/libretro.c b/frontend/libretro.c index acc64a1..37cccc4 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -25,6 +25,7 @@ #include "main.h" #include "plugin.h" #include "plugin_lib.h" +#include "arm_features.h" #include "revision.h" #include "libretro.h" @@ -1249,9 +1250,8 @@ void retro_init(void) /* Set how much slower PSX CPU runs * 100 (so that 200 is 2 times) * we have to do this because cache misses and some IO penalties * are not emulated. Warning: changing this may break compatibility. */ -#if !defined(__arm__) || defined(__ARM_ARCH_7A__) cycle_multiplier = 175; -#else +#ifdef HAVE_PRE_ARMV7 cycle_multiplier = 200; #endif pl_rearmed_cbs.gpu_peops.iUseDither = 1; diff --git a/frontend/main.c b/frontend/main.c index 4c84803..a824fdc 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -26,6 +26,7 @@ #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../plugins/cdrcimg/cdrcimg.h" #include "../plugins/dfsound/spu_config.h" +#include "arm_features.h" #include "revision.h" #ifndef NO_FRONTEND @@ -142,7 +143,7 @@ void emu_set_default_config(void) spu_config.iVolume = 768; spu_config.iTempo = 0; spu_config.iUseThread = 1; // no effect if only 1 core is detected -#if defined(__arm__) && !defined(__ARM_ARCH_7A__) /* XXX GPH hack */ +#ifdef HAVE_PRE_ARMV7 /* XXX GPH hack */ spu_config.iUseReverb = 0; spu_config.iUseInterpolation = 0; spu_config.iTempo = 1; @@ -771,7 +772,7 @@ int emu_save_state(int slot) return ret; ret = SaveState(fname); -#if defined(__arm__) && !defined(__ARM_ARCH_7A__) /* XXX GPH hack */ +#ifdef HAVE_PRE_ARMV7 /* XXX GPH hack */ sync(); #endif SysPrintf("* %s \"%s\" [%d]\n", diff --git a/frontend/menu.c b/frontend/menu.c index 9ddbe37..cf9382a 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -39,6 +39,7 @@ #include "../plugins/dfinput/externals.h" #include "../plugins/dfsound/spu_config.h" #include "psemu_plugin_defs.h" +#include "arm_features.h" #include "revision.h" #define REARMED_BIRTHDAY_TIME 1293306830 /* 25 Dec 2010 */ @@ -100,7 +101,7 @@ int scanlines, scanline_level = 20; int soft_scaling, analog_deadzone; // for Caanoo int soft_filter; -#ifdef __ARM_ARCH_7A__ +#ifndef HAVE_PRE_ARMV7 #define DEFAULT_PSX_CLOCK 57 #define DEFAULT_PSX_CLOCK_S "57" #else @@ -732,7 +733,7 @@ static unsigned short fname2color(const char *fname) static void draw_savestate_bg(int slot); #define MENU_ALIGN_LEFT -#ifdef __ARM_ARCH_7A__ // assume hires device +#ifndef HAVE_PRE_ARMV7 // assume hires device #define MENU_X2 1 #else #define MENU_X2 0 @@ -852,7 +853,7 @@ me_bind_action emuctrl_actions[] = { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP }, { "Take Screenshot ", 1 << SACTION_SCREENSHOT }, { "Show/Hide FPS ", 1 << SACTION_TOGGLE_FPS }, -#ifdef __ARM_ARCH_7A__ +#ifndef HAVE_PRE_ARMV7 { "Switch Renderer ", 1 << SACTION_SWITCH_DISPMODE }, #endif { "Fast Forward ", 1 << SACTION_FAST_FORWARD }, @@ -2521,7 +2522,7 @@ void menu_init(void) me_enable(e_menu_gfx_options, MA_OPT_GAMMA, plat_target.gamma_set != NULL); -#ifndef __ARM_ARCH_7A__ +#ifdef HAVE_PRE_ARMV7 me_enable(e_menu_gfx_options, MA_OPT_SWFILTER, 0); #endif me_enable(e_menu_gfx_options, MA_OPT_VARSCALER, MENU_SHOW_VARSCALER); diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 556b512..17d65ab 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -24,6 +24,7 @@ #include "cdrom.h" #include "ppf.h" #include "psxdma.h" +#include "arm_features.h" /* logging */ #if 0 @@ -1006,7 +1007,7 @@ finish: #endif } -#ifdef __ARM_ARCH_7A__ +#ifdef HAVE_ARMV7 #define ssat32_to_16(v) \ asm("ssat %0,#16,%1" : "=r" (v) : "r" (v)) #else diff --git a/libpcsxcore/new_dynarec/linkage_arm.S b/libpcsxcore/new_dynarec/linkage_arm.S index 50b577b..95af8b4 100644 --- a/libpcsxcore/new_dynarec/linkage_arm.S +++ b/libpcsxcore/new_dynarec/linkage_arm.S @@ -116,10 +116,10 @@ ptr_hash_table: #endif .macro load_varadr reg var -#if defined(__ARM_ARCH_7A__) && !defined(__PIC__) +#if defined(HAVE_ARMV7) && !defined(__PIC__) movw \reg, #:lower16:\var movt \reg, #:upper16:\var -#elif defined(__ARM_ARCH_7A__) && defined(__MACH__) +#elif defined(HAVE_ARMV7) && defined(__MACH__) movw \reg, #:lower16:(\var-(1678f+8)) movt \reg, #:upper16:(\var-(1678f+8)) 1678: @@ -130,7 +130,7 @@ ptr_hash_table: .endm .macro load_varadr_ext reg var -#if defined(__ARM_ARCH_7A__) && defined(__MACH__) && defined(__PIC__) +#if defined(HAVE_ARMV7) && defined(__MACH__) && defined(__PIC__) movw \reg, #:lower16:(ptr_\var-(1678f+8)) movt \reg, #:upper16:(ptr_\var-(1678f+8)) 1678: @@ -141,7 +141,7 @@ ptr_hash_table: .endm .macro mov_16 reg imm -#ifdef __ARM_ARCH_7A__ +#ifdef HAVE_ARMV7 movw \reg, #\imm #else mov \reg, #(\imm & 0x00ff) @@ -150,7 +150,7 @@ ptr_hash_table: .endm .macro mov_24 reg imm -#ifdef __ARM_ARCH_7A__ +#ifdef HAVE_ARMV7 movw \reg, #(\imm & 0xffff) movt \reg, #(\imm >> 16) #else diff --git a/plugins/dfsound/arm_utils.S b/plugins/dfsound/arm_utils.S index 9652313..eaeca51 100644 --- a/plugins/dfsound/arm_utils.S +++ b/plugins/dfsound/arm_utils.S @@ -20,10 +20,10 @@ ptr_ChanBuf: .word ESYM(ChanBuf) .align 2 .macro load_varadr reg var -#if defined(__ARM_ARCH_7A__) && !defined(__PIC__) +#if defined(HAVE_ARMV7) && !defined(__PIC__) movw \reg, #:lower16:ESYM(\var) movt \reg, #:upper16:ESYM(\var) -#elif defined(__ARM_ARCH_7A__) && defined(__MACH__) +#elif defined(HAVE_ARMV7) && defined(__MACH__) movw \reg, #:lower16:(ptr_\var-(1678f+8)) movt \reg, #:upper16:(ptr_\var-(1678f+8)) 1678: diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index c6a1bf5..0058ad2 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -35,7 +35,7 @@ #include "arm_features.h" #endif -#ifdef __ARM_ARCH_7A__ +#ifdef HAVE_ARMV7 #define ssat32_to_16(v) \ asm("ssat %0,#16,%1" : "=r" (v) : "r" (v)) #else diff --git a/plugins/gpu_unai/gpulib_if.cpp b/plugins/gpu_unai/gpulib_if.cpp index 646b0f2..2dedbf8 100644 --- a/plugins/gpu_unai/gpulib_if.cpp +++ b/plugins/gpu_unai/gpulib_if.cpp @@ -23,6 +23,7 @@ #include #include #include "../gpulib/gpu.h" +#include "arm_features.h" #define u8 uint8_t #define s8 int8_t @@ -171,7 +172,7 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd) unsigned int *list_end = list + list_len; linesInterlace = force_interlace; -#ifndef __ARM_ARCH_7A__ /* XXX */ +#ifdef HAVE_PRE_ARMV7 /* XXX */ linesInterlace |= gpu.status.interlace; #endif -- cgit v1.2.3 From 4da64aea132e752bfea9448238599653e741b465 Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 1 Apr 2016 02:34:52 +0300 Subject: fix build on some archs just some unneeded preprocessor check --- libpcsxcore/r3000a.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index 31aa3f8..32538e5 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -40,10 +40,8 @@ typedef struct { extern R3000Acpu *psxCpu; extern R3000Acpu psxInt; -#if (defined(__x86_64__) || defined(__i386__) || defined(__sh__) || defined(__ppc__) || defined(__arm__)) && !defined(NOPSXREC) extern R3000Acpu psxRec; #define PSXREC -#endif typedef union { #if defined(__BIGENDIAN__) -- cgit v1.2.3