From c7bcf4514f821aafb8540ebe60f308c0bad1f2b6 Mon Sep 17 00:00:00 2001 From: srinivasa Date: Fri, 18 Jan 2008 08:47:31 +0000 Subject: From srinivasa@in.ibm.com, To make systemtap to work with register rename patch for x86/x86_64 --- runtime/loc2c-runtime.h | 32 +++++++++++++++++++- runtime/procfs.c | 6 ++++ runtime/regs.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++-- runtime/regs.h | 5 +++- runtime/stack-i386.c | 4 +++ 5 files changed, 122 insertions(+), 4 deletions(-) (limited to 'runtime') diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index 8dbff764..4674e399 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -75,7 +75,37 @@ }) -#if defined __i386__ +#if defined (STAPCONF_X86_UNIREGS) && defined (__i386__) + +#define dwarf_register_0(regs) regs->ax +#define dwarf_register_1(regs) regs->cx +#define dwarf_register_2(regs) regs->dx +#define dwarf_register_3(regs) regs->bx +#define dwarf_register_4(regs) ((long) ®s->sp) +#define dwarf_register_5(regs) regs->bp +#define dwarf_register_6(regs) regs->si +#define dwarf_register_7(regs) regs->di + +#elif defined (STAPCONF_X86_UNIREGS) && defined (__x86_64__) + +#define dwarf_register_0(regs) regs->ax +#define dwarf_register_1(regs) regs->dx +#define dwarf_register_2(regs) regs->cx +#define dwarf_register_3(regs) regs->bx +#define dwarf_register_4(regs) regs->si +#define dwarf_register_5(regs) regs->di +#define dwarf_register_6(regs) regs->bp +#define dwarf_register_7(regs) regs->sp +#define dwarf_register_8(regs) regs->r8 +#define dwarf_register_9(regs) regs->r9 +#define dwarf_register_10(regs) regs->r10 +#define dwarf_register_11(regs) regs->r11 +#define dwarf_register_12(regs) regs->r12 +#define dwarf_register_13(regs) regs->r13 +#define dwarf_register_14(regs) regs->r14 +#define dwarf_register_15(regs) regs->r15 + +#elif defined __i386__ /* The stack pointer is unlike other registers. When a trap happens in kernel mode, it is not saved in the trap frame (struct pt_regs). diff --git a/runtime/procfs.c b/runtime/procfs.c index eb0f845c..1b1d5447 100644 --- a/runtime/procfs.c +++ b/runtime/procfs.c @@ -87,8 +87,14 @@ int _stp_mkdir_proc_module(void) goto done; } } else { + #ifdef STAPCONF_NAMEIDATA_CLEANUP + _stp_proc_stap = PDE(nd.path.dentry->d_inode); + path_put (&nd.path); + + #else _stp_proc_stap = PDE(nd.dentry->d_inode); path_release (&nd); + #endif } _stp_proc_root = proc_mkdir(THIS_MODULE->name, _stp_proc_stap); diff --git a/runtime/regs.c b/runtime/regs.c index bc717695..5e08e376 100644 --- a/runtime/regs.c +++ b/runtime/regs.c @@ -33,7 +33,13 @@ unsigned long _stp_ret_addr (struct pt_regs *regs) { -#ifdef __x86_64__ +#if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) + unsigned long *ra = (unsigned long *)regs->sp; + if (ra) + return *ra; + else + return 0; +#elif defined (__x86_64__) unsigned long *ra = (unsigned long *)regs->rsp; if (ra) return *ra; @@ -77,7 +83,76 @@ unsigned long _stp_ret_addr (struct pt_regs *regs) */ #define _stp_probe_addr_r(ri) (ri->rp->kp.addr) -#ifdef __x86_64__ +#if defined (STAPCONF_X86_UNIREGS) && defined (__x86_64__) + +void _stp_print_regs(struct pt_regs * regs) +{ + unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; + unsigned int fsindex,gsindex; + unsigned int ds,cs,es; + + _stp_printf("RIP: %016lx\nRSP: %016lx EFLAGS: %08lx\n", regs->ip, regs->sp, regs->flags); + _stp_printf("RAX: %016lx RBX: %016lx RCX: %016lx\n", + regs->ax, regs->bx, regs->cx); + _stp_printf("RDX: %016lx RSI: %016lx RDI: %016lx\n", + regs->dx, regs->si, regs->di); + _stp_printf("RBP: %016lx R08: %016lx R09: %016lx\n", + regs->bp, regs->r8, regs->r9); + _stp_printf("R10: %016lx R11: %016lx R12: %016lx\n", + regs->r10, regs->r11, regs->r12); + _stp_printf("R13: %016lx R14: %016lx R15: %016lx\n", + regs->r13, regs->r14, regs->r15); + + asm("movl %%ds,%0" : "=r" (ds)); + asm("movl %%cs,%0" : "=r" (cs)); + asm("movl %%es,%0" : "=r" (es)); + asm("movl %%fs,%0" : "=r" (fsindex)); + asm("movl %%gs,%0" : "=r" (gsindex)); + + rdmsrl(MSR_FS_BASE, fs); + rdmsrl(MSR_GS_BASE, gs); + rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); + + asm("movq %%cr0, %0": "=r" (cr0)); + asm("movq %%cr2, %0": "=r" (cr2)); + asm("movq %%cr3, %0": "=r" (cr3)); + asm("movq %%cr4, %0": "=r" (cr4)); + + _stp_printf("FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", + fs,fsindex,gs,gsindex,shadowgs); + _stp_printf("CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0); + _stp_printf("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4); +} + + #elif defined (STAPCONF_X86_UNIREGS) && defined (__i386__) + +void _stp_print_regs(struct pt_regs * regs) +{ + unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L; + + _stp_printf ("EIP: %08lx\n",regs->ip); + _stp_printf ("ESP: %08lx\n",regs->sp); + _stp_printf ("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", + regs->ax,regs->bx,regs->cx,regs->dx); + _stp_printf ("ESI: %08lx EDI: %08lx EBP: %08lx", + regs->si, regs->di, regs->bp); + _stp_printf (" DS: %04x ES: %04x\n", + 0xffff & regs->ds,0xffff & regs->es); + + __asm__("movl %%cr0, %0": "=r" (cr0)); + __asm__("movl %%cr2, %0": "=r" (cr2)); + __asm__("movl %%cr3, %0": "=r" (cr3)); + /* This could fault if %cr4 does not exist */ + __asm__("1: movl %%cr4, %0 \n" + "2: \n" + ".section __ex_table,\"a\" \n" + ".long 1b,2b \n" + ".previous \n" + : "=r" (cr4): "0" (0)); + _stp_printf ("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4); +} + +#elif defined (__x86_64__) void _stp_print_regs(struct pt_regs * regs) { unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; diff --git a/runtime/regs.h b/runtime/regs.h index 0887d628..c1e2344b 100644 --- a/runtime/regs.h +++ b/runtime/regs.h @@ -11,8 +11,11 @@ #ifndef _REGS_H_ /* -*- linux-c -*- */ #define _REGS_H_ +#if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) +#define REG_IP(regs) regs->ip +#define REG_SP(regs) regs->sp -#ifdef __x86_64__ +#elif defined (__x86_64__) #define REG_IP(regs) regs->rip #define REG_SP(regs) regs->rsp diff --git a/runtime/stack-i386.c b/runtime/stack-i386.c index 3675fc97..d73f4c84 100644 --- a/runtime/stack-i386.c +++ b/runtime/stack-i386.c @@ -21,7 +21,11 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) #ifdef CONFIG_FRAME_POINTER { + #ifdef STAPCONF_X86_UNIREGS + unsigned long ebp = regs->bp; + #elif unsigned long ebp = regs->ebp; + #endif while (_stp_valid_stack_ptr(context, (unsigned long)ebp)) { addr = *(unsigned long *)(ebp + 4); -- cgit From 7abdfe546471945b393fc4ff4a955b8e7b2a0ac2 Mon Sep 17 00:00:00 2001 From: kenistoj Date: Sat, 19 Jan 2008 00:24:07 +0000 Subject: * runtime/uprobes/uprobes.c: Added static copy of access_process_vm(), for kernels that don't export it. --- runtime/uprobes/uprobes.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'runtime') diff --git a/runtime/uprobes/uprobes.c b/runtime/uprobes/uprobes.c index 50930709..005ca919 100644 --- a/runtime/uprobes/uprobes.c +++ b/runtime/uprobes/uprobes.c @@ -42,8 +42,14 @@ #define MAX_SSOL_SLOTS 1024 +#ifdef NO_ACCESS_PROCESS_VM_EXPORT +static int __access_process_vm(struct task_struct *tsk, unsigned long addr, + void *buf, int len, int write); +#define access_process_vm __access_process_vm +#else extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); +#endif static int utask_fake_quiesce(struct uprobe_task *utask); static void uprobe_release_ssol_vma(struct uprobe_process *uproc); @@ -2267,5 +2273,61 @@ static void zap_uretprobe_instances(struct uprobe *u, } #endif /* CONFIG_URETPROBES */ +#ifdef NO_ACCESS_PROCESS_VM_EXPORT +/* + * Some kernel versions export everything that uprobes.ko needs except + * access_process_vm, so we copied and pasted it here. Fortunately, + * everything it calls is exported. + */ +#include +#include +static int __access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) +{ + struct mm_struct *mm; + struct vm_area_struct *vma; + struct page *page; + void *old_buf = buf; + + mm = get_task_mm(tsk); + if (!mm) + return 0; + + down_read(&mm->mmap_sem); + /* ignore errors, just check how much was sucessfully transfered */ + while (len) { + int bytes, ret, offset; + void *maddr; + + ret = get_user_pages(tsk, mm, addr, 1, + write, 1, &page, &vma); + if (ret <= 0) + break; + + bytes = len; + offset = addr & (PAGE_SIZE-1); + if (bytes > PAGE_SIZE-offset) + bytes = PAGE_SIZE-offset; + + maddr = kmap(page); + if (write) { + copy_to_user_page(vma, page, addr, + maddr + offset, buf, bytes); + set_page_dirty_lock(page); + } else { + copy_from_user_page(vma, page, addr, + buf, maddr + offset, bytes); + } + kunmap(page); + page_cache_release(page); + len -= bytes; + buf += bytes; + addr += bytes; + } + up_read(&mm->mmap_sem); + mmput(mm); + + return buf - old_buf; +} +#endif #include "uprobes_arch.c" MODULE_LICENSE("GPL"); -- cgit From efa4888133b8aa360f2ea3a7179f37321a7853ea Mon Sep 17 00:00:00 2001 From: hunt Date: Mon, 21 Jan 2008 17:07:10 +0000 Subject: 2008-01-21 Martin Hunt * symbols.c (send_module): Simplify and use new send_data() function to keep longword alignment. --- runtime/staprun/ChangeLog | 5 +++ runtime/staprun/staprun_funcs.c | 2 - runtime/staprun/symbols.c | 94 +++++++++++++++++++++++++++++++++++------ 3 files changed, 87 insertions(+), 14 deletions(-) (limited to 'runtime') diff --git a/runtime/staprun/ChangeLog b/runtime/staprun/ChangeLog index 3f373863..53545db2 100644 --- a/runtime/staprun/ChangeLog +++ b/runtime/staprun/ChangeLog @@ -1,3 +1,8 @@ +2008-01-21 Martin Hunt + + * symbols.c (send_module): Simplify and use new send_data() function to keep + longword alignment. + 2008-01-14 Martin Hunt PR4037 and fixes to better synchronize staprun and stapio. diff --git a/runtime/staprun/staprun_funcs.c b/runtime/staprun/staprun_funcs.c index ebf05b34..d1bba3f8 100644 --- a/runtime/staprun/staprun_funcs.c +++ b/runtime/staprun/staprun_funcs.c @@ -16,8 +16,6 @@ #include #include -void cleanup(int rc); - void setup_staprun_signals(void) { struct sigaction a; diff --git a/runtime/staprun/symbols.c b/runtime/staprun/symbols.c index 5a4855b3..cf0276ff 100644 --- a/runtime/staprun/symbols.c +++ b/runtime/staprun/symbols.c @@ -10,19 +10,64 @@ */ #include "staprun.h" +#include +#include /* send symbol data */ -static int send_data(void *data, int len) +static int send_data(int32_t type, void *data, int len) { - int32_t type = STP_SYMBOLS; if (write(control_channel, &type, 4) <= 0) return -1; return write(control_channel, data, len); } +static char debuginfo_path_arr[] = "-:.debug:/usr/lib/debug"; +static char *debuginfo_path = debuginfo_path_arr; +static const Dwfl_Callbacks kernel_callbacks = +{ + .find_debuginfo = dwfl_standard_find_debuginfo, + .debuginfo_path = &debuginfo_path, + .find_elf = dwfl_linux_kernel_find_elf, + .section_address = dwfl_linux_kernel_module_section_address, +}; + +void *get_module_unwind_data(Dwfl *dwfl, const char *name, int *len) +{ + Dwarf_Addr bias = 0; + Dwarf *dw; + GElf_Ehdr *ehdr, ehdr_mem; + GElf_Shdr *shdr, shdr_mem; + Elf_Scn *scn = NULL; + Elf_Data *data = NULL; + + Dwfl_Module *mod = dwfl_report_module(dwfl, name, 0, 0); + dwfl_report_end (dwfl, NULL, NULL); + dw = dwfl_module_getdwarf (mod, &bias); + Elf *elf = dwarf_getelf(dw); + ehdr = gelf_getehdr (elf, &ehdr_mem); + while ((scn = elf_nextscn(elf, scn))) + { + shdr = gelf_getshdr (scn, &shdr_mem); + if (strcmp(elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name), ".debug_frame") == 0) { + data = elf_rawdata(scn, NULL); + break; + } + } + + if (data == NULL) { + *len = 0; + dbug(2, "module %s returns NULL\n", name); + return NULL; + } + dbug(2, "module %s returns %d\n", name, (int)data->d_size); + *len = data->d_size; + return data->d_buf; +} + + /* Get the sections for a module. Put them in the supplied buffer */ /* in the following order: */ -/* [struct _stp_msg_module][struct _stp_symbol sections ...][string data]*/ +/* [struct _stp_msg_module][struct _stp_symbol sections ...][string data][unwind data] */ /* Return the total length of all the data. */ #define SECDIR "/sys/module/%s/sections" @@ -32,8 +77,9 @@ static int get_sections(char *name, char *data_start, int datalen) char filename[STP_MODULE_NAME_LEN + 256]; char buf[32], strdata_start[32768]; char *strdata=strdata_start, *data=data_start; - int fd, len, res; + int fd, len, res, unwind_data_len=0; struct _stp_msg_module *mod = (struct _stp_msg_module *)data_start; + struct dirent *d; DIR *secdir; void *sec; @@ -64,6 +110,10 @@ static int get_sections(char *name, char *data_start, int datalen) return -1; } + Dwfl *dwfl = dwfl_begin(&kernel_callbacks); + void *unwind_data = get_module_unwind_data (dwfl, name, &unwind_data_len); + mod->unwind_len = unwind_data_len; + while ((d = readdir(secdir))) { char *secname = d->d_name; @@ -139,12 +189,20 @@ static int get_sections(char *name, char *data_start, int datalen) while (len--) *data++ = *strdata++; + if (unwind_data) { + if ((unwind_data_len + data - data_start) > datalen) + goto err0; + memcpy(data, unwind_data, unwind_data_len); + data += unwind_data_len; + } + dwfl_end (dwfl); return data - data_start; err1: close(fd); closedir(secdir); err0: + dwfl_end (dwfl); /* if this happens, something went seriously wrong. */ _err("Unexpected error. Overflowed buffers.\n"); return -1; @@ -158,11 +216,9 @@ static int send_module (char *mname) { char data[65536]; int len; - *(int32_t *)data = STP_MODULE; - len = get_sections(mname, data + sizeof(int32_t), - sizeof(data) - sizeof(int32_t)); + len = get_sections(mname, data, sizeof(data)); if (len > 0) { - if (write(control_channel, data, len + sizeof(int32_t)) <= 0) { + if (send_data(STP_MODULE, data, len) < 0) { _err("Loading of module %s failed. Exiting...\n", mname); return -1; } @@ -195,7 +251,8 @@ int do_module (void *data) return 0; } - return send_module(mod->name); + send_module(mod->name); + return 0; } #define MAX_SYMBOLS 32*1024 @@ -214,7 +271,7 @@ int do_kernel_symbols(void) int ret, num_syms, i = 0, struct_symbol_size; int max_syms= MAX_SYMBOLS, data_basesize = MAX_SYMBOLS*32; - if (kernel_ptr_size == 8) + if (kernel_ptr_size == 8) struct_symbol_size = sizeof(struct _stp_symbol64); else struct_symbol_size = sizeof(struct _stp_symbol32); @@ -288,20 +345,33 @@ int do_kernel_symbols(void) if (num_syms <= 0) goto err; + /* get unwind data */ + int unwind_data_len; + void *unwind_data; + Dwfl *dwfl = dwfl_begin(&kernel_callbacks); + unwind_data = get_module_unwind_data (dwfl, "kernel", &unwind_data_len); + + /* send header */ struct _stp_msg_symbol_hdr smsh; smsh.num_syms = num_syms; smsh.sym_size = (uint32_t)(dataptr - data_base); + smsh.unwind_size = (uint32_t)unwind_data_len; if (send_request(STP_SYMBOLS, &smsh, sizeof(smsh)) <= 0) goto err; /* send syms */ - if (send_data(syms, num_syms*struct_symbol_size) < 0) + if (send_data(STP_SYMBOLS, syms, num_syms*struct_symbol_size) < 0) goto err; /* send data */ - if (send_data(data_base, dataptr-data_base) < 0) + if (send_data(STP_SYMBOLS, data_base, dataptr-data_base) < 0) + goto err; + + /* send unwind data */ + if (send_data(STP_SYMBOLS, unwind_data, unwind_data_len) < 0) goto err; + dwfl_end (dwfl); free(data_base); free(syms); -- cgit From 9d70c184dc98bea1dd892d34e7832faf08302aff Mon Sep 17 00:00:00 2001 From: hunt Date: Mon, 21 Jan 2008 18:54:05 +0000 Subject: Fix last checkin. --- runtime/staprun/symbols.c | 81 +++-------------------------------------------- 1 file changed, 4 insertions(+), 77 deletions(-) (limited to 'runtime') diff --git a/runtime/staprun/symbols.c b/runtime/staprun/symbols.c index cf0276ff..e33ee624 100644 --- a/runtime/staprun/symbols.c +++ b/runtime/staprun/symbols.c @@ -10,8 +10,6 @@ */ #include "staprun.h" -#include -#include /* send symbol data */ static int send_data(int32_t type, void *data, int len) @@ -21,53 +19,9 @@ static int send_data(int32_t type, void *data, int len) return write(control_channel, data, len); } -static char debuginfo_path_arr[] = "-:.debug:/usr/lib/debug"; -static char *debuginfo_path = debuginfo_path_arr; -static const Dwfl_Callbacks kernel_callbacks = -{ - .find_debuginfo = dwfl_standard_find_debuginfo, - .debuginfo_path = &debuginfo_path, - .find_elf = dwfl_linux_kernel_find_elf, - .section_address = dwfl_linux_kernel_module_section_address, -}; - -void *get_module_unwind_data(Dwfl *dwfl, const char *name, int *len) -{ - Dwarf_Addr bias = 0; - Dwarf *dw; - GElf_Ehdr *ehdr, ehdr_mem; - GElf_Shdr *shdr, shdr_mem; - Elf_Scn *scn = NULL; - Elf_Data *data = NULL; - - Dwfl_Module *mod = dwfl_report_module(dwfl, name, 0, 0); - dwfl_report_end (dwfl, NULL, NULL); - dw = dwfl_module_getdwarf (mod, &bias); - Elf *elf = dwarf_getelf(dw); - ehdr = gelf_getehdr (elf, &ehdr_mem); - while ((scn = elf_nextscn(elf, scn))) - { - shdr = gelf_getshdr (scn, &shdr_mem); - if (strcmp(elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name), ".debug_frame") == 0) { - data = elf_rawdata(scn, NULL); - break; - } - } - - if (data == NULL) { - *len = 0; - dbug(2, "module %s returns NULL\n", name); - return NULL; - } - dbug(2, "module %s returns %d\n", name, (int)data->d_size); - *len = data->d_size; - return data->d_buf; -} - - /* Get the sections for a module. Put them in the supplied buffer */ /* in the following order: */ -/* [struct _stp_msg_module][struct _stp_symbol sections ...][string data][unwind data] */ +/* [struct _stp_msg_module][struct _stp_symbol sections ...][string data]*/ /* Return the total length of all the data. */ #define SECDIR "/sys/module/%s/sections" @@ -77,9 +31,8 @@ static int get_sections(char *name, char *data_start, int datalen) char filename[STP_MODULE_NAME_LEN + 256]; char buf[32], strdata_start[32768]; char *strdata=strdata_start, *data=data_start; - int fd, len, res, unwind_data_len=0; + int fd, len, res; struct _stp_msg_module *mod = (struct _stp_msg_module *)data_start; - struct dirent *d; DIR *secdir; void *sec; @@ -110,10 +63,6 @@ static int get_sections(char *name, char *data_start, int datalen) return -1; } - Dwfl *dwfl = dwfl_begin(&kernel_callbacks); - void *unwind_data = get_module_unwind_data (dwfl, name, &unwind_data_len); - mod->unwind_len = unwind_data_len; - while ((d = readdir(secdir))) { char *secname = d->d_name; @@ -189,20 +138,12 @@ static int get_sections(char *name, char *data_start, int datalen) while (len--) *data++ = *strdata++; - if (unwind_data) { - if ((unwind_data_len + data - data_start) > datalen) - goto err0; - memcpy(data, unwind_data, unwind_data_len); - data += unwind_data_len; - } - dwfl_end (dwfl); return data - data_start; err1: close(fd); closedir(secdir); err0: - dwfl_end (dwfl); /* if this happens, something went seriously wrong. */ _err("Unexpected error. Overflowed buffers.\n"); return -1; @@ -251,8 +192,7 @@ int do_module (void *data) return 0; } - send_module(mod->name); - return 0; + return send_module(mod->name); } #define MAX_SYMBOLS 32*1024 @@ -271,7 +211,7 @@ int do_kernel_symbols(void) int ret, num_syms, i = 0, struct_symbol_size; int max_syms= MAX_SYMBOLS, data_basesize = MAX_SYMBOLS*32; - if (kernel_ptr_size == 8) + if (kernel_ptr_size == 8) struct_symbol_size = sizeof(struct _stp_symbol64); else struct_symbol_size = sizeof(struct _stp_symbol32); @@ -345,18 +285,10 @@ int do_kernel_symbols(void) if (num_syms <= 0) goto err; - /* get unwind data */ - int unwind_data_len; - void *unwind_data; - Dwfl *dwfl = dwfl_begin(&kernel_callbacks); - unwind_data = get_module_unwind_data (dwfl, "kernel", &unwind_data_len); - - /* send header */ struct _stp_msg_symbol_hdr smsh; smsh.num_syms = num_syms; smsh.sym_size = (uint32_t)(dataptr - data_base); - smsh.unwind_size = (uint32_t)unwind_data_len; if (send_request(STP_SYMBOLS, &smsh, sizeof(smsh)) <= 0) goto err; @@ -368,11 +300,6 @@ int do_kernel_symbols(void) if (send_data(STP_SYMBOLS, data_base, dataptr-data_base) < 0) goto err; - /* send unwind data */ - if (send_data(STP_SYMBOLS, unwind_data, unwind_data_len) < 0) - goto err; - dwfl_end (dwfl); - free(data_base); free(syms); fclose(kallsyms); -- cgit From 98c22a8eca4b79a0115e11bb1d917f9b4e0ed7fe Mon Sep 17 00:00:00 2001 From: kenistoj Date: Tue, 22 Jan 2008 17:35:24 +0000 Subject: * runtime/uprobes/uprobes.c: Fix from Srinivasa: Recast rcu_dereferences of engine->data to resync with kernel.org builds. --- runtime/uprobes/uprobes.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'runtime') diff --git a/runtime/uprobes/uprobes.c b/runtime/uprobes/uprobes.c index 005ca919..501c4298 100644 --- a/runtime/uprobes/uprobes.c +++ b/runtime/uprobes/uprobes.c @@ -1607,7 +1607,7 @@ static u32 uprobe_report_signal(struct utrace_attached_engine *engine, int hit_uretprobe_trampoline = 0; int registrations_deferred = 0; - utask = rcu_dereference((struct uprobe_task *)engine->data); + utask = (struct uprobe_task *)rcu_dereference(engine->data); BUG_ON(!utask); if (info->si_signo != BREAKPOINT_SIGNAL && @@ -1791,7 +1791,7 @@ static u32 uprobe_report_quiesce(struct utrace_attached_engine *engine, struct uprobe_task *utask; struct uprobe_process *uproc; - utask = rcu_dereference((struct uprobe_task *)engine->data); + utask = (struct uprobe_task *)rcu_dereference(engine->data); BUG_ON(!utask); uproc = utask->uproc; if (current == utask->quiesce_master) { @@ -1892,7 +1892,7 @@ static u32 uprobe_report_exit(struct utrace_attached_engine *engine, struct uprobe_probept *ppt; int utask_quiescing; - utask = rcu_dereference((struct uprobe_task *)engine->data); + utask = (struct uprobe_task *)rcu_dereference(engine->data); uproc = utask->uproc; uprobe_get_process(uproc); @@ -1971,7 +1971,7 @@ static u32 uprobe_report_clone(struct utrace_attached_engine *engine, struct uprobe_process *uproc; struct uprobe_task *ptask, *ctask; - ptask = rcu_dereference((struct uprobe_task *)engine->data); + ptask = (struct uprobe_task *)rcu_dereference(engine->data); uproc = ptask->uproc; /* @@ -2060,7 +2060,7 @@ static u32 uprobe_report_exec(struct utrace_attached_engine *engine, struct uprobe_task *utask; int uproc_freed; - utask = rcu_dereference((struct uprobe_task *)engine->data); + utask = (struct uprobe_task *)rcu_dereference(engine->data); uproc = utask->uproc; uprobe_get_process(uproc); -- cgit From 21587d3dca57c6af4684995576adcfe98f594b28 Mon Sep 17 00:00:00 2001 From: srinivasa Date: Thu, 24 Jan 2008 15:23:19 +0000 Subject: Autoconf file for x86/x86_64 for register rename patch by srinivasa@in.ibm.com --- runtime/autoconf-x86-uniregs.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 runtime/autoconf-x86-uniregs.c (limited to 'runtime') diff --git a/runtime/autoconf-x86-uniregs.c b/runtime/autoconf-x86-uniregs.c new file mode 100644 index 00000000..25729c22 --- /dev/null +++ b/runtime/autoconf-x86-uniregs.c @@ -0,0 +1,6 @@ +#include + +#if defined (__i386__) || defined (__x86_64__) +struct pt_regs regs = {.ax = 0x0}; +#endif + -- cgit From 37d728f025d436dac4081ff47b2d3125ac27ea82 Mon Sep 17 00:00:00 2001 From: srinivasa Date: Thu, 24 Jan 2008 15:24:31 +0000 Subject: Autoconf file for nameidata changes by srinivasa@in.ibm.com --- runtime/autoconf-nameidata.c | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 runtime/autoconf-nameidata.c (limited to 'runtime') diff --git a/runtime/autoconf-nameidata.c b/runtime/autoconf-nameidata.c new file mode 100644 index 00000000..c1d02400 --- /dev/null +++ b/runtime/autoconf-nameidata.c @@ -0,0 +1,4 @@ +#include + +struct nameidata nd __attribute__ ((unused)) = {.path={(void *)0}}; + -- cgit