Platform:ARM A9
Linux:3.0.8
Notes:
1)Android4.0.x external support oprofile,after android compile successfully,it will generate opcontrol (oprofile CLI) and oprofiled(daemon)
2)cross-compile oprofile with static link which generate opreport for Target platform for analysis oprofile report
Porting Guide:
1)
--- /work/kernel/drivers/oprofile/timer_int.c 2013-02-26 11:08:04.712305138 +0800
+++ drivers/oprofile/timer_int.c 2013-06-08 10:07:54.743559350 +0800
@@ -97,6 +97,50 @@
.notifier_call = oprofile_cpu_notify,
};
+#ifndef OP_COUNTER_H
+#define OP_COUNTER_H
+
+/* Per performance monitor configuration as set via
+ * oprofilefs.
+ */
+struct op_counter_config {
+ unsigned long count ;
+ unsigned long enabled;
+ unsigned long event;
+ unsigned long unit_mask;
+ unsigned long kernel;
+ unsigned long user;
+};
+
+#endif /* OP_COUNTER_H */
+
+struct op_counter_config dummy_config = {.count = 4};
+
+static int op_create_files(struct super_block *sb, struct dentry *root)
+{
+ unsigned int i;
+
+ for (i = 0; i < 1; i++) {
+ struct dentry *dir;
+ char buf[4];
+
+ snprintf(buf, sizeof buf, "%d", i);
+ dir = oprofilefs_mkdir(sb, root, buf);
+ oprofilefs_create_ulong(sb, dir, "enabled",
+ &dummy_config.enabled);
+ oprofilefs_create_ulong(sb, dir, "event", &dummy_config.event);
+ oprofilefs_create_ulong(sb, dir, "count", &dummy_config.count);
+ oprofilefs_create_ulong(sb, dir, "unit_mask",
+ &dummy_config.unit_mask);
+ oprofilefs_create_ulong(sb, dir, "kernel",
+ &dummy_config.kernel);
+ oprofilefs_create_ulong(sb, dir, "user", &dummy_config.user);
+ }
+
+ return 0;
+}
+
+
int oprofile_timer_init(struct oprofile_operations *ops)
{
int rc;
@@ -104,12 +148,13 @@
rc = register_hotcpu_notifier(&oprofile_cpu_notifier);
if (rc)
return rc;
- ops->create_files = NULL;
+ ops->create_files = op_create_files;
ops->setup = NULL;
ops->shutdown = NULL;
ops->start = oprofile_hrtimer_start;
ops->stop = oprofile_hrtimer_stop;
ops->cpu_type = "timer";
+ printk(KERN_INFO "oprofile: using timer interrupt.\n");
return 0;
}
2)
--- /work/kernel/drivers/oprofile/oprof.c 2013-02-26 11:08:04.712305138 +0800
+++ drivers/oprofile/oprof.c 2013-06-04 16:10:29.862179338 +0800
@@ -33,7 +33,8 @@
0 - use performance monitoring hardware if available
1 - use the timer int mechanism regardless
*/
-static int timer = 0;
+/* static int timer = 0; */
+static int timer = 1;
int oprofile_setup(void)
{
3)Kernel OPROFILE support
CONFIG_PROFILING=y
CONFIG_OPROFILE=y
CONFIG_HAVE_OPROFILE=y
4)copy vmlinux to /system/xxx/ and helloworld.ko to target
5)in Target platform,./start_oprofile.sh
#!/system/bin/sh
#.oprofile directory
mount -o remount,rw system /system
if [ ! -d "/dev/oprofile" ]; then
cd /dev
mkdir oprofile
cd /
mount -t oprofilefs nodev /dev/oprofile
fi
#helloworld symbolic for opreport
if [ ! -h "/helloworld" ]; then
mount -o remount,rw rootfs /
cd /system/xxx/
busybox ln -s /system/xxx/helloworld.ko /helloworld
fi
KERNEL_BEG=`busybox grep " _stext" /proc/kallsyms | busybox awk '{print $1}'`
KERNEL_END=`busybox grep " _etext" /proc/kallsyms | busybox awk '{print $1}'`
chmod 777 /system/oprofile/bin/
echo 16 > /dev/oprofile/backtrace_depth
opcontrol --shutdown
opcontrol --reset
opcontrol --setup
opcontrol --vmlinux=/system/xxx/vmlinux --callgraph=16 --kernel-range=0x$KERNEL_BEG,0x$KERNEL_END --event=CPU_CYCLES:10000::1:0
opcontrol --start
6)insmod helloworld.ko
7)sleep 180s,use app to acces driver ,samples directory should exist {kern}/helloworld directory
8)opcontrol --stop
9) ./opreport image:/helloworld --session-dir=/data/oprofile/ -g -d -l --output-file /system/xxx/report.txt