Merge branch 'android-3.10' into android-goldfish-3.10
authorGreg Hackmann <ghackmann@google.com>
Thu, 11 Sep 2014 21:55:20 +0000 (14:55 -0700)
committerGreg Hackmann <ghackmann@google.com>
Thu, 11 Sep 2014 21:55:20 +0000 (14:55 -0700)
Conflicts:
arch/arm64/kernel/setup.c

Change-Id: Id0c3a53d893313581df8f34671a6d0ae43947652

1  2 
arch/arm64/kernel/fpsimd.c
arch/arm64/kernel/process.c

Simple merge
index 1d15af107306ed45a3cd89ebf8044e3af6c4001f,7c11c74f7f545295aca8e5311d8bd960b6742db5..dce030133f7cccbe773e66e4e5e5f84fdafe0a12
@@@ -160,20 -141,73 +160,84 @@@ void machine_restart(char *cmd
        while (1);
  }
  
+ /*
+  * dump a block of kernel memory from around the given address
+  */
+ static void show_data(unsigned long addr, int nbytes, const char *name)
+ {
+       int     i, j;
+       int     nlines;
+       u32     *p;
+       /*
+        * don't attempt to dump non-kernel addresses or
+        * values that are probably just small negative numbers
+        */
+       if (addr < PAGE_OFFSET || addr > -256UL)
+               return;
+       printk("\n%s: %#lx:\n", name, addr);
+       /*
+        * round address down to a 32 bit boundary
+        * and always dump a multiple of 32 bytes
+        */
+       p = (u32 *)(addr & ~(sizeof(u32) - 1));
+       nbytes += (addr & (sizeof(u32) - 1));
+       nlines = (nbytes + 31) / 32;
+       for (i = 0; i < nlines; i++) {
+               /*
+                * just display low 16 bits of address to keep
+                * each line of the dump < 80 characters
+                */
+               printk("%04lx ", (unsigned long)p & 0xffff);
+               for (j = 0; j < 8; j++) {
+                       u32     data;
+                       if (probe_kernel_address(p, data)) {
+                               printk(" ********");
+                       } else {
+                               printk(" %08x", data);
+                       }
+                       ++p;
+               }
+               printk("\n");
+       }
+ }
+ static void show_extra_register_data(struct pt_regs *regs, int nbytes)
+ {
+       mm_segment_t fs;
+       unsigned int i;
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+       show_data(regs->pc - nbytes, nbytes * 2, "PC");
+       show_data(regs->regs[30] - nbytes, nbytes * 2, "LR");
+       show_data(regs->sp - nbytes, nbytes * 2, "SP");
+       for (i = 0; i < 30; i++) {
+               char name[4];
+               snprintf(name, sizeof(name), "X%u", i);
+               show_data(regs->regs[i] - nbytes, nbytes * 2, name);
+       }
+       set_fs(fs);
+ }
  void __show_regs(struct pt_regs *regs)
  {
 -      int i;
 +      int i, top_reg;
 +      u64 lr, sp;
 +
 +      if (compat_user_mode(regs)) {
 +              lr = regs->compat_lr;
 +              sp = regs->compat_sp;
 +              top_reg = 12;
 +      } else {
 +              lr = regs->regs[30];
 +              sp = regs->sp;
 +              top_reg = 29;
 +      }
  
        show_regs_print_info(KERN_DEFAULT);
        print_symbol("PC is at %s\n", instruction_pointer(regs));