diff options
| -rw-r--r-- | arch/powerpc/Makefile | 4 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/ppc_asm.h | 7 | ||||
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec_64.c | 2 | ||||
| -rw-r--r-- | kernel/kexec.c | 8 |
4 files changed, 18 insertions, 3 deletions
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 4c0cedf4e2c7..ce4c68a4a823 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -150,7 +150,9 @@ endif | |||
| 150 | 150 | ||
| 151 | CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell) | 151 | CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell) |
| 152 | 152 | ||
| 153 | KBUILD_CPPFLAGS += -Iarch/$(ARCH) | 153 | asinstr := $(call as-instr,lis 9$(comma)foo@high,-DHAVE_AS_ATHIGH=1) |
| 154 | |||
| 155 | KBUILD_CPPFLAGS += -Iarch/$(ARCH) $(asinstr) | ||
| 154 | KBUILD_AFLAGS += -Iarch/$(ARCH) | 156 | KBUILD_AFLAGS += -Iarch/$(ARCH) |
| 155 | KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y) | 157 | KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y) |
| 156 | CPP = $(CC) -E $(KBUILD_CFLAGS) | 158 | CPP = $(CC) -E $(KBUILD_CFLAGS) |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 6586a40a46ce..cded7c1278ef 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
| @@ -318,11 +318,16 @@ n: | |||
| 318 | addi reg,reg,(name - 0b)@l; | 318 | addi reg,reg,(name - 0b)@l; |
| 319 | 319 | ||
| 320 | #ifdef __powerpc64__ | 320 | #ifdef __powerpc64__ |
| 321 | #ifdef HAVE_AS_ATHIGH | ||
| 322 | #define __AS_ATHIGH high | ||
| 323 | #else | ||
| 324 | #define __AS_ATHIGH h | ||
| 325 | #endif | ||
| 321 | #define LOAD_REG_IMMEDIATE(reg,expr) \ | 326 | #define LOAD_REG_IMMEDIATE(reg,expr) \ |
| 322 | lis reg,(expr)@highest; \ | 327 | lis reg,(expr)@highest; \ |
| 323 | ori reg,reg,(expr)@higher; \ | 328 | ori reg,reg,(expr)@higher; \ |
| 324 | rldicr reg,reg,32,31; \ | 329 | rldicr reg,reg,32,31; \ |
| 325 | oris reg,reg,(expr)@h; \ | 330 | oris reg,reg,(expr)@__AS_ATHIGH; \ |
| 326 | ori reg,reg,(expr)@l; | 331 | ori reg,reg,(expr)@l; |
| 327 | 332 | ||
| 328 | #define LOAD_REG_ADDR(reg,name) \ | 333 | #define LOAD_REG_ADDR(reg,name) \ |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index 59d229a2a3e0..879b3aacac32 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
| @@ -237,7 +237,7 @@ static void wake_offline_cpus(void) | |||
| 237 | if (!cpu_online(cpu)) { | 237 | if (!cpu_online(cpu)) { |
| 238 | printk(KERN_INFO "kexec: Waking offline cpu %d.\n", | 238 | printk(KERN_INFO "kexec: Waking offline cpu %d.\n", |
| 239 | cpu); | 239 | cpu); |
| 240 | cpu_up(cpu); | 240 | WARN_ON(cpu_up(cpu)); |
| 241 | } | 241 | } |
| 242 | } | 242 | } |
| 243 | } | 243 | } |
diff --git a/kernel/kexec.c b/kernel/kexec.c index c8380ad203bc..28c57069ef68 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -1683,6 +1683,14 @@ int kernel_kexec(void) | |||
| 1683 | kexec_in_progress = true; | 1683 | kexec_in_progress = true; |
| 1684 | kernel_restart_prepare(NULL); | 1684 | kernel_restart_prepare(NULL); |
| 1685 | migrate_to_reboot_cpu(); | 1685 | migrate_to_reboot_cpu(); |
| 1686 | |||
| 1687 | /* | ||
| 1688 | * migrate_to_reboot_cpu() disables CPU hotplug assuming that | ||
| 1689 | * no further code needs to use CPU hotplug (which is true in | ||
| 1690 | * the reboot case). However, the kexec path depends on using | ||
| 1691 | * CPU hotplug again; so re-enable it here. | ||
| 1692 | */ | ||
| 1693 | cpu_hotplug_enable(); | ||
| 1686 | printk(KERN_EMERG "Starting new kernel\n"); | 1694 | printk(KERN_EMERG "Starting new kernel\n"); |
| 1687 | machine_shutdown(); | 1695 | machine_shutdown(); |
| 1688 | } | 1696 | } |
