summaryrefslogtreecommitdiff
path: root/brk_shim.c
blob: 1680a18a6e19e1d23b6d63819a8cf1ae44efac91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "brk_shim.h"

#include <errno.h>

/*
 * The idea is to just allocate a large buffer and rely on lazy page
 * loading to not use more physical memory than necessary.
 */

#ifdef LARGEF
#define SHIMSIZE 0x4000000
/* 64MB */
#else
#define SHIMSIZE 0x200000
/* 2MB */
#endif

static char shim_space[SHIMSIZE];
static intptr_t shim_size = 0;

void *shim_sbrk(intptr_t increment) {
  void* current = (void*)(shim_space + shim_size);
  shim_size += increment;
  if (shim_size < 0) {
    shim_size = 0;
    return (void*)-1;
  } else if (shim_size > SHIMSIZE) {
    shim_size = SHIMSIZE;
    return (void*)-1;
  }
  return current;
}

int shim_brk(void* addr) {
  if (addr < (void*)shim_space ||
      addr > (void*)(shim_space + SHIMSIZE)) {
    errno = EINVAL;
    return -1;    
  }
  shim_size = ((void*)shim_space) - addr;
  return 0;
}