/*1* sie64a.S - low level sie call2*3* Copyright IBM Corp. 2008,20104*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License (version 2 only)7* as published by the Free Software Foundation.8*9* Author(s): Heiko Carstens <[email protected]>10* Christian Ehrhardt <[email protected]>11*/1213#include <linux/errno.h>14#include <asm/asm-offsets.h>15#include <asm/setup.h>16#include <asm/asm-offsets.h>17#include <asm/ptrace.h>18#include <asm/thread_info.h>1920_TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)2122/*23* offsets into stackframe24* SP_ = offsets into stack sie64 is called with25* SPI_ = offsets into irq stack26*/27SP_GREGS = __SF_EMPTY28SP_HOOK = __SF_EMPTY+829SP_GPP = __SF_EMPTY+1630SPI_PSW = STACK_FRAME_OVERHEAD + __PT_PSW313233.macro SPP newpp34tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_SPP35jz 0f36.insn s,0xb2800000,\newpp370:38.endm3940sie_irq_handler:41SPP __LC_CMF_HPP # set host id42larl %r2,sie_inst43clg %r2,SPI_PSW+8(0,%r15) # intercepted sie44jne 1f45xc __LC_SIE_HOOK(8),__LC_SIE_HOOK46lg %r2,__LC_THREAD_INFO # pointer thread_info struct47tm __TI_flags+7(%r2),_TIF_EXIT_SIE48jz 0f49larl %r2,sie_exit # work pending, leave sie50stg %r2,SPI_PSW+8(0,%r15)51br %r14520: larl %r2,sie_reenter # re-enter with guest id53stg %r2,SPI_PSW+8(0,%r15)541: br %r145556/*57* sie64a calling convention:58* %r2 pointer to sie control block59* %r3 guest register save area60*/61.globl sie64a62sie64a:63stg %r3,SP_GREGS(%r15) # save guest register save area64stmg %r6,%r14,__SF_GPRS(%r15) # save registers on entry65lgr %r14,%r2 # pointer to sie control block66larl %r5,sie_irq_handler67stg %r2,SP_GPP(%r15)68stg %r5,SP_HOOK(%r15) # save hook target69lmg %r0,%r13,0(%r3) # load guest gprs 0-1370sie_reenter:71mvc __LC_SIE_HOOK(8),SP_HOOK(%r15)72SPP SP_GPP(%r15) # set guest id73sie_inst:74sie 0(%r14)75xc __LC_SIE_HOOK(8),__LC_SIE_HOOK76SPP __LC_CMF_HPP # set host id77sie_exit:78lg %r14,SP_GREGS(%r15)79stmg %r0,%r13,0(%r14) # save guest gprs 0-1380lghi %r2,081lmg %r6,%r14,__SF_GPRS(%r15)82br %r148384sie_err:85xc __LC_SIE_HOOK(8),__LC_SIE_HOOK86SPP __LC_CMF_HPP # set host id87lg %r14,SP_GREGS(%r15)88stmg %r0,%r13,0(%r14) # save guest gprs 0-1389lghi %r2,-EFAULT90lmg %r6,%r14,__SF_GPRS(%r15)91br %r149293.section __ex_table,"a"94.quad sie_inst,sie_err95.quad sie_exit,sie_err96.quad sie_reenter,sie_err97.previous9899100