示例#1
0
static int __init patch_init(void)
{
	struct kpatch_patch *patches;
	int i, ret;

	patches = (struct kpatch_patch *)&__kpatch_patches;

	kpmod.mod = THIS_MODULE;
	kpmod.num_funcs = (&__kpatch_patches_end - &__kpatch_patches) /
			  sizeof(*patches);
	kpmod.funcs = kmalloc(kpmod.num_funcs * sizeof(struct kpatch_func),
			      GFP_KERNEL);
	if (!kpmod.funcs)
		return -ENOMEM;

	for (i = 0; i < kpmod.num_funcs; i++) {
		kpmod.funcs[i].old_addr = patches[i].old_addr;
		kpmod.funcs[i].old_size = patches[i].old_size;
		kpmod.funcs[i].new_addr = patches[i].new_addr;
		kpmod.funcs[i].new_size = patches[i].new_size;
	}

	ret = kpatch_register(&kpmod);
	if (ret)
		goto err_free;

	return 0;

err_free:
	kfree(kpmod.funcs);
	return ret;
}
示例#2
0
static int __init patch_init(void)
{
	struct kpatch_patch *patches;
	int i;

	patches = (struct kpatch_patch *)&__kpatch_patches;
	num_funcs = (&__kpatch_patches_end - &__kpatch_patches) /
		    sizeof(*patches);
	funcs = kmalloc(num_funcs * sizeof(*funcs), GFP_KERNEL);
	if (!funcs)
		return -ENOMEM;

	for (i = 0; i < num_funcs; i++) {
		funcs[i].old_addr = patches[i].old_addr;
		funcs[i].old_size = patches[i].old_size;
		funcs[i].new_addr = patches[i].new_addr;
	}

	return kpatch_register(THIS_MODULE, funcs, num_funcs);
}