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