* Copyright (C) 2022 Paul Cercueil <paul@crapouillou.net>
*/
+#ifndef _GNU_SOURCE
#define _GNU_SOURCE
+#endif
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#define MFD_HUGETLB 0x0004
#endif
-void *code_buffer;
-
static const uintptr_t supported_io_bases[] = {
0x0,
0x10000000,
if (map == MAP_FAILED) {
map = mmap(addr, length, prot, flags, fd, offset);
- if (map != MAP_FAILED)
+ if (map != MAP_FAILED) {
printf("Regular mmap to address 0x%lx succeeded\n", (uintptr_t) addr);
+#ifdef MADV_HUGEPAGE
+ madvise(map, length, MADV_HUGEPAGE);
+#endif
+ }
}
return map;
for (j = 0; j < 4; j++) {
map = mmap_huge((void *)(base + j * 0x200000),
0x200000, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_FIXED, memfd, 0);
+ MAP_SHARED | MAP_FIXED_NOREPLACE, memfd, 0);
if (map == MAP_FAILED)
break;
}
map = mmap((void *)(base + 0x1f000000), 0x10000,
PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, 0, 0);
+ MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, -1, 0);
if (map == MAP_FAILED) {
err = -EINVAL;
fprintf(stderr, "Unable to mmap parallel port\n");
map = mmap_huge((void *)(base + 0x1fc00000), 0x200000,
PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, 0, 0);
+ MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, -1, 0);
if (map == MAP_FAILED) {
err = -EINVAL;
fprintf(stderr, "Unable to mmap BIOS\n");
map = mmap_huge((void *)(base + 0x800000), CODE_BUFFER_SIZE,
PROT_EXEC | PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS,
- 0, 0);
+ -1, 0);
if (map == MAP_FAILED) {
err = -EINVAL;
fprintf(stderr, "Unable to mmap code buffer\n");
err_unmap_scratch:
munmap(psxH, 0x10000);
err_unmap_bios:
- munmap(psxR, 0x80000);
+ munmap(psxR, 0x200000);
err_unmap_parallel:
munmap(psxP, 0x10000);
err_unmap:
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);