diff --git a/include/boot/sigp.h b/include/boot/sigp.h new file mode 100644 index 00000000..c3e7d482 --- /dev/null +++ b/include/boot/sigp.h @@ -0,0 +1,55 @@ +/* + * SIGP related definitions and functions. + * + * Copyright IBM Corp. 2020 + * + * s390-tools is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + +#ifndef S390_SIGP_H +#define S390_SIGP_H + +/* Signal Processor Order Codes */ +#define SIGP_STOP_AND_STORE_STATUS 9 +#define SIGP_SET_MULTI_THREADING 22 +#define SIGP_STORE_ASTATUS_AT_ADDRESS 23 + +/* Signal Processor Condition Codes */ +#define SIGP_CC_ORDER_CODE_ACCEPTED 0 +#define SIGP_CC_BUSY 2 + + +#ifndef __ASSEMBLER__ + +#include + +static inline int sigp(uint16_t addr, uint8_t order, uint32_t parm, + uint32_t *status) +{ + register unsigned int reg1 asm ("1") = parm; + int cc; + + asm volatile( + " sigp %1,%2,0(%3)\n" + " ipm %0\n" + " srl %0,28\n" + : "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc"); + if (status && cc == 1) + *status = reg1; + return cc; +} + +static inline int sigp_busy(uint16_t addr, uint8_t order, uint32_t parm, + uint32_t *status) +{ + int cc; + + do { + cc = sigp(addr, order, parm, status); + } while (cc == SIGP_CC_BUSY); + return cc; +} + +#endif /* __ASSEMBLER__ */ +#endif /* S390_SIGP_H */ diff --git a/zipl/boot/s390.h b/zipl/boot/s390.h index 6de5766c..ff0a43fc 100644 --- a/zipl/boot/s390.h +++ b/zipl/boot/s390.h @@ -13,6 +13,7 @@ #include "lib/zt_common.h" #include "libc.h" +#include "boot/sigp.h" #define __pa32(x) ((uint32_t)(unsigned long)(x)) #define __pa(x) ((unsigned long)(x)) @@ -294,43 +295,6 @@ static inline int diag308(unsigned long subcode, void *addr) return _rc; } -/* - * Signal Processor - */ -#define SIGP_STOP_AND_STORE_STATUS 9 -#define SIGP_SET_MULTI_THREADING 22 -#define SIGP_STORE_ASTATUS_AT_ADDRESS 23 - -#define SIGP_CC_ORDER_CODE_ACCEPTED 0 -#define SIGP_CC_BUSY 2 - -static inline int sigp(uint16_t addr, uint8_t order, uint32_t parm, - uint32_t *status) -{ - register unsigned int reg1 asm ("1") = parm; - int cc; - - asm volatile( - " sigp %1,%2,0(%3)\n" - " ipm %0\n" - " srl %0,28\n" - : "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc"); - if (status && cc == 1) - *status = reg1; - return cc; -} - -static inline int sigp_busy(uint16_t addr, uint8_t order, uint32_t parm, - uint32_t *status) -{ - int cc; - - do { - cc = sigp(addr, order, parm, status); - } while (cc == SIGP_CC_BUSY); - return cc; -} - /* * Store CPU address */