xref: /kvm-unit-tests/lib/powerpc/hcall.c (revision e65bcc6253c001a11469026b8689918ea929a531)
1*e65bcc62SAndrew Jones /*
2*e65bcc62SAndrew Jones  * Hypercall helpers
3*e65bcc62SAndrew Jones  *
4*e65bcc62SAndrew Jones  * broken_sc1 probing/patching inspired by SLOF, see
5*e65bcc62SAndrew Jones  *   SLOF:lib/libhvcall/brokensc1.c
6*e65bcc62SAndrew Jones  *
7*e65bcc62SAndrew Jones  * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
8*e65bcc62SAndrew Jones  *
9*e65bcc62SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
10*e65bcc62SAndrew Jones  */
11*e65bcc62SAndrew Jones #include <asm/hcall.h>
12*e65bcc62SAndrew Jones 
13*e65bcc62SAndrew Jones int hcall_have_broken_sc1(void)
14*e65bcc62SAndrew Jones {
15*e65bcc62SAndrew Jones 	register unsigned long r3 asm("r3") = H_SET_DABR;
16*e65bcc62SAndrew Jones 	register unsigned long r4 asm("r4") = 0;
17*e65bcc62SAndrew Jones 
18*e65bcc62SAndrew Jones 	asm volatile("sc 1"
19*e65bcc62SAndrew Jones 	: "=r" (r3)
20*e65bcc62SAndrew Jones 	: "r" (r3), "r" (r4)
21*e65bcc62SAndrew Jones 	: "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
22*e65bcc62SAndrew Jones 
23*e65bcc62SAndrew Jones 	return r3 == (unsigned long)H_PRIVILEGE;
24*e65bcc62SAndrew Jones }
25*e65bcc62SAndrew Jones 
26*e65bcc62SAndrew Jones void putchar(int c)
27*e65bcc62SAndrew Jones {
28*e65bcc62SAndrew Jones 	unsigned long vty = 0;		/* 0 == default */
29*e65bcc62SAndrew Jones 	unsigned long nr_chars = 1;
30*e65bcc62SAndrew Jones 	unsigned long chars = (unsigned long)c << 56;
31*e65bcc62SAndrew Jones 
32*e65bcc62SAndrew Jones 	hcall(H_PUT_TERM_CHAR, vty, nr_chars, chars);
33*e65bcc62SAndrew Jones }
34