* Copyright (C) 2022 Paul Cercueil <paul@crapouillou.net>
*/
+#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/stat.h>
+#include <sys/syscall.h>
#include <unistd.h>
#include "../psxhw.h"
#define MFD_HUGETLB 0x0004
#endif
+void *code_buffer;
+
static const uintptr_t supported_io_bases[] = {
0x0,
0x10000000,
if (hugetlb)
flags |= MFD_HUGETLB;
- memfd = memfd_create("/lightrec_memfd", flags);
+ memfd = syscall(SYS_memfd_create, "/lightrec_memfd",
+ flags);
if (memfd < 0) {
err = -errno;
fprintf(stderr, "Failed to create memfd: %d\n", err);
unsigned int i;
uintptr_t base;
void *map;
- int err;
-
- err = lightrec_mmap_ram(true);
+ int err = lightrec_mmap_ram(true);
if (err) {
err = lightrec_mmap_ram(false);
if (err) {
psxH = (s8 *)map;
+ map = mmap_huge((void *)(base + 0x800000), CODE_BUFFER_SIZE,
+ PROT_EXEC | PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS,
+ 0, 0);
+ if (map == MAP_FAILED) {
+ err = -EINVAL;
+ fprintf(stderr, "Unable to mmap code buffer\n");
+ goto err_unmap_scratch;
+ }
+
+ code_buffer = map;
+
return 0;
+err_unmap_scratch:
+ munmap(psxH, 0x10000);
err_unmap_bios:
- munmap(psxR, 0x80000);
+ munmap(psxR, 0x200000);
err_unmap_parallel:
munmap(psxP, 0x10000);
err_unmap:
{
unsigned int i;
+ munmap(code_buffer, CODE_BUFFER_SIZE);
munmap(psxH, 0x10000);
- munmap(psxR, 0x80000);
+ munmap(psxR, 0x200000);
munmap(psxP, 0x10000);
for (i = 0; i < 4; i++)
munmap((void *)((uintptr_t)psxM + i * 0x200000), 0x200000);