1/* 2 * sie64a.S - low level sie call 3 * 4 * Copyright IBM Corp. 2008,2010 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License (version 2 only) 8 * as published by the Free Software Foundation. 9 * 10 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> 11 * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> 12 */ 13 14#include <linux/errno.h> 15#include <asm/asm-offsets.h> 16#include <asm/setup.h> 17#include <asm/asm-offsets.h> 18#include <asm/ptrace.h> 19#include <asm/thread_info.h> 20 21_TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) 22 23/* 24 * offsets into stackframe 25 * SP_ = offsets into stack sie64 is called with 26 * SPI_ = offsets into irq stack 27 */ 28SP_GREGS = __SF_EMPTY 29SP_HOOK = __SF_EMPTY+8 30SP_GPP = __SF_EMPTY+16 31SPI_PSW = STACK_FRAME_OVERHEAD + __PT_PSW 32 33 34 .macro SPP newpp 35 tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_SPP 36 jz 0f 37 .insn s,0xb2800000,\newpp 380: 39 .endm 40 41sie_irq_handler: 42 SPP __LC_CMF_HPP # set host id 43 larl %r2,sie_inst 44 clg %r2,SPI_PSW+8(0,%r15) # intercepted sie 45 jne 1f 46 xc __LC_SIE_HOOK(8),__LC_SIE_HOOK 47 lg %r2,__LC_THREAD_INFO # pointer thread_info struct 48 tm __TI_flags+7(%r2),_TIF_EXIT_SIE 49 jz 0f 50 larl %r2,sie_exit # work pending, leave sie 51 stg %r2,__LC_RETURN_PSW+8 52 br %r14 530: larl %r2,sie_reenter # re-enter with guest id 54 stg %r2,__LC_RETURN_PSW+8 551: br %r14 56 57/* 58 * sie64a calling convention: 59 * %r2 pointer to sie control block 60 * %r3 guest register save area 61 */ 62 .globl sie64a 63sie64a: 64 stg %r3,SP_GREGS(%r15) # save guest register save area 65 stmg %r6,%r14,__SF_GPRS(%r15) # save registers on entry 66 lgr %r14,%r2 # pointer to sie control block 67 larl %r5,sie_irq_handler 68 stg %r2,SP_GPP(%r15) 69 stg %r5,SP_HOOK(%r15) # save hook target 70 lmg %r0,%r13,0(%r3) # load guest gprs 0-13 71sie_reenter: 72 mvc __LC_SIE_HOOK(8),SP_HOOK(%r15) 73 SPP SP_GPP(%r15) # set guest id 74sie_inst: 75 sie 0(%r14) 76 xc __LC_SIE_HOOK(8),__LC_SIE_HOOK 77 SPP __LC_CMF_HPP # set host id 78sie_exit: 79 lg %r14,SP_GREGS(%r15) 80 stmg %r0,%r13,0(%r14) # save guest gprs 0-13 81 lghi %r2,0 82 lmg %r6,%r14,__SF_GPRS(%r15) 83 br %r14 84 85sie_err: 86 xc __LC_SIE_HOOK(8),__LC_SIE_HOOK 87 SPP __LC_CMF_HPP # set host id 88 lg %r14,SP_GREGS(%r15) 89 stmg %r0,%r13,0(%r14) # save guest gprs 0-13 90 lghi %r2,-EFAULT 91 lmg %r6,%r14,__SF_GPRS(%r15) 92 br %r14 93 94 .section __ex_table,"a" 95 .quad sie_inst,sie_err 96 .previous 97