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