001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019 #include <crt.h>
020 #include <libc.h>
021 #include <stdarg.h>
022 #include <debug.h>
023
024
025
026
027
028
029
030
031
032
033
034
035 int main()
036 {
037 void * moved;
038 char * zoup;
039 int fd;
040
041 fd = open("/dev/zero", O_RDWR);
042 zoup = mmap((void*)4096, 8*1024*1024,
043 PROT_READ | PROT_WRITE,
044 MAP_SHARED,
045 fd, 34);
046 close(fd);
047
048 bochs_printf("mapped @%x\n", (unsigned)zoup);
049
050
051 fork();
052 fork();
053
054
055
056 _sos_syscall1(4004, (unsigned)"Initial");
057 mprotect(zoup, 10*4096, PROT_READ);
058 zoup += 10*4096;
059 _sos_syscall1(4004, (unsigned)"After mprotect Low");
060
061 mprotect(zoup-4096, 2*4096, PROT_READ);
062 zoup += 4096;
063 _sos_syscall1(4004, (unsigned)"After mprotect Before Low");
064
065 mprotect(zoup-4096, 4096, PROT_READ);
066 _sos_syscall1(4004, (unsigned)"After mprotect Before low (bis)");
067
068 mprotect(zoup + 1024*1024, 4096, PROT_READ);
069 _sos_syscall1(4004, (unsigned)"After mprotect Middle");
070
071 mprotect(zoup + 1024*1024, 4096, PROT_READ);
072 _sos_syscall1(4004, (unsigned)"After mprotect Middle (bis)");
073
074 mprotect(zoup + 8*1024*1024 - 11*4096 - 4096, 4096, PROT_READ);
075 _sos_syscall1(4004, (unsigned)"After mprotect High");
076
077 mprotect(zoup + 8*1024*1024 - 11*4096 - 2*4096, 3*4096, PROT_READ);
078 _sos_syscall1(4004, (unsigned)"After mprotect Past High");
079
080 mprotect((void*)0x40000000, 0x10000000, PROT_READ);
081 _sos_syscall1(4004, (unsigned)"After mprotect Complete VR");
082
083 mprotect((void*)0x40000000, 0x10000000, PROT_READ);
084 _sos_syscall1(4004, (unsigned)"After mprotect Complete VR (bis)");
085
086
087 moved = zoup + 8*1024*1024 - 11*4096 - 10*4096;
088 _sos_mresize(zoup + 8*1024*1024 - 11*4096 - 2*4096, 3*4096,
089 & moved, 40*4096, 0);
090 _sos_syscall1(4004, (unsigned)"After mremap (not allowed)");
091 bochs_printf("moved=%x\n", (unsigned)moved);
092
093 _sos_mresize(zoup + 8*1024*1024 - 11*4096 - 2*4096, 4096,
094 & moved, 40*4096, 0);
095 _sos_syscall1(4004, (unsigned)"After mremap (not allowed - bis)");
096 bochs_printf("moved=%x\n", (unsigned)moved);
097
098 _sos_mresize(zoup + 8*1024*1024 - 11*4096 - 2*4096, 4096,
099 & moved, 40*4096, MREMAP_MAYMOVE);
100 _sos_syscall1(4004, (unsigned)"After mremap (DO move)");
101 bochs_printf("moved=%x\n", (unsigned)moved);
102
103 _sos_mresize(moved, 4096,
104 & moved, 100*4096, MREMAP_MAYMOVE);
105 _sos_syscall1(4004, (unsigned)"After mremap (DO move)");
106 bochs_printf("moved=%x\n", (unsigned)moved);
107
108 return 0;
109 }