blob: 3338471afa6ab41b8e2f4f1341ecc1a13cb06d2f [file] [log] [blame]
/*
*sec_debug_test.c
*
* Copyright (c) 2016 Samsung Electronics Co., Ltd
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/cpu.h>
#include <linux/io.h>
#include <linux/slab.h>
#include <asm/cacheflush.h>
#include <soc/samsung/exynos-pmu.h>
typedef void (*force_modify_func)(char *arg);
static const unsigned long tima_rodata = 0xAA55AA55;
static void test_MODIFY_KERNEL(char *arg);
enum {
FORCE_WRITE_RO = 0, /* WRITE RODATA */
NR_FORCE_MODIFY,
};
struct force_modify_item {
char errname[SZ_32];
force_modify_func errfunc;
};
struct force_modify {
struct force_modify_item item[NR_FORCE_MODIFY];
};
struct force_modify force_modify_vector = {
.item = {
{"modifykern", &test_MODIFY_KERNEL},
}
};
static void test_MODIFY_KERNEL(char *arg)
{
unsigned long *ptr = (unsigned long *)&tima_rodata;
pr_info("%s()\n", __func__);
set_memory_rw((unsigned long)ptr, 1);
*ptr ^= 0xabcd1234;
set_memory_ro((unsigned long)ptr, 1);
}
int tima_debug_modify_kernel(const char *val, struct kernel_param *kp)
{
int i;
char *temp;
char *ptr;
for (i = 0; i < NR_FORCE_MODIFY; i++)
if (!strncmp(val, force_modify_vector.item[i].errname,
strlen(force_modify_vector.item[i].errname))) {
temp = (char *)val;
ptr = strsep(&temp, " "); /* ignore the first token */
ptr = strsep(&temp, " "); /* take the second token */
force_modify_vector.item[i].errfunc(ptr);
}
return 0;
}
EXPORT_SYMBOL(tima_debug_modify_kernel);