110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file daemon/opd_kernel.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Dealing with the kernel and kernel module samples 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Modified by Aravind Menon for Xen 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * These modifications are: 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Copyright (C) 2005 Hewlett-Packard Co. 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_kernel.h" 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_sfile.h" 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_trans.h" 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_printf.h" 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_stats.h" 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "oprofiled.h" 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_fileio.h" 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_config.h" 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h" 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h> 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h> 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <errno.h> 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <assert.h> 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic LIST_HEAD(modules); 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct kernel_image vmlinux_image; 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct kernel_image xen_image; 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_create_vmlinux(char const * name, char const * arg) 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* vmlinux is *not* on the list of modules */ 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_init(&vmlinux_image.list); 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* for no vmlinux */ 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (no_vmlinux) { 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmlinux_image.name = "no-vmlinux"; 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmlinux_image.name = xstrdup(name); 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sscanf(arg, "%llx,%llx", &vmlinux_image.start, &vmlinux_image.end); 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project verbprintf(vmisc, "kernel_start = %llx, kernel_end = %llx\n", 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmlinux_image.start, vmlinux_image.end); 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!vmlinux_image.start && !vmlinux_image.end) { 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "error: mis-parsed kernel range: %llx-%llx\n", 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project vmlinux_image.start, vmlinux_image.end); 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_create_xen(char const * name, char const * arg) 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* xen is *not* on the list of modules */ 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_init(&xen_image.list); 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* for no xen */ 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (no_xen) { 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project xen_image.name = "no-xen"; 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project xen_image.name = xstrdup(name); 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sscanf(arg, "%llx,%llx", &xen_image.start, &xen_image.end); 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project verbprintf(vmisc, "xen_start = %llx, xen_end = %llx\n", 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project xen_image.start, xen_image.end); 7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!xen_image.start && !xen_image.end) { 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "error: mis-parsed xen range: %llx-%llx\n", 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project xen_image.start, xen_image.end); 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Allocate and initialise a kernel image description 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param name image name 9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param start start address 9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param end end address 9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct kernel_image * 9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectopd_create_module(char const * name, vma_t start, vma_t end) 9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct kernel_image * image = xmalloc(sizeof(struct kernel_image)); 9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image->name = xstrdup(name); 10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image->start = start; 10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image->end = end; 10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_add(&image->list, &modules); 10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return image; 10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Clear and free all kernel image information and reset 11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * values. 11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void opd_clear_modules(void) 11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos2; 11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct kernel_image * image; 11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each_safe(pos, pos2, &modules) { 11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image = list_entry(pos, struct kernel_image, list); 12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (image->name) 12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(image->name); 12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(image); 12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_init(&modules); 12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* clear out lingering references */ 12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sfile_clear_kernel(); 12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 13010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 13110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 13210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* 13310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * each line is in the format: 13410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 13510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * module_name 16480 1 dependencies Live 0xe091e000 13610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 13710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * without any blank space in each field 13810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 13910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_reread_module_info(void) 14010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 14110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp; 14210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * line; 14310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct kernel_image * image; 14410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int module_size; 14510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char ref_count[32+1]; 14610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int ret; 14710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char module_name[256+1]; 14810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char live_info[32+1]; 14910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char dependencies[4096+1]; 15010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project unsigned long long start_address; 15110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (no_vmlinux) 15310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 15410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_clear_modules(); 15610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Reading module info.\n"); 15810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fp = op_try_open_file("/proc/modules", "r"); 16010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!fp) { 16210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("oprofiled: /proc/modules not readable, " 16310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "can't process module samples.\n"); 16410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return; 16510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 16610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (1) { 16810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line = op_get_line(fp); 16910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!line) 17110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 17210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (line[0] == '\0') { 17410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 17510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; 17610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 17710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ret = sscanf(line, "%256s %u %32s %4096s %32s %llx", 17910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project module_name, &module_size, ref_count, 18010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dependencies, live_info, &start_address); 18110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (ret != 6) { 18210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("bad /proc/modules entry: %s\n", line); 18310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 18410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; 18510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 18610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 18710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image = opd_create_module(module_name, start_address, 18810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project start_address + module_size); 18910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project verbprintf(vmodule, "module %s start %llx end %llx\n", 19110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image->name, image->start, image->end); 19210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(line); 19410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 19510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project op_close_file(fp); 19710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 19810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 20110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * find a kernel image by PC value 20210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @param trans holds PC value to look up 20310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 20410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * find the kernel image which contains this PC. 20510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 20610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Return %NULL if not found. 20710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 20810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct kernel_image * find_kernel_image(struct transient const * trans) 20910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 21010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct list_head * pos; 21110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct kernel_image * image = &vmlinux_image; 21210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (no_vmlinux) 21410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return image; 21510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (image->start <= trans->pc && image->end > trans->pc) 21710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return image; 21810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project list_for_each(pos, &modules) { 22010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project image = list_entry(pos, struct kernel_image, list); 22110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (image->start <= trans->pc && image->end > trans->pc) 22210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return image; 22310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 22410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (xen_image.start <= trans->pc && xen_image.end > trans->pc) 22610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return &xen_image; 22710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return NULL; 22910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 230