add mremap implementation for where it's not provided
[picodrive.git] / platform / libretro.c
index ebf6e65..a6bc50f 100644 (file)
 #include "common/version.h"
 #include "libretro.h"
 
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
 static retro_video_refresh_t video_cb;
 static retro_input_poll_t input_poll_cb;
 static retro_input_state_t input_state_cb;
@@ -92,11 +96,35 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed)
 
 void *plat_mremap(void *ptr, size_t oldsize, size_t newsize)
 {
+#ifdef __linux__
        void *ret = mremap(ptr, oldsize, newsize, 0);
        if (ret == MAP_FAILED)
                return NULL;
 
        return ret;
+#else
+       void *tmp, *ret;
+       size_t preserve_size;
+       
+       preserve_size = oldsize;
+       if (preserve_size > newsize)
+               preserve_size = newsize;
+       tmp = malloc(preserve_size);
+       if (tmp == NULL)
+               return NULL;
+       memcpy(tmp, ptr, preserve_size);
+
+       munmap(ptr, oldsize);
+       ret = mmap(ptr, newsize, PROT_READ | PROT_WRITE,
+                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+       if (ret == MAP_FAILED) {
+               free(tmp);
+               return NULL;
+       }
+       memcpy(ret, tmp, preserve_size);
+       free(tmp);
+       return ret;
+#endif
 }
 
 void plat_munmap(void *ptr, size_t size)
@@ -187,7 +215,7 @@ void retro_get_system_info(struct retro_system_info *info)
        memset(info, 0, sizeof(*info));
        info->library_name = "PicoDrive";
        info->library_version = VERSION;
-       info->valid_extensions = "bin|gen|smd|32x|cue|iso|sms";
+       info->valid_extensions = "bin|gen|smd|md|32x|cue|iso|sms";
        info->need_fullpath = true;
 }
 
@@ -571,9 +599,12 @@ void retro_init(void)
        environ_cb(RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE, &disk_control);
 
        PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80
-               | POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC
-               | POPT_ACC_SPRITES|POPT_EN_32X|POPT_EN_PWM
-               | POPT_DIS_32C_BORDER;
+               | POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_MCD_GFX
+               | POPT_EN_32X|POPT_EN_PWM
+               | POPT_ACC_SPRITES|POPT_DIS_32C_BORDER;
+#ifdef __arm__
+       PicoOpt |= POPT_EN_SVP_DRC;
+#endif
        PsndRate = 44100;
        PicoAutoRgnOrder = 0x184; // US, EU, JP
        PicoCDBuffers = 0;