Common shared memory module. Using O_CLOEXEC for opened files.

This commit is contained in:
sorgelig
2021-04-16 23:12:46 +08:00
parent 2899437499
commit 9cd404ea65
22 changed files with 186 additions and 240 deletions

View File

@@ -9,7 +9,6 @@
#include <ctype.h>
#include <sys/stat.h>
#include <sys/statvfs.h>
#include <sys/mman.h>
#include "lib/lodepng/lodepng.h"
@@ -33,6 +32,7 @@
#include "cheats.h"
#include "video.h"
#include "audio.h"
#include "shmem.h"
#include "support.h"
@@ -904,16 +904,8 @@ uint16_t sdram_sz(int sz)
{
int res = 0;
int fd;
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) return 0;
void* buf = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x1FFFF000);
if (buf == (void *)-1)
{
printf("Unable to mmap(/dev/mem)\n");
close(fd);
return 0;
}
void* buf = shmem_map(0x1FFFF000, 0x1000);
if (!buf) return 0;
volatile uint8_t* par = (volatile uint8_t*)buf;
par += 0xF00;
@@ -938,8 +930,7 @@ uint16_t sdram_sz(int sz)
}
}
munmap(buf, 0x1000);
close(fd);
shmem_unmap(buf, 0x1000);
return res;
}
@@ -947,16 +938,8 @@ uint16_t altcfg(int alt)
{
int res = 0;
int fd;
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) return 0;
void* buf = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x1FFFF000);
if (buf == (void *)-1)
{
printf("Unable to mmap(/dev/mem)\n");
close(fd);
return 0;
}
void* buf = shmem_map(0x1FFFF000, 0x1000);
if (!buf) return 0;
volatile uint8_t* par = (volatile uint8_t*)buf;
par += 0xF04;
@@ -981,8 +964,7 @@ uint16_t altcfg(int alt)
}
}
munmap(buf, 0x1000);
close(fd);
shmem_unmap(buf, 0x1000);
return res;
}
@@ -1952,7 +1934,6 @@ static int process_ss(const char *rom_name)
{
static char ss_name[1024] = {};
static char *ss_sufx = 0;
static int memfd = -1;
static uint32_t ss_cnt[4] = {};
static void *base[4] = {};
@@ -1960,24 +1941,14 @@ static int process_ss(const char *rom_name)
if (rom_name)
{
if (memfd < 0)
{
memfd = open("/dev/mem", O_RDWR | O_SYNC);
if (memfd == -1)
{
printf("Unable to open /dev/mem!\n");
return 0;
}
}
uint32_t len = ss_size;
uint32_t map_addr = ss_base;
fileTYPE f = {};
for (int i = 0; i < 4; i++)
{
if (!base[i]) base[i] = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, map_addr);
if (base[i] == (void *)-1)
if (!base[i]) base[i] = shmem_map(map_addr, len);
if (!base[i])
{
printf("Unable to mmap (0x%X, %d)!\n", map_addr, len);
}
@@ -2026,36 +1997,33 @@ static int process_ss(const char *rom_name)
if (ss_timer && !CheckTimer(ss_timer)) return 0;
ss_timer = GetTimer(1000);
if (memfd >= 0)
fileTYPE f = {};
for (int i = 0; i < 4; i++)
{
fileTYPE f = {};
for (int i = 0; i < 4; i++)
if (base[i])
{
if (base[i] && (base[i] != (void *)-1))
uint32_t curcnt = ((uint32_t*)(base[i]))[0];
uint32_t size = ((uint32_t*)(base[i]))[1];
if (curcnt != ss_cnt[i])
{
uint32_t curcnt = ((uint32_t*)(base[i]))[0];
uint32_t size = ((uint32_t*)(base[i]))[1];
if (curcnt != ss_cnt[i])
ss_cnt[i] = curcnt;
if (size) size = (size + 2) * 4;
if (size > 0 && size <= ss_size)
{
ss_cnt[i] = curcnt;
if (size) size = (size + 2) * 4;
if (size > 0 && size <= ss_size)
{
MenuHide();
Info("Saving the state", 500);
MenuHide();
Info("Saving the state", 500);
*ss_sufx = i + '1';
if (FileOpenEx(&f, ss_name, O_CREAT | O_TRUNC | O_RDWR | O_SYNC))
{
int ret = FileWriteAdv(&f, base[i], size);
FileClose(&f);
printf("Wrote %d bytes to file: %s\n", ret, ss_name);
}
else
{
printf("Unable to create file: %s\n", ss_name);
}
*ss_sufx = i + '1';
if (FileOpenEx(&f, ss_name, O_CREAT | O_TRUNC | O_RDWR | O_SYNC))
{
int ret = FileWriteAdv(&f, base[i], size);
FileClose(&f);
printf("Wrote %d bytes to file: %s\n", ret, ss_name);
}
else
{
printf("Unable to create file: %s\n", ss_name);
}
}
}