1  /*
2   * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
3   *
4   */
5  
6  #include <xen/cpu.h>
7  #include <xen/elf.h>
8  #include <xen/err.h>
9  #include <xen/guest_access.h>
10  #include <xen/keyhandler.h>
11  #include <xen/lib.h>
12  #include <xen/list.h>
13  #include <xen/mm.h>
14  #include <xen/sched.h>
15  #include <xen/smp.h>
16  #include <xen/softirq.h>
17  #include <xen/spinlock.h>
18  #include <xen/string.h>
19  #include <xen/symbols.h>
20  #include <xen/version.h>
21  #include <xen/virtual_region.h>
22  #include <xen/vmap.h>
23  #include <xen/wait.h>
24  #include <xen/livepatch_elf.h>
25  #include <xen/livepatch.h>
26  #include <xen/livepatch_payload.h>
27  
28  #include <asm/alternative.h>
29  #include <asm/event.h>
30  
31  /*
32   * Protects against payload_list operations and also allows only one
33   * caller in schedule_work.
34   */
35  static DEFINE_SPINLOCK(payload_lock);
36  static LIST_HEAD(payload_list);
37  
38  /*
39   * Patches which have been applied. Need RCU in case we crash (and then
40   * traps code would iterate via applied_list) when adding entries onthe list.
41   */
42  static DEFINE_RCU_READ_LOCK(rcu_applied_lock);
43  static LIST_HEAD(applied_list);
44  
45  static unsigned int payload_cnt;
46  static unsigned int payload_version = 1;
47  
48  /* To contain the ELF Note header. */
49  struct livepatch_build_id {
50     const void *p;
51     unsigned int len;
52  };
53  
54  struct payload {
55      uint32_t state;                      /* One of the LIVEPATCH_STATE_*. */
56      int32_t rc;                          /* 0 or -XEN_EXX. */
57      bool reverted;                       /* Whether it was reverted. */
58      bool safe_to_reapply;                /* Can apply safely after revert. */
59      struct list_head list;               /* Linked to 'payload_list'. */
60      const void *text_addr;               /* Virtual address of .text. */
61      size_t text_size;                    /* .. and its size. */
62      const void *rw_addr;                 /* Virtual address of .data. */
63      size_t rw_size;                      /* .. and its size (if any). */
64      const void *ro_addr;                 /* Virtual address of .rodata. */
65      size_t ro_size;                      /* .. and its size (if any). */
66      unsigned int pages;                  /* Total pages for [text,rw,ro]_addr */
67      struct list_head applied_list;       /* Linked to 'applied_list'. */
68      struct livepatch_func *funcs;        /* The array of functions to patch. */
69      unsigned int nfuncs;                 /* Nr of functions to patch. */
70      const struct livepatch_symbol *symtab; /* All symbols. */
71      const char *strtab;                  /* Pointer to .strtab. */
72      struct virtual_region region;        /* symbol, bug.frame patching and
73                                              exception table (x86). */
74      unsigned int nsyms;                  /* Nr of entries in .strtab and symbols. */
75      struct livepatch_build_id id;        /* ELFNOTE_DESC(.note.gnu.build-id) of the payload. */
76      struct livepatch_build_id dep;       /* ELFNOTE_DESC(.livepatch.depends). */
77      livepatch_loadcall_t *const *load_funcs;   /* The array of funcs to call after */
78      livepatch_unloadcall_t *const *unload_funcs;/* load and unload of the payload. */
79      unsigned int n_load_funcs;           /* Nr of the funcs to load and execute. */
80      unsigned int n_unload_funcs;         /* Nr of funcs to call durung unload. */
81      char name[XEN_LIVEPATCH_NAME_SIZE];  /* Name of it. */
82  };
83  
84  /* Defines an outstanding patching action. */
85  struct livepatch_work
86  {
87      atomic_t semaphore;          /* Used to rendezvous CPUs in
88                                      check_for_livepatch_work. */
89      uint32_t timeout;            /* Timeout to do the operation. */
90      struct payload *data;        /* The payload on which to act. */
91      volatile bool_t do_work;     /* Signals work to do. */
92      volatile bool_t ready;       /* Signals all CPUs synchronized. */
93      unsigned int cmd;            /* Action request: LIVEPATCH_ACTION_* */
94  };
95  
96  /* There can be only one outstanding patching action. */
97  static struct livepatch_work livepatch_work;
98  
99  /*
100   * Indicate whether the CPU needs to consult livepatch_work structure.
101   * We want an per-cpu data structure otherwise the check_for_livepatch_work
102   * would hammer a global livepatch_work structure on every guest VMEXIT.
103   * Having an per-cpu lessens the load.
104   */
105  static DEFINE_PER_CPU(bool_t, work_to_do);
106  
get_name(const struct xen_livepatch_name * name,char * n)107  static int get_name(const struct xen_livepatch_name *name, char *n)
108  {
109      if ( !name->size || name->size > XEN_LIVEPATCH_NAME_SIZE )
110          return -EINVAL;
111  
112      if ( name->pad[0] || name->pad[1] || name->pad[2] )
113          return -EINVAL;
114  
115      if ( copy_from_guest(n, name->name, name->size) )
116          return -EFAULT;
117  
118      if ( n[name->size - 1] )
119          return -EINVAL;
120  
121      return 0;
122  }
123  
verify_payload(const struct xen_sysctl_livepatch_upload * upload,char * n)124  static int verify_payload(const struct xen_sysctl_livepatch_upload *upload, char *n)
125  {
126      if ( get_name(&upload->name, n) )
127          return -EINVAL;
128  
129      if ( !upload->size )
130          return -EINVAL;
131  
132      if ( upload->size > LIVEPATCH_MAX_SIZE )
133          return -EINVAL;
134  
135      if ( !guest_handle_okay(upload->payload, upload->size) )
136          return -EFAULT;
137  
138      return 0;
139  }
140  
is_patch(const void * ptr)141  bool_t is_patch(const void *ptr)
142  {
143      const struct payload *data;
144      bool_t r = 0;
145  
146      /*
147       * Only RCU locking since this list is only ever changed during apply
148       * or revert context. And in case it dies there we need an safe list.
149       */
150      rcu_read_lock(&rcu_applied_lock);
151      list_for_each_entry_rcu ( data, &applied_list, applied_list )
152      {
153          if ( (ptr >= data->rw_addr &&
154                ptr < (data->rw_addr + data->rw_size)) ||
155               (ptr >= data->ro_addr &&
156                ptr < (data->ro_addr + data->ro_size)) ||
157               (ptr >= data->text_addr &&
158                ptr < (data->text_addr + data->text_size)) )
159          {
160              r = 1;
161              break;
162          }
163  
164      }
165      rcu_read_unlock(&rcu_applied_lock);
166  
167      return r;
168  }
169  
livepatch_symbols_lookup_by_name(const char * symname)170  unsigned long livepatch_symbols_lookup_by_name(const char *symname)
171  {
172      const struct payload *data;
173  
174      ASSERT(spin_is_locked(&payload_lock));
175      list_for_each_entry ( data, &payload_list, list )
176      {
177          unsigned int i;
178  
179          for ( i = 0; i < data->nsyms; i++ )
180          {
181              if ( !data->symtab[i].new_symbol )
182                  continue;
183  
184              if ( !strcmp(data->symtab[i].name, symname) )
185                  return data->symtab[i].value;
186          }
187      }
188  
189      return 0;
190  }
191  
livepatch_symbols_lookup(unsigned long addr,unsigned long * symbolsize,unsigned long * offset,char * namebuf)192  static const char *livepatch_symbols_lookup(unsigned long addr,
193                                              unsigned long *symbolsize,
194                                              unsigned long *offset,
195                                              char *namebuf)
196  {
197      const struct payload *data;
198      unsigned int i, best;
199      const void *va = (const void *)addr;
200      const char *n = NULL;
201  
202      /*
203       * Only RCU locking since this list is only ever changed during apply
204       * or revert context. And in case it dies there we need an safe list.
205       */
206      rcu_read_lock(&rcu_applied_lock);
207      list_for_each_entry_rcu ( data, &applied_list, applied_list )
208      {
209          if ( va < data->text_addr ||
210               va >= (data->text_addr + data->text_size) )
211              continue;
212  
213          best = UINT_MAX;
214  
215          for ( i = 0; i < data->nsyms; i++ )
216          {
217              if ( data->symtab[i].value <= addr &&
218                   (best == UINT_MAX ||
219                    data->symtab[best].value < data->symtab[i].value) )
220                  best = i;
221          }
222  
223          if ( best == UINT_MAX )
224              break;
225  
226          if ( symbolsize )
227              *symbolsize = data->symtab[best].size;
228          if ( offset )
229              *offset = addr - data->symtab[best].value;
230          if ( namebuf )
231              strlcpy(namebuf, data->name, KSYM_NAME_LEN);
232  
233          n = data->symtab[best].name;
234          break;
235      }
236      rcu_read_unlock(&rcu_applied_lock);
237  
238      return n;
239  }
240  
241  /* Lookup function's old address if not already resolved. */
resolve_old_address(struct livepatch_func * f,const struct livepatch_elf * elf)242  static int resolve_old_address(struct livepatch_func *f,
243                                 const struct livepatch_elf *elf)
244  {
245      if ( f->old_addr )
246          return 0;
247  
248      f->old_addr = (void *)symbols_lookup_by_name(f->name);
249      if ( !f->old_addr )
250      {
251          f->old_addr = (void *)livepatch_symbols_lookup_by_name(f->name);
252          if ( !f->old_addr )
253          {
254              dprintk(XENLOG_ERR, LIVEPATCH "%s: Could not resolve old address of %s\n",
255                      elf->name, f->name);
256              return -ENOENT;
257          }
258      }
259      dprintk(XENLOG_DEBUG, LIVEPATCH "%s: Resolved old address %s => %p\n",
260              elf->name, f->name, f->old_addr);
261  
262      return 0;
263  }
264  
find_payload(const char * name)265  static struct payload *find_payload(const char *name)
266  {
267      struct payload *data, *found = NULL;
268  
269      ASSERT(spin_is_locked(&payload_lock));
270      list_for_each_entry ( data, &payload_list, list )
271      {
272          if ( !strcmp(data->name, name) )
273          {
274              found = data;
275              break;
276          }
277      }
278  
279      return found;
280  }
281  
282  /*
283   * Functions related to XEN_SYSCTL_LIVEPATCH_UPLOAD (see livepatch_upload), and
284   * freeing payload (XEN_SYSCTL_LIVEPATCH_ACTION:LIVEPATCH_ACTION_UNLOAD).
285   */
286  
free_payload_data(struct payload * payload)287  static void free_payload_data(struct payload *payload)
288  {
289      /* Set to zero until "move_payload". */
290      if ( !payload->pages )
291          return;
292  
293      vfree((void *)payload->text_addr);
294  
295      payload->pages = 0;
296  }
297  
298  /*
299  * calc_section computes the size (taking into account section alignment).
300  *
301  * Furthermore the offset is set with the offset from the start of the virtual
302  * address space for the payload (using passed in size). This is used in
303  * move_payload to figure out the destination location (load_addr).
304  */
calc_section(const struct livepatch_elf_sec * sec,size_t * size,unsigned int * offset)305  static void calc_section(const struct livepatch_elf_sec *sec, size_t *size,
306                           unsigned int *offset)
307  {
308      const Elf_Shdr *s = sec->sec;
309      size_t align_size;
310  
311      align_size = ROUNDUP(*size, s->sh_addralign);
312      *offset = align_size;
313      *size = s->sh_size + align_size;
314  }
315  
move_payload(struct payload * payload,struct livepatch_elf * elf)316  static int move_payload(struct payload *payload, struct livepatch_elf *elf)
317  {
318      void *text_buf, *ro_buf, *rw_buf;
319      unsigned int i, rw_buf_sec, rw_buf_cnt = 0;
320      size_t size = 0;
321      unsigned int *offset;
322      int rc = 0;
323  
324      offset = xmalloc_array(unsigned int, elf->hdr->e_shnum);
325      if ( !offset )
326          return -ENOMEM;
327  
328      /* Compute size of different regions. */
329      for ( i = 1; i < elf->hdr->e_shnum; i++ )
330      {
331          /*
332           * Do nothing. These are .rel.text, rel.*, .symtab, .strtab,
333           * and .shstrtab. For the non-relocate we allocate and copy these
334           * via other means - and the .rel we can ignore as we only use it
335           * once during loading.
336           *
337           * Also ignore sections with zero size. Those can be for example:
338           * data, or .bss.
339           */
340          if ( livepatch_elf_ignore_section(elf->sec[i].sec) )
341              offset[i] = UINT_MAX;
342          else if ( (elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
343                     !(elf->sec[i].sec->sh_flags & SHF_WRITE) )
344              calc_section(&elf->sec[i], &payload->text_size, &offset[i]);
345          else if ( !(elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
346                    (elf->sec[i].sec->sh_flags & SHF_WRITE) )
347              calc_section(&elf->sec[i], &payload->rw_size, &offset[i]);
348          else if ( !(elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
349                    !(elf->sec[i].sec->sh_flags & SHF_WRITE) )
350              calc_section(&elf->sec[i], &payload->ro_size, &offset[i]);
351          else
352          {
353              dprintk(XENLOG_DEBUG, LIVEPATCH "%s: Not supporting %s section!\n",
354                      elf->name, elf->sec[i].name);
355              rc = -EOPNOTSUPP;
356              goto out;
357          }
358      }
359  
360      /*
361       * Total of all three regions - RX, RW, and RO. We have to have
362       * keep them in seperate pages so we PAGE_ALIGN the RX and RW to have
363       * them on seperate pages. The last one will by default fall on its
364       * own page.
365       */
366      size = PAGE_ALIGN(payload->text_size) + PAGE_ALIGN(payload->rw_size) +
367                        payload->ro_size;
368  
369      size = PFN_UP(size); /* Nr of pages. */
370      text_buf = vmalloc_xen(size * PAGE_SIZE);
371      if ( !text_buf )
372      {
373          dprintk(XENLOG_ERR, LIVEPATCH "%s: Could not allocate memory for payload!\n",
374                  elf->name);
375          rc = -ENOMEM;
376          goto out;
377      }
378      rw_buf = text_buf + PAGE_ALIGN(payload->text_size);
379      ro_buf = rw_buf + PAGE_ALIGN(payload->rw_size);
380  
381      payload->pages = size;
382      payload->text_addr = text_buf;
383      payload->rw_addr = rw_buf;
384      payload->ro_addr = ro_buf;
385  
386      for ( i = 1; i < elf->hdr->e_shnum; i++ )
387      {
388          if ( !livepatch_elf_ignore_section(elf->sec[i].sec) )
389          {
390              void *buf;
391  
392              if ( elf->sec[i].sec->sh_flags & SHF_EXECINSTR )
393                  buf = text_buf;
394              else if ( elf->sec[i].sec->sh_flags & SHF_WRITE )
395              {
396                  buf = rw_buf;
397                  rw_buf_sec = i;
398                  rw_buf_cnt++;
399              }
400              else
401                  buf = ro_buf;
402  
403              ASSERT(offset[i] != UINT_MAX);
404  
405              elf->sec[i].load_addr = buf + offset[i];
406  
407              /* Don't copy NOBITS - such as BSS. */
408              if ( elf->sec[i].sec->sh_type != SHT_NOBITS )
409              {
410                  memcpy(elf->sec[i].load_addr, elf->sec[i].data,
411                         elf->sec[i].sec->sh_size);
412                  dprintk(XENLOG_DEBUG, LIVEPATCH "%s: Loaded %s at %p\n",
413                          elf->name, elf->sec[i].name, elf->sec[i].load_addr);
414              }
415              else
416                  memset(elf->sec[i].load_addr, 0, elf->sec[i].sec->sh_size);
417          }
418      }
419  
420      /*
421       * Only one RW section with non-zero size: .livepatch.funcs,
422       * or only RO sections.
423       */
424      if ( !rw_buf_cnt || (rw_buf_cnt == 1 &&
425           !strcmp(elf->sec[rw_buf_sec].name, ELF_LIVEPATCH_FUNC)) )
426          payload->safe_to_reapply = true;
427   out:
428      xfree(offset);
429  
430      return rc;
431  }
432  
secure_payload(struct payload * payload,struct livepatch_elf * elf)433  static int secure_payload(struct payload *payload, struct livepatch_elf *elf)
434  {
435      int rc = 0;
436      unsigned int text_pages, rw_pages, ro_pages;
437  
438      text_pages = PFN_UP(payload->text_size);
439  
440      if ( text_pages )
441      {
442          rc = arch_livepatch_secure(payload->text_addr, text_pages, LIVEPATCH_VA_RX);
443          if ( rc )
444              return rc;
445      }
446      rw_pages = PFN_UP(payload->rw_size);
447      if ( rw_pages )
448      {
449          rc = arch_livepatch_secure(payload->rw_addr, rw_pages, LIVEPATCH_VA_RW);
450          if ( rc )
451              return rc;
452      }
453  
454      ro_pages = PFN_UP(payload->ro_size);
455      if ( ro_pages )
456          rc = arch_livepatch_secure(payload->ro_addr, ro_pages, LIVEPATCH_VA_RO);
457  
458      ASSERT(ro_pages + rw_pages + text_pages == payload->pages);
459  
460      return rc;
461  }
462  
section_ok(const struct livepatch_elf * elf,const struct livepatch_elf_sec * sec,size_t sz)463  static bool section_ok(const struct livepatch_elf *elf,
464                         const struct livepatch_elf_sec *sec, size_t sz)
465  {
466      if ( !elf || !sec )
467          return false;
468  
469      if ( sec->sec->sh_size % sz )
470      {
471          dprintk(XENLOG_ERR, LIVEPATCH "%s: Wrong size %"PRIuElfWord" of %s (must be multiple of %zu)\n",
472                  elf->name, sec->sec->sh_size, sec->name, sz);
473          return false;
474      }
475  
476      return true;
477  }
478  
check_special_sections(const struct livepatch_elf * elf)479  static int check_special_sections(const struct livepatch_elf *elf)
480  {
481      unsigned int i;
482      static const char *const names[] = { ELF_LIVEPATCH_FUNC,
483                                           ELF_LIVEPATCH_DEPENDS,
484                                           ELF_BUILD_ID_NOTE};
485      DECLARE_BITMAP(found, ARRAY_SIZE(names)) = { 0 };
486  
487      for ( i = 0; i < ARRAY_SIZE(names); i++ )
488      {
489          const struct livepatch_elf_sec *sec;
490  
491          sec = livepatch_elf_sec_by_name(elf, names[i]);
492          if ( !sec )
493          {
494              dprintk(XENLOG_ERR, LIVEPATCH "%s: %s is missing!\n",
495                      elf->name, names[i]);
496              return -EINVAL;
497          }
498  
499          if ( !sec->sec->sh_size )
500          {
501              dprintk(XENLOG_ERR, LIVEPATCH "%s: %s is empty!\n",
502                      elf->name, names[i]);
503              return -EINVAL;
504          }
505  
506          if ( test_and_set_bit(i, found) )
507          {
508              dprintk(XENLOG_ERR, LIVEPATCH "%s: %s was seen more than once!\n",
509                      elf->name, names[i]);
510              return -EINVAL;
511          }
512      }
513  
514      return 0;
515  }
516  
prepare_payload(struct payload * payload,struct livepatch_elf * elf)517  static int prepare_payload(struct payload *payload,
518                             struct livepatch_elf *elf)
519  {
520      const struct livepatch_elf_sec *sec;
521      unsigned int i;
522      struct livepatch_func *f;
523      struct virtual_region *region;
524      const Elf_Note *n;
525  
526      sec = livepatch_elf_sec_by_name(elf, ELF_LIVEPATCH_FUNC);
527      ASSERT(sec);
528      if ( !section_ok(elf, sec, sizeof(*payload->funcs)) )
529          return -EINVAL;
530  
531      payload->funcs = sec->load_addr;
532      payload->nfuncs = sec->sec->sh_size / sizeof(*payload->funcs);
533  
534      for ( i = 0; i < payload->nfuncs; i++ )
535      {
536          int rc;
537  
538          f = &(payload->funcs[i]);
539  
540          if ( f->version != LIVEPATCH_PAYLOAD_VERSION )
541          {
542              dprintk(XENLOG_ERR, LIVEPATCH "%s: Wrong version (%u). Expected %d!\n",
543                      elf->name, f->version, LIVEPATCH_PAYLOAD_VERSION);
544              return -EOPNOTSUPP;
545          }
546  
547          /* 'old_addr', 'new_addr', 'new_size' can all be zero. */
548          if ( !f->old_size )
549          {
550              dprintk(XENLOG_ERR, LIVEPATCH "%s: Address or size fields are zero!\n",
551                      elf->name);
552              return -EINVAL;
553          }
554  
555          rc = arch_livepatch_verify_func(f);
556          if ( rc )
557              return rc;
558  
559          rc = resolve_old_address(f, elf);
560          if ( rc )
561              return rc;
562  
563          rc = livepatch_verify_distance(f);
564          if ( rc )
565              return rc;
566      }
567  
568      sec = livepatch_elf_sec_by_name(elf, ".livepatch.hooks.load");
569      if ( sec )
570      {
571          if ( !section_ok(elf, sec, sizeof(*payload->load_funcs)) )
572              return -EINVAL;
573  
574          payload->load_funcs = sec->load_addr;
575          payload->n_load_funcs = sec->sec->sh_size / sizeof(*payload->load_funcs);
576      }
577  
578      sec = livepatch_elf_sec_by_name(elf, ".livepatch.hooks.unload");
579      if ( sec )
580      {
581          if ( !section_ok(elf, sec, sizeof(*payload->unload_funcs)) )
582              return -EINVAL;
583  
584          payload->unload_funcs = sec->load_addr;
585          payload->n_unload_funcs = sec->sec->sh_size / sizeof(*payload->unload_funcs);
586      }
587      sec = livepatch_elf_sec_by_name(elf, ELF_BUILD_ID_NOTE);
588      if ( sec )
589      {
590          const struct payload *data;
591  
592          n = sec->load_addr;
593  
594          if ( sec->sec->sh_size <= sizeof(*n) )
595              return -EINVAL;
596  
597          if ( xen_build_id_check(n, sec->sec->sh_size,
598                                  &payload->id.p, &payload->id.len) )
599              return -EINVAL;
600  
601          if ( !payload->id.len || !payload->id.p )
602              return -EINVAL;
603  
604          /* Make sure it is not a duplicate. */
605          list_for_each_entry ( data, &payload_list, list )
606          {
607              /* No way _this_ payload is on the list. */
608              ASSERT(data != payload);
609              if ( data->id.len == payload->id.len &&
610                   !memcmp(data->id.p, payload->id.p, data->id.len) )
611              {
612                  dprintk(XENLOG_DEBUG, LIVEPATCH "%s: Already loaded as %s!\n",
613                          elf->name, data->name);
614                  return -EEXIST;
615              }
616          }
617      }
618  
619      sec = livepatch_elf_sec_by_name(elf, ELF_LIVEPATCH_DEPENDS);
620      if ( sec )
621      {
622          n = sec->load_addr;
623  
624          if ( sec->sec->sh_size <= sizeof(*n) )
625              return -EINVAL;
626  
627          if ( xen_build_id_check(n, sec->sec->sh_size,
628                                  &payload->dep.p, &payload->dep.len) )
629              return -EINVAL;
630  
631          if ( !payload->dep.len || !payload->dep.p )
632              return -EINVAL;
633      }
634  
635      /* Setup the virtual region with proper data. */
636      region = &payload->region;
637  
638      region->symbols_lookup = livepatch_symbols_lookup;
639      region->start = payload->text_addr;
640      region->end = payload->text_addr + payload->text_size;
641  
642      /* Optional sections. */
643      for ( i = 0; i < BUGFRAME_NR; i++ )
644      {
645          char str[14];
646  
647          snprintf(str, sizeof(str), ".bug_frames.%u", i);
648          sec = livepatch_elf_sec_by_name(elf, str);
649          if ( !sec )
650              continue;
651  
652          if ( !section_ok(elf, sec, sizeof(*region->frame[i].bugs)) )
653              return -EINVAL;
654  
655          region->frame[i].bugs = sec->load_addr;
656          region->frame[i].n_bugs = sec->sec->sh_size /
657                                    sizeof(*region->frame[i].bugs);
658      }
659  
660      sec = livepatch_elf_sec_by_name(elf, ".altinstructions");
661      if ( sec )
662      {
663  #ifdef CONFIG_HAS_ALTERNATIVE
664          struct alt_instr *a, *start, *end;
665  
666          if ( !section_ok(elf, sec, sizeof(*a)) )
667              return -EINVAL;
668  
669          start = sec->load_addr;
670          end = sec->load_addr + sec->sec->sh_size;
671  
672          for ( a = start; a < end; a++ )
673          {
674              const void *instr = ALT_ORIG_PTR(a);
675              const void *replacement = ALT_REPL_PTR(a);
676  
677              if ( (instr < region->start && instr >= region->end) ||
678                   (replacement < region->start && replacement >= region->end) )
679              {
680                  dprintk(XENLOG_ERR, LIVEPATCH "%s Alt patching outside payload: %p!\n",
681                          elf->name, instr);
682                  return -EINVAL;
683              }
684          }
685          apply_alternatives(start, end);
686  #else
687          dprintk(XENLOG_ERR, LIVEPATCH "%s: We don't support alternative patching!\n",
688                  elf->name);
689          return -EOPNOTSUPP;
690  #endif
691      }
692  
693      sec = livepatch_elf_sec_by_name(elf, ".ex_table");
694      if ( sec )
695      {
696  #ifdef CONFIG_HAS_EX_TABLE
697          struct exception_table_entry *s, *e;
698  
699          if ( !section_ok(elf, sec, sizeof(*region->ex)) )
700              return -EINVAL;
701  
702          s = sec->load_addr;
703          e = sec->load_addr + sec->sec->sh_size;
704  
705          sort_exception_table(s ,e);
706  
707          region->ex = s;
708          region->ex_end = e;
709  #else
710          dprintk(XENLOG_ERR, LIVEPATCH "%s: We don't support .ex_table!\n",
711                  elf->name);
712          return -EOPNOTSUPP;
713  #endif
714      }
715  
716      return 0;
717  }
718  
is_payload_symbol(const struct livepatch_elf * elf,const struct livepatch_elf_sym * sym)719  static bool_t is_payload_symbol(const struct livepatch_elf *elf,
720                                  const struct livepatch_elf_sym *sym)
721  {
722      if ( sym->sym->st_shndx == SHN_UNDEF ||
723           sym->sym->st_shndx >= elf->hdr->e_shnum )
724          return 0;
725  
726      /*
727       * The payload is not a final image as we dynmically link against it.
728       * As such the linker has left symbols we don't care about and which
729       * binutils would have removed had it be a final image. Hence we:
730       * - For SHF_ALLOC - ignore symbols referring to sections that are not
731       *   loaded.
732       */
733      if ( !(elf->sec[sym->sym->st_shndx].sec->sh_flags & SHF_ALLOC) )
734          return 0;
735  
736      /* - And ignore empty symbols (\0). */
737      if ( *sym->name == '\0' )
738          return 0;
739  
740      /*
741       * - For SHF_MERGE - ignore local symbols referring to mergeable sections.
742       *    (ld squashes them all in one section and discards the symbols) when
743       *    those symbols start with '.L' (like .LCx). Those are intermediate
744       *    artifacts of assembly.
745       *
746       * See elf_link_input_bfd and _bfd_elf_is_local_label_name in binutils.
747       */
748      if ( (elf->sec[sym->sym->st_shndx].sec->sh_flags & SHF_MERGE) &&
749           !strncmp(sym->name, ".L", 2) )
750          return 0;
751  
752      return arch_livepatch_symbol_ok(elf, sym);
753  }
754  
build_symbol_table(struct payload * payload,const struct livepatch_elf * elf)755  static int build_symbol_table(struct payload *payload,
756                                const struct livepatch_elf *elf)
757  {
758      unsigned int i, j, nsyms = 0;
759      size_t strtab_len = 0;
760      struct livepatch_symbol *symtab;
761      char *strtab;
762  
763      ASSERT(payload->nfuncs);
764  
765      /* Recall that section @0 is always NULL. */
766      for ( i = 1; i < elf->nsym; i++ )
767      {
768          if ( is_payload_symbol(elf, elf->sym + i) )
769          {
770              nsyms++;
771              strtab_len += strlen(elf->sym[i].name) + 1;
772          }
773      }
774  
775      symtab = xzalloc_array(struct livepatch_symbol, nsyms);
776      strtab = xzalloc_array(char, strtab_len);
777  
778      if ( !strtab || !symtab )
779      {
780          xfree(strtab);
781          xfree(symtab);
782          return -ENOMEM;
783      }
784  
785      nsyms = 0;
786      strtab_len = 0;
787      for ( i = 1; i < elf->nsym; i++ )
788      {
789          if ( is_payload_symbol(elf, elf->sym + i) )
790          {
791              symtab[nsyms].name = strtab + strtab_len;
792              symtab[nsyms].size = elf->sym[i].sym->st_size;
793              symtab[nsyms].value = elf->sym[i].sym->st_value;
794              symtab[nsyms].new_symbol = 0; /* May be overwritten below. */
795              strtab_len += strlcpy(strtab + strtab_len, elf->sym[i].name,
796                                    KSYM_NAME_LEN) + 1;
797              nsyms++;
798          }
799      }
800  
801      for ( i = 0; i < nsyms; i++ )
802      {
803          bool_t found = 0;
804  
805          for ( j = 0; j < payload->nfuncs; j++ )
806          {
807              if ( symtab[i].value == (unsigned long)payload->funcs[j].new_addr )
808              {
809                  found = 1;
810                  break;
811              }
812          }
813  
814          if ( !found )
815          {
816              if ( symbols_lookup_by_name(symtab[i].name) ||
817                   livepatch_symbols_lookup_by_name(symtab[i].name) )
818              {
819                  dprintk(XENLOG_ERR, LIVEPATCH "%s: duplicate new symbol: %s\n",
820                          elf->name, symtab[i].name);
821                  xfree(symtab);
822                  xfree(strtab);
823                  return -EEXIST;
824              }
825              symtab[i].new_symbol = 1;
826              dprintk(XENLOG_DEBUG, LIVEPATCH "%s: new symbol %s\n",
827                       elf->name, symtab[i].name);
828          }
829          else
830          {
831              /* new_symbol is not set. */
832              dprintk(XENLOG_DEBUG, LIVEPATCH "%s: overriding symbol %s\n",
833                      elf->name, symtab[i].name);
834          }
835      }
836  
837      payload->symtab = symtab;
838      payload->strtab = strtab;
839      payload->nsyms = nsyms;
840  
841      return 0;
842  }
843  
free_payload(struct payload * data)844  static void free_payload(struct payload *data)
845  {
846      ASSERT(spin_is_locked(&payload_lock));
847      list_del(&data->list);
848      payload_cnt--;
849      payload_version++;
850      free_payload_data(data);
851      xfree((void *)data->symtab);
852      xfree((void *)data->strtab);
853      xfree(data);
854  }
855  
load_payload_data(struct payload * payload,void * raw,size_t len)856  static int load_payload_data(struct payload *payload, void *raw, size_t len)
857  {
858      struct livepatch_elf elf = { .name = payload->name, .len = len };
859      int rc = 0;
860  
861      rc = livepatch_elf_load(&elf, raw);
862      if ( rc )
863          goto out;
864  
865      rc = move_payload(payload, &elf);
866      if ( rc )
867          goto out;
868  
869      rc = livepatch_elf_resolve_symbols(&elf);
870      if ( rc )
871          goto out;
872  
873      rc = livepatch_elf_perform_relocs(&elf);
874      if ( rc )
875          goto out;
876  
877      rc = check_special_sections(&elf);
878      if ( rc )
879          goto out;
880  
881      rc = prepare_payload(payload, &elf);
882      if ( rc )
883          goto out;
884  
885      rc = build_symbol_table(payload, &elf);
886      if ( rc )
887          goto out;
888  
889      rc = secure_payload(payload, &elf);
890  
891   out:
892      if ( rc )
893          free_payload_data(payload);
894  
895      /* Free our temporary data structure. */
896      livepatch_elf_free(&elf);
897  
898      return rc;
899  }
900  
livepatch_upload(struct xen_sysctl_livepatch_upload * upload)901  static int livepatch_upload(struct xen_sysctl_livepatch_upload *upload)
902  {
903      struct payload *data, *found;
904      char n[XEN_LIVEPATCH_NAME_SIZE];
905      void *raw_data;
906      int rc;
907  
908      rc = verify_payload(upload, n);
909      if ( rc )
910          return rc;
911  
912      data = xzalloc(struct payload);
913      raw_data = vmalloc(upload->size);
914  
915      spin_lock(&payload_lock);
916  
917      found = find_payload(n);
918      if ( IS_ERR(found) )
919          rc = PTR_ERR(found);
920      else if ( found )
921          rc = -EEXIST;
922      else if ( !data || !raw_data )
923          rc = -ENOMEM;
924      else if ( __copy_from_guest(raw_data, upload->payload, upload->size) )
925          rc = -EFAULT;
926      else
927      {
928          memcpy(data->name, n, strlen(n));
929  
930          rc = load_payload_data(data, raw_data, upload->size);
931          if ( rc )
932              goto out;
933  
934          data->state = LIVEPATCH_STATE_CHECKED;
935          INIT_LIST_HEAD(&data->list);
936          INIT_LIST_HEAD(&data->applied_list);
937  
938          list_add_tail(&data->list, &payload_list);
939          payload_cnt++;
940          payload_version++;
941      }
942  
943   out:
944      spin_unlock(&payload_lock);
945  
946      vfree(raw_data);
947  
948      if ( rc && data )
949      {
950          xfree((void *)data->symtab);
951          xfree((void *)data->strtab);
952          xfree(data);
953      }
954  
955      return rc;
956  }
957  
livepatch_get(struct xen_sysctl_livepatch_get * get)958  static int livepatch_get(struct xen_sysctl_livepatch_get *get)
959  {
960      struct payload *data;
961      int rc;
962      char n[XEN_LIVEPATCH_NAME_SIZE];
963  
964      rc = get_name(&get->name, n);
965      if ( rc )
966          return rc;
967  
968      spin_lock(&payload_lock);
969  
970      data = find_payload(n);
971      if ( IS_ERR_OR_NULL(data) )
972      {
973          spin_unlock(&payload_lock);
974  
975          if ( !data )
976              return -ENOENT;
977  
978          return PTR_ERR(data);
979      }
980  
981      get->status.state = data->state;
982      get->status.rc = data->rc;
983  
984      spin_unlock(&payload_lock);
985  
986      return 0;
987  }
988  
livepatch_list(struct xen_sysctl_livepatch_list * list)989  static int livepatch_list(struct xen_sysctl_livepatch_list *list)
990  {
991      struct xen_livepatch_status status;
992      struct payload *data;
993      unsigned int idx = 0, i = 0;
994      int rc = 0;
995  
996      if ( list->nr > 1024 )
997          return -E2BIG;
998  
999      if ( list->pad )
1000          return -EINVAL;
1001  
1002      if ( list->nr &&
1003           (!guest_handle_okay(list->status, list->nr) ||
1004            !guest_handle_okay(list->name, XEN_LIVEPATCH_NAME_SIZE * list->nr) ||
1005            !guest_handle_okay(list->len, list->nr)) )
1006          return -EINVAL;
1007  
1008      spin_lock(&payload_lock);
1009      if ( list->idx >= payload_cnt && payload_cnt )
1010      {
1011          spin_unlock(&payload_lock);
1012          return -EINVAL;
1013      }
1014  
1015      if ( list->nr )
1016      {
1017          list_for_each_entry( data, &payload_list, list )
1018          {
1019              uint32_t len;
1020  
1021              if ( list->idx > i++ )
1022                  continue;
1023  
1024              status.state = data->state;
1025              status.rc = data->rc;
1026              len = strlen(data->name) + 1;
1027  
1028              /* N.B. 'idx' != 'i'. */
1029              if ( __copy_to_guest_offset(list->name, idx * XEN_LIVEPATCH_NAME_SIZE,
1030                                          data->name, len) ||
1031                  __copy_to_guest_offset(list->len, idx, &len, 1) ||
1032                  __copy_to_guest_offset(list->status, idx, &status, 1) )
1033              {
1034                  rc = -EFAULT;
1035                  break;
1036              }
1037  
1038              idx++;
1039  
1040              if ( (idx >= list->nr) || hypercall_preempt_check() )
1041                  break;
1042          }
1043      }
1044      list->nr = payload_cnt - i; /* Remaining amount. */
1045      list->version = payload_version;
1046      spin_unlock(&payload_lock);
1047  
1048      /* And how many we have processed. */
1049      return rc ? : idx;
1050  }
1051  
1052  /*
1053   * The following functions get the CPUs into an appropriate state and
1054   * apply (or revert) each of the payload's functions. This is needed
1055   * for XEN_SYSCTL_LIVEPATCH_ACTION operation (see livepatch_action).
1056   */
1057  
apply_payload(struct payload * data)1058  static int apply_payload(struct payload *data)
1059  {
1060      unsigned int i;
1061      int rc;
1062  
1063      printk(XENLOG_INFO LIVEPATCH "%s: Applying %u functions\n",
1064              data->name, data->nfuncs);
1065  
1066      rc = arch_livepatch_quiesce();
1067      if ( rc )
1068      {
1069          printk(XENLOG_ERR LIVEPATCH "%s: unable to quiesce!\n", data->name);
1070          return rc;
1071      }
1072  
1073      /*
1074       * Since we are running with IRQs disabled and the hooks may call common
1075       * code - which expects certain spinlocks to run with IRQs enabled - we
1076       * temporarily disable the spin locks IRQ state checks.
1077       */
1078      spin_debug_disable();
1079      for ( i = 0; i < data->n_load_funcs; i++ )
1080          data->load_funcs[i]();
1081      spin_debug_enable();
1082  
1083      ASSERT(!local_irq_is_enabled());
1084  
1085      for ( i = 0; i < data->nfuncs; i++ )
1086          arch_livepatch_apply(&data->funcs[i]);
1087  
1088      arch_livepatch_revive();
1089  
1090      /*
1091       * We need RCU variant (which has barriers) in case we crash here.
1092       * The applied_list is iterated by the trap code.
1093       */
1094      list_add_tail_rcu(&data->applied_list, &applied_list);
1095      register_virtual_region(&data->region);
1096  
1097      return 0;
1098  }
1099  
revert_payload(struct payload * data)1100  static int revert_payload(struct payload *data)
1101  {
1102      unsigned int i;
1103      int rc;
1104  
1105      printk(XENLOG_INFO LIVEPATCH "%s: Reverting\n", data->name);
1106  
1107      rc = arch_livepatch_quiesce();
1108      if ( rc )
1109      {
1110          printk(XENLOG_ERR LIVEPATCH "%s: unable to quiesce!\n", data->name);
1111          return rc;
1112      }
1113  
1114      for ( i = 0; i < data->nfuncs; i++ )
1115          arch_livepatch_revert(&data->funcs[i]);
1116  
1117      /*
1118       * Since we are running with IRQs disabled and the hooks may call common
1119       * code - which expects certain spinlocks to run with IRQs enabled - we
1120       * temporarily disable the spin locks IRQ state checks.
1121       */
1122      spin_debug_disable();
1123      for ( i = 0; i < data->n_unload_funcs; i++ )
1124          data->unload_funcs[i]();
1125      spin_debug_enable();
1126  
1127      ASSERT(!local_irq_is_enabled());
1128  
1129      arch_livepatch_revive();
1130  
1131      /*
1132       * We need RCU variant (which has barriers) in case we crash here.
1133       * The applied_list is iterated by the trap code.
1134       */
1135      list_del_rcu(&data->applied_list);
1136      unregister_virtual_region(&data->region);
1137  
1138      data->reverted = true;
1139      return 0;
1140  }
1141  
1142  /*
1143   * This function is executed having all other CPUs with no deep stack (we may
1144   * have cpu_idle on it) and IRQs disabled.
1145   */
livepatch_do_action(void)1146  static void livepatch_do_action(void)
1147  {
1148      int rc;
1149      struct payload *data, *other, *tmp;
1150  
1151      data = livepatch_work.data;
1152      /*
1153       * This function and the transition from asm to C code should be the only
1154       * one on any stack. No need to lock the payload list or applied list.
1155       */
1156      switch ( livepatch_work.cmd )
1157      {
1158      case LIVEPATCH_ACTION_APPLY:
1159          rc = apply_payload(data);
1160          if ( rc == 0 )
1161              data->state = LIVEPATCH_STATE_APPLIED;
1162          break;
1163  
1164      case LIVEPATCH_ACTION_REVERT:
1165          rc = revert_payload(data);
1166          if ( rc == 0 )
1167              data->state = LIVEPATCH_STATE_CHECKED;
1168          break;
1169  
1170      case LIVEPATCH_ACTION_REPLACE:
1171          rc = 0;
1172          /*
1173  	 * N.B: Use 'applied_list' member, not 'list'. We also abuse the
1174  	 * the 'normal' list iterator as the list is an RCU one.
1175  	 */
1176          list_for_each_entry_safe_reverse ( other, tmp, &applied_list, applied_list )
1177          {
1178              other->rc = revert_payload(other);
1179              if ( other->rc == 0 )
1180                  other->state = LIVEPATCH_STATE_CHECKED;
1181              else
1182              {
1183                  rc = -EINVAL;
1184                  break;
1185              }
1186          }
1187  
1188          if ( rc == 0 )
1189          {
1190              rc = apply_payload(data);
1191              if ( rc == 0 )
1192                  data->state = LIVEPATCH_STATE_APPLIED;
1193          }
1194          break;
1195  
1196      default:
1197          rc = -EINVAL; /* Make GCC5 happy. */
1198          ASSERT_UNREACHABLE();
1199          break;
1200      }
1201  
1202      /* We must set rc as livepatch_action sets it to -EAGAIN when kicking of. */
1203      data->rc = rc;
1204  }
1205  
is_work_scheduled(const struct payload * data)1206  static bool_t is_work_scheduled(const struct payload *data)
1207  {
1208      ASSERT(spin_is_locked(&payload_lock));
1209  
1210      return livepatch_work.do_work && livepatch_work.data == data;
1211  }
1212  
schedule_work(struct payload * data,uint32_t cmd,uint32_t timeout)1213  static int schedule_work(struct payload *data, uint32_t cmd, uint32_t timeout)
1214  {
1215      ASSERT(spin_is_locked(&payload_lock));
1216  
1217      /* Fail if an operation is already scheduled. */
1218      if ( livepatch_work.do_work )
1219          return -EBUSY;
1220  
1221      if ( !get_cpu_maps() )
1222      {
1223          printk(XENLOG_ERR LIVEPATCH "%s: unable to get cpu_maps lock!\n",
1224                 data->name);
1225          return -EBUSY;
1226      }
1227  
1228      livepatch_work.cmd = cmd;
1229      livepatch_work.data = data;
1230      livepatch_work.timeout = timeout ?: MILLISECS(30);
1231  
1232      dprintk(XENLOG_DEBUG, LIVEPATCH "%s: timeout is %"PRIu32"ns\n",
1233              data->name, livepatch_work.timeout);
1234  
1235      atomic_set(&livepatch_work.semaphore, -1);
1236  
1237      livepatch_work.ready = 0;
1238  
1239      smp_wmb();
1240  
1241      livepatch_work.do_work = 1;
1242      this_cpu(work_to_do) = 1;
1243  
1244      put_cpu_maps();
1245  
1246      return 0;
1247  }
1248  
reschedule_fn(void * unused)1249  static void reschedule_fn(void *unused)
1250  {
1251      this_cpu(work_to_do) = 1;
1252      raise_softirq(SCHEDULE_SOFTIRQ);
1253  }
1254  
livepatch_spin(atomic_t * counter,s_time_t timeout,unsigned int cpus,const char * s)1255  static int livepatch_spin(atomic_t *counter, s_time_t timeout,
1256                            unsigned int cpus, const char *s)
1257  {
1258      int rc = 0;
1259  
1260      while ( atomic_read(counter) != cpus && NOW() < timeout )
1261          cpu_relax();
1262  
1263      /* Log & abort. */
1264      if ( atomic_read(counter) != cpus )
1265      {
1266          printk(XENLOG_ERR LIVEPATCH "%s: Timed out on semaphore in %s quiesce phase %u/%u\n",
1267                 livepatch_work.data->name, s, atomic_read(counter), cpus);
1268          rc = -EBUSY;
1269          livepatch_work.data->rc = rc;
1270          smp_wmb();
1271          livepatch_work.do_work = 0;
1272      }
1273  
1274      return rc;
1275  }
1276  
1277  /*
1278   * The main function which manages the work of quiescing the system and
1279   * patching code.
1280   */
check_for_livepatch_work(void)1281  void check_for_livepatch_work(void)
1282  {
1283  #define ACTION(x) [LIVEPATCH_ACTION_##x] = #x
1284      static const char *const names[] = {
1285              ACTION(APPLY),
1286              ACTION(REVERT),
1287              ACTION(REPLACE),
1288      };
1289  #undef ACTION
1290      unsigned int cpu = smp_processor_id();
1291      s_time_t timeout;
1292      unsigned long flags;
1293  
1294      /* Fast path: no work to do. */
1295      if ( !per_cpu(work_to_do, cpu ) )
1296          return;
1297  
1298      smp_rmb();
1299      /* In case we aborted, other CPUs can skip right away. */
1300      if ( !livepatch_work.do_work )
1301      {
1302          per_cpu(work_to_do, cpu) = 0;
1303          return;
1304      }
1305  
1306      ASSERT(local_irq_is_enabled());
1307  
1308      /* Set at -1, so will go up to num_online_cpus - 1. */
1309      if ( atomic_inc_and_test(&livepatch_work.semaphore) )
1310      {
1311          struct payload *p;
1312          unsigned int cpus;
1313  
1314          p = livepatch_work.data;
1315          if ( !get_cpu_maps() )
1316          {
1317              printk(XENLOG_ERR LIVEPATCH "%s: CPU%u - unable to get cpu_maps lock!\n",
1318                     p->name, cpu);
1319              per_cpu(work_to_do, cpu) = 0;
1320              livepatch_work.data->rc = -EBUSY;
1321              smp_wmb();
1322              livepatch_work.do_work = 0;
1323              /*
1324               * Do NOT decrement livepatch_work.semaphore down - as that may cause
1325               * the other CPU (which may be at this point ready to increment it)
1326               * to assume the role of master and then needlessly time out
1327               * out (as do_work is zero).
1328               */
1329              return;
1330          }
1331          /* "Mask" NMIs. */
1332          arch_livepatch_mask();
1333  
1334          barrier(); /* MUST do it after get_cpu_maps. */
1335          cpus = num_online_cpus() - 1;
1336  
1337          if ( cpus )
1338          {
1339              dprintk(XENLOG_DEBUG, LIVEPATCH "%s: CPU%u - IPIing the other %u CPUs\n",
1340                      p->name, cpu, cpus);
1341              smp_call_function(reschedule_fn, NULL, 0);
1342          }
1343  
1344          timeout = livepatch_work.timeout + NOW();
1345          if ( livepatch_spin(&livepatch_work.semaphore, timeout, cpus, "CPU") )
1346              goto abort;
1347  
1348          /* All CPUs are waiting, now signal to disable IRQs. */
1349          atomic_set(&livepatch_work.semaphore, 0);
1350          /*
1351           * MUST have a barrier after semaphore so that the other CPUs don't
1352           * leak out of the 'Wait for all CPUs to rendezvous' loop and increment
1353           * 'semaphore' before we set it to zero.
1354           */
1355          smp_wmb();
1356          livepatch_work.ready = 1;
1357  
1358          if ( !livepatch_spin(&livepatch_work.semaphore, timeout, cpus, "IRQ") )
1359          {
1360              local_irq_save(flags);
1361              /* Do the patching. */
1362              livepatch_do_action();
1363              /* Serialize and flush out the CPU via CPUID instruction (on x86). */
1364              arch_livepatch_post_action();
1365              local_irq_restore(flags);
1366          }
1367  
1368   abort:
1369          arch_livepatch_unmask();
1370  
1371          per_cpu(work_to_do, cpu) = 0;
1372          livepatch_work.do_work = 0;
1373  
1374          /* put_cpu_maps has an barrier(). */
1375          put_cpu_maps();
1376  
1377          printk(XENLOG_INFO LIVEPATCH "%s finished %s with rc=%d\n",
1378                 p->name, names[livepatch_work.cmd], p->rc);
1379      }
1380      else
1381      {
1382          /* Wait for all CPUs to rendezvous. */
1383          while ( livepatch_work.do_work && !livepatch_work.ready )
1384              cpu_relax();
1385  
1386          /* Disable IRQs and signal. */
1387          local_irq_save(flags);
1388          /*
1389           * We re-use the sempahore, so MUST have it reset by master before
1390           * we exit the loop above.
1391           */
1392          atomic_inc(&livepatch_work.semaphore);
1393  
1394          /* Wait for patching to complete. */
1395          while ( livepatch_work.do_work )
1396              cpu_relax();
1397  
1398          /* To flush out pipeline. */
1399          arch_livepatch_post_action();
1400          local_irq_restore(flags);
1401  
1402          per_cpu(work_to_do, cpu) = 0;
1403      }
1404  }
1405  
1406  /*
1407   * Only allow dependent payload is applied on top of the correct
1408   * build-id.
1409   *
1410   * This enforces an stacking order - the first payload MUST be against the
1411   * hypervisor. The second against the first payload, and so on.
1412   *
1413   * Unless the 'internal' parameter is used - in which case we only
1414   * check against the hypervisor.
1415   */
build_id_dep(struct payload * payload,bool_t internal)1416  static int build_id_dep(struct payload *payload, bool_t internal)
1417  {
1418      const void *id = NULL;
1419      unsigned int len = 0;
1420      int rc;
1421      const char *name = "hypervisor";
1422  
1423      ASSERT(payload->dep.len && payload->dep.p);
1424  
1425      /* First time user is against hypervisor. */
1426      if ( internal )
1427      {
1428          rc = xen_build_id(&id, &len);
1429          if ( rc )
1430              return rc;
1431      }
1432      else
1433      {
1434          /* We should be against the last applied one. */
1435          const struct payload *data;
1436  
1437          data = list_last_entry(&applied_list, struct payload, applied_list);
1438  
1439          id = data->id.p;
1440          len = data->id.len;
1441          name = data->name;
1442      }
1443  
1444      if ( payload->dep.len != len ||
1445           memcmp(id, payload->dep.p, len) )
1446      {
1447          dprintk(XENLOG_ERR, "%s%s: check against %s build-id failed!\n",
1448                  LIVEPATCH, payload->name, name);
1449          return -EINVAL;
1450      }
1451  
1452      return 0;
1453  }
1454  
livepatch_action(struct xen_sysctl_livepatch_action * action)1455  static int livepatch_action(struct xen_sysctl_livepatch_action *action)
1456  {
1457      struct payload *data;
1458      char n[XEN_LIVEPATCH_NAME_SIZE];
1459      int rc;
1460  
1461      rc = get_name(&action->name, n);
1462      if ( rc )
1463          return rc;
1464  
1465      spin_lock(&payload_lock);
1466  
1467      data = find_payload(n);
1468      if ( IS_ERR_OR_NULL(data) )
1469      {
1470          spin_unlock(&payload_lock);
1471  
1472          if ( !data )
1473              return -ENOENT;
1474  
1475          return PTR_ERR(data);
1476      }
1477  
1478      if ( is_work_scheduled(data) )
1479      {
1480          rc = -EBUSY;
1481          goto out;
1482      }
1483  
1484      switch ( action->cmd )
1485      {
1486      case LIVEPATCH_ACTION_UNLOAD:
1487          if ( data->state == LIVEPATCH_STATE_CHECKED )
1488          {
1489              free_payload(data);
1490              /* No touching 'data' from here on! */
1491              data = NULL;
1492          }
1493          else
1494              rc = -EINVAL;
1495          break;
1496  
1497      case LIVEPATCH_ACTION_REVERT:
1498          if ( data->state == LIVEPATCH_STATE_APPLIED )
1499          {
1500              const struct payload *p;
1501  
1502              p = list_last_entry(&applied_list, struct payload, applied_list);
1503              ASSERT(p);
1504              /* We should be the last applied one. */
1505              if ( p != data )
1506              {
1507                  dprintk(XENLOG_ERR, "%s%s: can't unload. Top is %s!\n",
1508                          LIVEPATCH, data->name, p->name);
1509                  rc = -EBUSY;
1510                  break;
1511              }
1512              data->rc = -EAGAIN;
1513              rc = schedule_work(data, action->cmd, action->timeout);
1514          }
1515          break;
1516  
1517      case LIVEPATCH_ACTION_APPLY:
1518          if ( data->state == LIVEPATCH_STATE_CHECKED )
1519          {
1520              /*
1521               * It is unsafe to apply an reverted payload as the .data (or .bss)
1522               * may not be in in pristine condition. Hence MUST unload and then
1523               * apply patch again. Unless the payload has only one
1524               * RW section (.livepatch.funcs).
1525               */
1526              if ( data->reverted && !data->safe_to_reapply )
1527              {
1528                  dprintk(XENLOG_ERR, "%s%s: can't revert as payload has .data. Please unload!\n",
1529                          LIVEPATCH, data->name);
1530                  data->rc = -EINVAL;
1531                  break;
1532              }
1533  
1534              rc = build_id_dep(data, !!list_empty(&applied_list));
1535              if ( rc )
1536                  break;
1537              data->rc = -EAGAIN;
1538              rc = schedule_work(data, action->cmd, action->timeout);
1539          }
1540          break;
1541  
1542      case LIVEPATCH_ACTION_REPLACE:
1543          if ( data->state == LIVEPATCH_STATE_CHECKED )
1544          {
1545              rc = build_id_dep(data, 1 /* against hypervisor. */);
1546              if ( rc )
1547                  break;
1548              data->rc = -EAGAIN;
1549              rc = schedule_work(data, action->cmd, action->timeout);
1550          }
1551          break;
1552  
1553      default:
1554          rc = -EOPNOTSUPP;
1555          break;
1556      }
1557  
1558   out:
1559      spin_unlock(&payload_lock);
1560  
1561      return rc;
1562  }
1563  
livepatch_op(struct xen_sysctl_livepatch_op * livepatch)1564  int livepatch_op(struct xen_sysctl_livepatch_op *livepatch)
1565  {
1566      int rc;
1567  
1568      if ( livepatch->pad )
1569          return -EINVAL;
1570  
1571      switch ( livepatch->cmd )
1572      {
1573      case XEN_SYSCTL_LIVEPATCH_UPLOAD:
1574          rc = livepatch_upload(&livepatch->u.upload);
1575          break;
1576  
1577      case XEN_SYSCTL_LIVEPATCH_GET:
1578          rc = livepatch_get(&livepatch->u.get);
1579          break;
1580  
1581      case XEN_SYSCTL_LIVEPATCH_LIST:
1582          rc = livepatch_list(&livepatch->u.list);
1583          break;
1584  
1585      case XEN_SYSCTL_LIVEPATCH_ACTION:
1586          rc = livepatch_action(&livepatch->u.action);
1587          break;
1588  
1589      default:
1590          rc = -EOPNOTSUPP;
1591          break;
1592     }
1593  
1594      return rc;
1595  }
1596  
state2str(unsigned int state)1597  static const char *state2str(unsigned int state)
1598  {
1599  #define STATE(x) [LIVEPATCH_STATE_##x] = #x
1600      static const char *const names[] = {
1601              STATE(CHECKED),
1602              STATE(APPLIED),
1603      };
1604  #undef STATE
1605  
1606      if ( state >= ARRAY_SIZE(names) || !names[state] )
1607          return "unknown";
1608  
1609      return names[state];
1610  }
1611  
livepatch_printall(unsigned char key)1612  static void livepatch_printall(unsigned char key)
1613  {
1614      struct payload *data;
1615      const void *binary_id = NULL;
1616      unsigned int len = 0;
1617      unsigned int i;
1618  
1619      printk("'%c' pressed - Dumping all livepatch patches\n", key);
1620  
1621      if ( !xen_build_id(&binary_id, &len) )
1622          printk("build-id: %*phN\n", len, binary_id);
1623  
1624      if ( !spin_trylock(&payload_lock) )
1625      {
1626          printk("Lock held. Try again.\n");
1627          return;
1628      }
1629  
1630      list_for_each_entry ( data, &payload_list, list )
1631      {
1632          printk(" name=%s state=%s(%d) %p (.data=%p, .rodata=%p) using %u pages.\n",
1633                 data->name, state2str(data->state), data->state, data->text_addr,
1634                 data->rw_addr, data->ro_addr, data->pages);
1635  
1636          for ( i = 0; i < data->nfuncs; i++ )
1637          {
1638              struct livepatch_func *f = &(data->funcs[i]);
1639              printk("    %s patch %p(%u) with %p (%u)\n",
1640                     f->name, f->old_addr, f->old_size, f->new_addr, f->new_size);
1641  
1642              if ( i && !(i % 64) )
1643              {
1644                  spin_unlock(&payload_lock);
1645                  process_pending_softirqs();
1646                  if ( !spin_trylock(&payload_lock) )
1647                  {
1648                      printk("Couldn't reacquire lock. Try again.\n");
1649                      return;
1650                  }
1651              }
1652          }
1653          if ( data->id.len )
1654              printk("build-id=%*phN\n", data->id.len, data->id.p);
1655  
1656          if ( data->dep.len )
1657              printk("depend-on=%*phN\n", data->dep.len, data->dep.p);
1658      }
1659  
1660      spin_unlock(&payload_lock);
1661  }
1662  
livepatch_init(void)1663  static int __init livepatch_init(void)
1664  {
1665      register_keyhandler('x', livepatch_printall, "print livepatch info", 1);
1666  
1667      arch_livepatch_init();
1668      return 0;
1669  }
1670  __initcall(livepatch_init);
1671  
1672  /*
1673   * Local variables:
1674   * mode: C
1675   * c-file-style: "BSD"
1676   * c-basic-offset: 4
1677   * tab-width: 4
1678   * indent-tabs-mode: nil
1679   * End:
1680   */
1681