Advertisement
Guest User

Untitled

a guest
Jul 1st, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.08 KB | Source Code | 0 0
  1. SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
  2.         struct kexec_segment __user *, segments, unsigned long, flags)
  3. {
  4.     struct kexec_segment *ksegments;
  5.     unsigned long result;
  6.  
  7.     result = kexec_load_check(nr_segments, flags);
  8.     printk("%s kexec_load_check: %ld", __func__, result);
  9.     if (result)
  10.         return result;
  11.  
  12.     /* Verify we are on the appropriate architecture */
  13.     printk("%s checking arch...", __func__);
  14.     if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
  15.         ((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH_DEFAULT))
  16.         {
  17.             printk("%s kexec invalid arch", __func__);
  18.         return -EINVAL;}
  19.  
  20.     printk("%s calling memdup_user...", __func__);
  21.     ksegments = memdup_user(segments, nr_segments * sizeof(ksegments[0]));
  22.     if (IS_ERR(ksegments)) {
  23.         printk("%s memdup_user error", __func__);
  24.         return PTR_ERR(ksegments);
  25.     }
  26.  
  27.     printk("%s performing load...", __func__);
  28.     result = do_kexec_load(entry, nr_segments, ksegments, flags);
  29.     printk("%s do_kexec_load: %ld", __func__, result);
  30.     kfree(ksegments);
  31.     printk("%s segments freed: %ld", __func__, result);
  32.     return result;
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement