mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
zipl: move SIGP related functions and definitions into separate header
Move SIGP related functions and definitions to `include/boot/sigp.h`. This allows the reuse of the definitions in assembler files. Reviewed-by: Stefan Haberland <sth@linux.ibm.com> Acked-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Philipp Rudo <prudo@linux.ibm.com> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
committed by
Jan Höppner
parent
9d39a4bd47
commit
675c854fa3
55
include/boot/sigp.h
Normal file
55
include/boot/sigp.h
Normal file
@@ -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 <stdint.h>
|
||||
|
||||
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 */
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user