1e65bcc62SAndrew Jones /*
2e65bcc62SAndrew Jones * Hypercall helpers
3e65bcc62SAndrew Jones *
4e65bcc62SAndrew Jones * broken_sc1 probing/patching inspired by SLOF, see
5e65bcc62SAndrew Jones * SLOF:lib/libhvcall/brokensc1.c
6e65bcc62SAndrew Jones *
7e65bcc62SAndrew Jones * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
8e65bcc62SAndrew Jones *
9e65bcc62SAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2.
10e65bcc62SAndrew Jones */
11e65bcc62SAndrew Jones #include <asm/hcall.h>
124ff26ec5SThomas Huth #include <libcflat.h>
134ff26ec5SThomas Huth #include "io.h"
14e65bcc62SAndrew Jones
hcall_have_broken_sc1(void)15e65bcc62SAndrew Jones int hcall_have_broken_sc1(void)
16e65bcc62SAndrew Jones {
17e65bcc62SAndrew Jones register unsigned long r3 asm("r3") = H_SET_DABR;
18e65bcc62SAndrew Jones register unsigned long r4 asm("r4") = 0;
19e65bcc62SAndrew Jones
20e65bcc62SAndrew Jones asm volatile("sc 1"
21e65bcc62SAndrew Jones : "=r" (r3)
22e65bcc62SAndrew Jones : "r" (r3), "r" (r4)
23e65bcc62SAndrew Jones : "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12");
24e65bcc62SAndrew Jones
25e65bcc62SAndrew Jones return r3 == (unsigned long)H_PRIVILEGE;
26e65bcc62SAndrew Jones }
27e65bcc62SAndrew Jones
papr_putchar(int c)28*610c5a9cSNicholas Piggin void papr_putchar(int c)
29e65bcc62SAndrew Jones {
30e65bcc62SAndrew Jones unsigned long vty = 0; /* 0 == default */
31e65bcc62SAndrew Jones unsigned long nr_chars = 1;
32e65bcc62SAndrew Jones unsigned long chars = (unsigned long)c << 56;
33e65bcc62SAndrew Jones
34e65bcc62SAndrew Jones hcall(H_PUT_TERM_CHAR, vty, nr_chars, chars);
35e65bcc62SAndrew Jones }
361aee4297SAndrew Jones
__papr_getchar(void)37*610c5a9cSNicholas Piggin int __papr_getchar(void)
381aee4297SAndrew Jones {
391aee4297SAndrew Jones register unsigned long r3 asm("r3") = H_GET_TERM_CHAR;
401aee4297SAndrew Jones register unsigned long r4 asm("r4") = 0; /* 0 == default vty */
411aee4297SAndrew Jones register unsigned long r5 asm("r5");
421aee4297SAndrew Jones
431aee4297SAndrew Jones asm volatile (" sc 1 " : "+r"(r3), "+r"(r4), "=r"(r5)
441aee4297SAndrew Jones : "r"(r3), "r"(r4));
451aee4297SAndrew Jones
4634f72869SNicholas Piggin return r3 == H_SUCCESS && r4 > 0 ? r5 >> 56 : -1;
471aee4297SAndrew Jones }
48