diff options
author | M. Mohan Kumar <mohan@in.ibm.com> | 2009-10-16 11:56:02 +0530 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2009-11-26 09:18:37 +1100 |
commit | 90ddba23d1abdd727aabbf1070904ae172ebb273 (patch) | |
tree | 5cb9b1fd2458ba7fd6e31295e6fe70d57994c70e /purgatory/arch | |
parent | aee54c10512b494747b03121fb0b3b1e91f63645 (diff) |
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 <mohan@in.ibm.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'purgatory/arch')
-rw-r--r-- | purgatory/arch/ppc64/Makefile | 1 | ||||
-rw-r--r-- | purgatory/arch/ppc64/console-ppc64.c | 14 | ||||
-rw-r--r-- | purgatory/arch/ppc64/hvCall.S | 26 | ||||
-rw-r--r-- | purgatory/arch/ppc64/hvCall.h | 8 | ||||
-rw-r--r-- | purgatory/arch/ppc64/purgatory-ppc64.c | 1 |
5 files changed, 50 insertions, 0 deletions
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 <purgatory.h> +#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) { |