diff -Naur -X exclude-files ac_cur/arch/um/Makefile ac/arch/um/Makefile --- ac_cur/arch/um/Makefile Tue Sep 18 22:09:23 2001 +++ ac/arch/um/Makefile Tue Sep 18 22:11:48 2001 @@ -42,6 +42,8 @@ LINKFLAGS += -r +LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc + $(ARCH_DIR)/link.ld: m4 -DSTART=$(shell echo $$((($(NESTING) + 1) * $(START_ADDR)))) \ -DSUBARCH=$(SUBARCH) -DELF_SUBARCH=$(ELF_SUBARCH) \ @@ -54,8 +56,8 @@ linux: $(ARCH_SYMLINKS) $(ARCH_DIR)/main.o vmlinux $(ARCH_DIR)/link.ld mv vmlinux vmlinux.o - $(CC) -Wl,-T,$(ARCH_DIR)/link.ld $(LINK_PROFILE) -o linux -static \ - $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib + $(CC) -Wl,-T,$(ARCH_DIR)/link.ld $(LINK_PROFILE) $(LINK_WRAPS) \ + -o linux -static $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib rm -f $(ARCH_DIR)/link.ld USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) diff -Naur -X exclude-files ac_cur/arch/um/include/kern_util.h ac/arch/um/include/kern_util.h --- ac_cur/arch/um/include/kern_util.h Tue Sep 18 22:01:07 2001 +++ ac/arch/um/include/kern_util.h Tue Sep 18 22:11:48 2001 @@ -18,6 +18,7 @@ extern int ncpus; extern char *linux_prog; extern char *gdb_init; +extern int kmalloc_ok; #define ROUND_DOWN(addr) ((void *)(((unsigned long) addr) & PAGE_MASK)) #define ROUND_UP(addr) ROUND_DOWN(((unsigned long) addr) + PAGE_SIZE - 1) diff -Naur -X exclude-files ac_cur/arch/um/include/user_util.h ac/arch/um/include/user_util.h --- ac_cur/arch/um/include/user_util.h Tue Sep 18 22:00:03 2001 +++ ac/arch/um/include/user_util.h Tue Sep 18 22:11:48 2001 @@ -30,17 +30,12 @@ extern struct cpu_task cpu_tasks[]; -extern int brk_fd; - extern unsigned long low_physmem; extern unsigned long high_physmem; extern unsigned long physmem; extern unsigned long end_vm; extern unsigned long start_vm; -extern void *last_brk; -extern void *brk_start; - extern int tracing_pid; extern int honeypot; @@ -88,6 +83,7 @@ extern void unblock_shlib_mem(void); extern void timer(void); extern void get_profile_timer(void); +extern void disable_profile_timer(void); extern void set_timers(int set_signal); extern int clone_and_wait(int (*fn)(void *), void *arg, void *sp, int flags); extern int input_loop(void); @@ -118,8 +114,6 @@ extern int raw(int fd, int complain); extern void cooked(int fd); extern int switcheroo(int fd, int prot, void *from, void *to, int size); -extern void *update_brk(void); -extern void check_brk(void *process_brk); extern void idle_sleep(int secs); extern int get_one_stack(char **stack_out, struct sys_pt_regs *regs_out); extern void setup_machinename(char *machine_out); diff -Naur -X exclude-files ac_cur/arch/um/kernel/exec_kern.c ac/arch/um/kernel/exec_kern.c --- ac_cur/arch/um/kernel/exec_kern.c Tue Sep 18 22:01:07 2001 +++ ac/arch/um/kernel/exec_kern.c Tue Sep 18 22:11:48 2001 @@ -81,7 +81,6 @@ protect(physmem, high_physmem - physmem, 1, 1, 0); task_protections((unsigned long) current); force_flush_all(); - check_brk(brk_start); unblock_signals(); } diff -Naur -X exclude-files ac_cur/arch/um/kernel/mem.c ac/arch/um/kernel/mem.c --- ac_cur/arch/um/kernel/mem.c Tue Sep 18 22:00:03 2001 +++ ac/arch/um/kernel/mem.c Tue Sep 18 22:11:48 2001 @@ -38,6 +38,8 @@ extern char __init_begin, __init_end; +int kmalloc_ok = 0; + void mem_init(void) { max_mapnr = num_physpages = max_low_pfn; @@ -49,6 +51,7 @@ totalram_pages += free_all_bootmem(); printk("Memory: %luk available\n", (unsigned long) nr_free_pages() << (PAGE_SHIFT-10)); + kmalloc_ok = 1; } void paging_init(void) diff -Naur -X exclude-files ac_cur/arch/um/kernel/process.c ac/arch/um/kernel/process.c --- ac_cur/arch/um/kernel/process.c Tue Sep 18 22:00:03 2001 +++ ac/arch/um/kernel/process.c Tue Sep 18 22:11:48 2001 @@ -239,37 +239,6 @@ sigprocmask(on ? SIG_UNBLOCK : SIG_BLOCK, &sigset, NULL); } -void *last_brk; - -void *update_brk(void) -{ - void *current_brk; - int len, off; - - current_brk = sbrk(0); - if(current_brk == last_brk) return(current_brk); - off = last_brk - brk_start; - if(lseek(brk_fd, off, SEEK_SET) != off){ - panic("update_brk : lseek failed - errno = %d", errno); - } - len = current_brk - last_brk; - if(write(brk_fd, last_brk, len) != len){ - panic("update_brk : write failed - errno = %d", errno); - } - last_brk = current_brk; - return(current_brk); -} - -void check_brk(void *process_brk) -{ - if(last_brk == process_brk) return; - if(mmap(process_brk, last_brk - process_brk, - PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, - brk_fd, process_brk - brk_start) != process_brk){ - panic("check_brk : mmap failed - errno = %d", errno); - } -} - int get_one_stack(char **stack_out, struct sys_pt_regs *regs_out) { void *stack; diff -Naur -X exclude-files ac_cur/arch/um/kernel/process_kern.c ac/arch/um/kernel/process_kern.c --- ac_cur/arch/um/kernel/process_kern.c Tue Sep 18 22:11:06 2001 +++ ac/arch/um/kernel/process_kern.c Tue Sep 18 22:11:48 2001 @@ -208,12 +208,10 @@ to = next; current->thread.request.op = OP_SWITCH; current->thread.request.u.cswitch.to = next; - current->thread.brk = update_brk(); forward_interrupts(to->thread.extern_pid); block_signals(); usr1_pid(getpid()); flush_tlb_kernel_vm(); - check_brk(current->thread.brk); unblock_signals(); return(current->thread.request.u.cswitch.from); } @@ -519,7 +517,6 @@ { init_flush_vm(); flush_tlb_kernel_vm(); - check_brk(brk_start); if(current->mm != current->p_pptr->mm) protect(physmem, high_physmem - physmem, 1, 1, 0); task_protections((unsigned long) current); diff -Naur -X exclude-files ac_cur/arch/um/kernel/time.c ac/arch/um/kernel/time.c --- ac_cur/arch/um/kernel/time.c Tue Sep 18 22:00:03 2001 +++ ac/arch/um/kernel/time.c Tue Sep 18 22:11:48 2001 @@ -34,6 +34,13 @@ void get_profile_timer(void) { getitimer(ITIMER_PROF, &profile_interval); + profile_interval.it_value = profile_interval.it_interval; +} + +void disable_profile_timer(void) +{ + struct itimerval interval = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); + setitimer(ITIMER_PROF, &interval, NULL); } static void set_interval(int timer_type) diff -Naur -X exclude-files ac_cur/arch/um/kernel/tlb.c ac/arch/um/kernel/tlb.c --- ac_cur/arch/um/kernel/tlb.c Tue Sep 18 22:11:06 2001 +++ ac/arch/um/kernel/tlb.c Tue Sep 18 22:11:48 2001 @@ -38,9 +38,11 @@ for(addr=start_addr;addr #include #include +#include #include -#include "include/user_util.h" +#include "user_util.h" +#include "kern_util.h" +#include "user.h" unsigned long stacksizelim; @@ -43,6 +46,9 @@ new_argv[i] = argv[i - 1]; new_argv[argc + 1] = NULL; +#ifdef PROFILING + disable_profile_timer(); +#endif execvp(new_argv[0], new_argv); perror("execing with extended args"); exit(1); @@ -62,7 +68,6 @@ } } stacksizelim = (lim.rlim_cur + PGD_BOUND - 1) & ~(PGD_BOUND - 1); - get_profile_timer(); if(isatty(0)) tcgetattr(0, &tt); else if(isatty(1)) tcgetattr(1, &tt); else tcgetattr(2, &tt); @@ -81,7 +86,7 @@ ret = linux_main(argc, argv); - /* Reboot */ + /* Reboot */ if(ret){ printf("\n"); tcsetattr(0, TCSADRAIN, &tt); @@ -97,15 +102,40 @@ } #ifdef PROFILING -extern void block_shlib_mem(void); extern void __real___monstartup (unsigned long, unsigned long); void __wrap___monstartup (unsigned long lowpc, unsigned long highpc) { block_shlib_mem(); __real___monstartup(lowpc, highpc); + get_profile_timer(); } #endif + +extern void *__real_malloc(int); + +void *__wrap_malloc(int size) +{ + if(kmalloc_ok) return(um_kmalloc(size)); + else return(__real_malloc(size)); +} + +void *__wrap_calloc(int n, int size) +{ + void *ptr = __wrap_malloc(n * size); + + if(ptr == NULL) return(NULL); + memset(ptr, 0, n * size); + return(ptr); +} + +extern void __real_free(void *); + +void __wrap_free(void *ptr) +{ + if(kmalloc_ok) kfree(ptr); + else __real_free(ptr); +} /* * Overrides for Emacs so that we follow Linus's tabbing style. diff -Naur -X exclude-files ac_cur/include/asm-um/processor-generic.h ac/include/asm-um/processor-generic.h --- ac_cur/include/asm-um/processor-generic.h Tue Sep 18 22:01:02 2001 +++ ac/include/asm-um/processor-generic.h Tue Sep 18 22:11:48 2001 @@ -46,7 +46,6 @@ int repeat_syscall; void *fault_addr; void *fault_catcher; - void *brk; int sigreturn_syscall; struct { int op; @@ -156,7 +155,6 @@ err: 0, \ repeat_syscall: 0, \ fault_addr: NULL, \ - brk: NULL, \ sigreturn_syscall: 0, \ request: { 0 } \ }