1/*
2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
4 */
5
6#include <stdlib.h>
7#include <stdio.h>
8#include <unistd.h>
9#include <string.h>
10#include <errno.h>
11#include <sys/mman.h>
12#include "tt.h"
13#include "mem_user.h"
14#include "os.h"
15
16void remap_data(void *segment_start, void *segment_end, int w)
17{
18	void *addr;
19	unsigned long size;
20	int data, prot;
21
22	if(w) prot = PROT_WRITE;
23	else prot = 0;
24	prot |= PROT_READ | PROT_EXEC;
25	size = (unsigned long) segment_end -
26		(unsigned long) segment_start;
27	data = create_mem_file(size);
28	addr = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, data, 0);
29	if(addr == MAP_FAILED){
30		perror("mapping new data segment");
31		exit(1);
32	}
33	memcpy(addr, segment_start, size);
34	if(switcheroo(data, prot, addr, segment_start, size) < 0){
35		printf("switcheroo failed\n");
36		exit(1);
37	}
38}
39
40/*
41 * Overrides for Emacs so that we follow Linus's tabbing style.
42 * Emacs will notice this stuff at the end of the file and automatically
43 * adjust the settings for this buffer only.  This must remain at the end
44 * of the file.
45 * ---------------------------------------------------------------------------
46 * Local variables:
47 * c-file-style: "linux"
48 * End:
49 */
50