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