From 90ddba23d1abdd727aabbf1070904ae172ebb273 Mon Sep 17 00:00:00 2001 From: "M. Mohan Kumar" Date: Fri, 16 Oct 2009 11:56:02 +0530 Subject: Write to HVC terminal from purgatory code Current x86/x86-64 kexec-tools print the message "I'm in purgatory" to serial console/VGA while executing the purgatory code. Implement this feature for POWERPC pseries platform by using the H_PUT_TERM_CHAR hypervisor call by printng to hvc console. Includes the changes suggested by Michael Ellerman Signed-off-by: M. Mohan Kumar Signed-off-by: Simon Horman --- purgatory/arch/ppc64/Makefile | 1 + purgatory/arch/ppc64/console-ppc64.c | 14 ++++++++++++++ purgatory/arch/ppc64/hvCall.S | 26 ++++++++++++++++++++++++++ purgatory/arch/ppc64/hvCall.h | 8 ++++++++ purgatory/arch/ppc64/purgatory-ppc64.c | 1 + 5 files changed, 50 insertions(+) create mode 100644 purgatory/arch/ppc64/hvCall.S create mode 100644 purgatory/arch/ppc64/hvCall.h (limited to 'purgatory/arch') diff --git a/purgatory/arch/ppc64/Makefile b/purgatory/arch/ppc64/Makefile index aaa4046..40a9e99 100644 --- a/purgatory/arch/ppc64/Makefile +++ b/purgatory/arch/ppc64/Makefile @@ -3,6 +3,7 @@ # ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/v2wrap.S +ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/hvCall.S ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/purgatory-ppc64.c ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/console-ppc64.c ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/crashdump_backup.c diff --git a/purgatory/arch/ppc64/console-ppc64.c b/purgatory/arch/ppc64/console-ppc64.c index d6da7b3..78a233b 100644 --- a/purgatory/arch/ppc64/console-ppc64.c +++ b/purgatory/arch/ppc64/console-ppc64.c @@ -20,8 +20,22 @@ */ #include +#include "hvCall.h" + +extern int debug; void putchar(int c) { + char buff[16]; + unsigned long *lbuf = (unsigned long *)buff; + + if (!debug) /* running on non pseries */ + return; + + if (c == '\n') + putchar('\r'); + + buff[0] = c; + plpar_hcall_norets(H_PUT_TERM_CHAR, 0, 1, lbuf[0], lbuf[1]); return; } diff --git a/purgatory/arch/ppc64/hvCall.S b/purgatory/arch/ppc64/hvCall.S new file mode 100644 index 0000000..bdc4cb0 --- /dev/null +++ b/purgatory/arch/ppc64/hvCall.S @@ -0,0 +1,26 @@ +/* + * This file contains the generic function to perform a call to the + * pSeries LPAR hypervisor. + * + * Taken from linux/arch/powerpc/platforms/pseries/hvCall.S + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#define HVSC .long 0x44000022 +.text + .machine ppc64 +.globl .plpar_hcall_norets +.plpar_hcall_norets: + or 6,6,6 # medium low priority + mfcr 0 + stw 0,8(1) + + HVSC /* invoke the hypervisor */ + + lwz 0,8(1) + mtcrf 0xff,0 + blr /* return r3 = status */ diff --git a/purgatory/arch/ppc64/hvCall.h b/purgatory/arch/ppc64/hvCall.h new file mode 100644 index 0000000..187e24d --- /dev/null +++ b/purgatory/arch/ppc64/hvCall.h @@ -0,0 +1,8 @@ +#ifndef HVCALL_H +#define HVCALL_H + +#define H_PUT_TERM_CHAR 0x58 + +long plpar_hcall_norets(unsigned long opcode, ...); + +#endif diff --git a/purgatory/arch/ppc64/purgatory-ppc64.c b/purgatory/arch/ppc64/purgatory-ppc64.c index 93f28d2..0b6d326 100644 --- a/purgatory/arch/ppc64/purgatory-ppc64.c +++ b/purgatory/arch/ppc64/purgatory-ppc64.c @@ -28,6 +28,7 @@ unsigned long stack = 0; unsigned long dt_offset = 0; unsigned long my_toc = 0; unsigned long kernel = 0; +unsigned int debug = 0; void setup_arch(void) { -- cgit