Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
- struct kexec_segment __user *, segments, unsigned long, flags)
- {
- struct kexec_segment *ksegments;
- unsigned long result;
- result = kexec_load_check(nr_segments, flags);
- printk("%s kexec_load_check: %ld", __func__, result);
- if (result)
- return result;
- /* Verify we are on the appropriate architecture */
- printk("%s checking arch...", __func__);
- if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
- ((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH_DEFAULT))
- {
- printk("%s kexec invalid arch", __func__);
- return -EINVAL;}
- printk("%s calling memdup_user...", __func__);
- ksegments = memdup_user(segments, nr_segments * sizeof(ksegments[0]));
- if (IS_ERR(ksegments)) {
- printk("%s memdup_user error", __func__);
- return PTR_ERR(ksegments);
- }
- printk("%s performing load...", __func__);
- result = do_kexec_load(entry, nr_segments, ksegments, flags);
- printk("%s do_kexec_load: %ld", __func__, result);
- kfree(ksegments);
- printk("%s segments freed: %ld", __func__, result);
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement