From: John L. <mov...@us...> - 2002-06-18 03:24:50
|
Update of /cvsroot/oprofile/oprofile/dae In directory usw-pr-cvs1:/tmp/cvs-serv32116/dae Modified Files: opd_kernel.c opd_kernel.h opd_proc.c oprofiled.c Log Message: Drop our requirement for System.map : use vmlinux instead. Index: opd_kernel.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/opd_kernel.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- opd_kernel.c 7 Jun 2002 00:41:02 -0000 1.15 +++ opd_kernel.c 18 Jun 2002 03:24:46 -0000 1.16 @@ -39,7 +39,7 @@ extern struct opd_image * kernel_image; /* kernel and module support */ -u32 kernel_start; +static u32 kernel_start; static u32 kernel_end; static struct opd_module opd_modules[OPD_MAX_MODULES]; static unsigned int nr_modules=0; @@ -53,55 +53,19 @@ kernel_image = opd_create_image(vmlinux); } - /** - * opd_read_system_map - parse System.map file - * @param filename file name of System.map - * - * Parse the kernel's System.map file. If the filename is - * passed as "", a warning is produced and the function returns. - * - * If the file is parsed correctly, the global variables - * kernel_start and kernel_end are set to the correct values for the - * text section of the mainline kernel else kernel_start is set to - * KERNEL_VMA_OFFSET and kernel_end to infinite - * - * Note that kernel modules will have EIP values above the value of - * kernel_end. + * opd_parse_kernel_range - parse the kernel range values */ -void opd_read_system_map(char const * filename) +void opd_parse_kernel_range(char const * arg) { - FILE * fp; - char * line; - char * cp; - - fp = op_open_file(filename, "r"); + sscanf(arg, "%x,%x", &kernel_start, &kernel_end); - while (1) { - line = op_get_line(fp); - if (!strcmp(line, "")) { - free(line); - break; - } else { - if (strlen(line) < 11) { - free(line); - continue; - } - cp = line+11; - if (!strcmp("_text", cp)) - sscanf(line, "%x", &kernel_start); - else if (!strcmp("_end", cp)) - sscanf(line, "%x", &kernel_end); - free(line); - } + if (kernel_start == 0x0 || kernel_end == 0x0) { + fprintf(stderr, + "Warning: mis-parsed kernel range: %x-%x\n", + kernel_start, kernel_end); + fprintf(stderr, "kernel profiles will be wrong.\n"); } - - if (!kernel_start) - kernel_start = KERNEL_VMA_OFFSET; - if (!kernel_end) - kernel_end = (u32)-1; - - op_close_file(fp); } /** @@ -411,9 +375,6 @@ * * Handle a sample in kernel address space or in a module. The sample is * output to the relevant image file. - * - * This function requires the global variable kernel_end to be known - * through the System.map to handle module samples. */ void opd_handle_kernel_sample(u32 eip, u16 count) { @@ -426,3 +387,16 @@ /* in a module */ opd_handle_module_sample(eip, count); } + +/** + * opd_eip_is_kernel - is the sample from kernel/module space + * @param eip EIP value + * + * Returns %1 if @eip is in the address space starting at + * kernel_start, %0 otherwise. + */ +int opd_eip_is_kernel(u32 eip) +{ + return (eip >= kernel_start); +} + Index: opd_kernel.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/opd_kernel.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- opd_kernel.h 6 Jun 2002 16:18:11 -0000 1.2 +++ opd_kernel.h 18 Jun 2002 03:24:46 -0000 1.3 @@ -15,8 +15,9 @@ #include "op_types.h" void opd_init_kernel_image(void); -void opd_read_system_map(char const * filename); +void opd_parse_kernel_range(char const * arg); void opd_clear_module_info(void); void opd_handle_kernel_sample(u32 eip, u16 count); +int opd_eip_is_kernel(u32 eip); #endif /* OPD_KERNEL_H */ Index: opd_proc.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/opd_proc.c,v retrieving revision 1.123 retrieving revision 1.124 diff -u -d -r1.123 -r1.124 --- opd_proc.c 15 Jun 2002 18:52:06 -0000 1.123 +++ opd_proc.c 18 Jun 2002 03:24:46 -0000 1.124 @@ -308,19 +308,6 @@ /** - * opd_eip_is_kernel - is the sample from kernel/module space - * @param eip EIP value - * - * Returns %1 if @eip is in the address space starting at - * kernel_start, %0 otherwise. - */ -inline static int opd_eip_is_kernel(u32 eip) -{ - extern u32 kernel_start; - return (eip >= kernel_start); -} - -/** * opd_put_sample - process a sample * @param sample sample to process * Index: oprofiled.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/oprofiled.c,v retrieving revision 1.85 retrieving revision 1.86 diff -u -d -r1.85 -r1.86 --- oprofiled.c 15 Jun 2002 20:13:17 -0000 1.85 +++ oprofiled.c 18 Jun 2002 03:24:46 -0000 1.86 @@ -58,7 +58,7 @@ int kernel_only; unsigned long opd_stats[OPD_MAX_STATS] = { 0, }; - +static char * kernel_range; static int showvers; static u32 ctr_enabled[OP_MAX_COUNTERS]; /* Unfortunately popt does not have, on many versions, the POPT_ARG_DOUBLE type @@ -66,7 +66,6 @@ static char const * cpu_speed_str; static int opd_buf_size=OP_DEFAULT_BUF_SIZE; static int opd_note_buf_size=OP_DEFAULT_NOTE_SIZE; -static char * systemmapfilename; static pid_t mypid; static pid_t pid_filter; static pid_t pgrp_filter; @@ -80,7 +79,7 @@ static struct poptOption options[] = { { "pid-filter", 0, POPT_ARG_INT, &pid_filter, 0, "only profile the given process ID", "pid" }, { "pgrp-filter", 0, POPT_ARG_INT, &pgrp_filter, 0, "only profile the given process group", "pgrp" }, - { "map-file", 'f', POPT_ARG_STRING, &systemmapfilename, 0, "System.map for running kernel file", "file", }, + { "kernel-range", 'r', POPT_ARG_STRING, &kernel_range, 0, "Kernel VMA range", "start-end", }, { "vmlinux", 'k', POPT_ARG_STRING, &vmlinux, 0, "vmlinux kernel image", "file", }, { "cpu-speed", 0, POPT_ARG_STRING, &cpu_speed_str, 0, "cpu speed (MHz)", "cpu_mhz", }, { "separate-samples", 0, POPT_ARG_INT, &separate_samples, 0, "separate samples for each distinct application", "[0|1]", }, @@ -115,8 +114,7 @@ * op_open_files - open necessary files * * Open the device files and the log file, - * and mmap() the hash map. Also read the System.map - * file. + * and mmap() the hash map. */ static void op_open_files(void) { @@ -162,7 +160,6 @@ opd_open_logfile(); - opd_read_system_map(systemmapfilename); printf("oprofiled started %s", op_get_time()); fflush(stdout); } @@ -380,8 +377,8 @@ exit(EXIT_FAILURE); } - if (!systemmapfilename || !strcmp("", systemmapfilename)) { - fprintf(stderr, "oprofiled: no System.map specified.\n"); + if (!kernel_range || !strcmp("", kernel_range)) { + fprintf(stderr, "oprofiled: no kernel VMA range specified.\n"); poptPrintHelp(optcon, stderr, 0); exit(EXIT_FAILURE); } @@ -399,6 +396,7 @@ if (cpu_speed_str && strlen(cpu_speed_str)) sscanf(cpu_speed_str, "%lf", &cpu_speed); + opd_parse_kernel_range(kernel_range); poptFreeContext(optcon); } |