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> 12*4ff26ec5SThomas Huth #include <libcflat.h> 13*4ff26ec5SThomas Huth #include "io.h" 14e65bcc62SAndrew Jones 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 28e65bcc62SAndrew Jones void 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 371aee4297SAndrew Jones int __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 461aee4297SAndrew Jones return r3 == H_SUCCESS && r4 > 0 ? r5 >> 48 : -1; 471aee4297SAndrew Jones } 48