You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Heiko Carstens:
"Since Martin is on vacation you get the s390 pull request for the
v4.15 merge window this time from me.
Besides a lot of cleanups and bug fixes these are the most important
changes:
- a new regset for runtime instrumentation registers
- hardware accelerated AES-GCM support for the aes_s390 module
- support for the new CEX6S crypto cards
- support for FORTIFY_SOURCE
- addition of missing z13 and new z14 instructions to the in-kernel
disassembler
- generate opcode tables for the in-kernel disassembler out of a
simple text file instead of having to manually maintain those
tables
- fast memset16, memset32 and memset64 implementations
- removal of named saved segment support
- hardware counter support for z14
- queued spinlocks and queued rwlocks implementations for s390
- use the stack_depth tracking feature for s390 BPF JIT
- a new s390_sthyi system call which emulates the sthyi (store
hypervisor information) instruction
- removal of the old KVM virtio transport
- an s390 specific CPU alternatives implementation which is used in
the new spinlock code"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (88 commits)
MAINTAINERS: add virtio-ccw.h to virtio/s390 section
s390/noexec: execute kexec datamover without DAT
s390: fix transactional execution control register handling
s390/bpf: take advantage of stack_depth tracking
s390: simplify transactional execution elf hwcap handling
s390/zcrypt: Rework struct ap_qact_ap_info.
s390/virtio: remove unused header file kvm_virtio.h
s390: avoid undefined behaviour
s390/disassembler: generate opcode tables from text file
s390/disassembler: remove insn_to_mnemonic()
s390/dasd: avoid calling do_gettimeofday()
s390: vfio-ccw: Do not attempt to free no-op, test and tic cda.
s390: remove named saved segment support
s390/archrandom: Reconsider s390 arch random implementation
s390/pci: do not require AIS facility
s390/qdio: sanitize put_indicator
s390/qdio: use atomic_cmpxchg
s390/nmi: avoid using long-displacement facility
s390: pass endianness info to sparse
s390/decompressor: remove informational messages
...
This commit is contained in:
@@ -2548,6 +2548,9 @@
|
||||
|
||||
noalign [KNL,ARM]
|
||||
|
||||
noaltinstr [S390] Disables alternative instructions patching
|
||||
(CPU alternatives feature).
|
||||
|
||||
noapic [SMP,APIC] Tells the kernel to not make use of any
|
||||
IOAPICs that may be present in the system.
|
||||
|
||||
|
||||
@@ -14335,6 +14335,7 @@ L: virtualization@lists.linux-foundation.org
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/s390/virtio/
|
||||
F: arch/s390/include/uapi/asm/virtio-ccw.h
|
||||
|
||||
VIRTIO GPU DRIVER
|
||||
M: David Airlie <airlied@linux.ie>
|
||||
|
||||
+17
-26
@@ -68,6 +68,7 @@ config S390
|
||||
select ARCH_BINFMT_ELF_STATE
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_GIGANTIC_PAGE if (MEMORY_ISOLATION && COMPACTION) || CMA
|
||||
select ARCH_HAS_KCOV
|
||||
@@ -143,7 +144,6 @@ config S390
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS
|
||||
select HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
select HAVE_EXIT_THREAD
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_FUNCTION_TRACER
|
||||
@@ -538,6 +538,22 @@ config ARCH_RANDOM
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config ALTERNATIVES
|
||||
def_bool y
|
||||
prompt "Patch optimized instructions for running CPU type"
|
||||
help
|
||||
When enabled the kernel code is compiled with additional
|
||||
alternative instructions blocks optimized for newer CPU types.
|
||||
These alternative instructions blocks are patched at kernel boot
|
||||
time when running CPU supports them. This mechanism is used to
|
||||
optimize some critical code paths (i.e. spinlocks) for newer CPUs
|
||||
even if kernel is build to support older machine generations.
|
||||
|
||||
This mechanism could be disabled by appending "noaltinstr"
|
||||
option to the kernel command line.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Memory setup"
|
||||
@@ -809,18 +825,6 @@ config PFAULT
|
||||
Everybody who wants to run Linux under VM != VM4.2 should select
|
||||
this option.
|
||||
|
||||
config SHARED_KERNEL
|
||||
bool "VM shared kernel support"
|
||||
depends on !JUMP_LABEL
|
||||
help
|
||||
Select this option, if you want to share the text segment of the
|
||||
Linux kernel between different VM guests. This reduces memory
|
||||
usage with lots of guests but greatly increases kernel size.
|
||||
Also if a kernel was IPL'ed from a shared segment the kexec system
|
||||
call will not work.
|
||||
You should only select this option if you know what you are
|
||||
doing and want to exploit this feature.
|
||||
|
||||
config CMM
|
||||
def_tristate n
|
||||
prompt "Cooperative memory management"
|
||||
@@ -930,17 +934,4 @@ config S390_GUEST
|
||||
Select this option if you want to run the kernel as a guest under
|
||||
the KVM hypervisor.
|
||||
|
||||
config S390_GUEST_OLD_TRANSPORT
|
||||
def_bool y
|
||||
prompt "Guest support for old s390 virtio transport (DEPRECATED)"
|
||||
depends on S390_GUEST
|
||||
help
|
||||
Enable this option to add support for the old s390-virtio
|
||||
transport (i.e. virtio devices NOT based on virtio-ccw). This
|
||||
type of virtio devices is only available on the experimental
|
||||
kuli userspace or with old (< 2.6) qemu. If you are running
|
||||
with a modern version of qemu (which supports virtio-ccw since
|
||||
1.4 and uses it by default since version 2.4), you probably won't
|
||||
need this.
|
||||
|
||||
endmenu
|
||||
|
||||
+2
-1
@@ -21,7 +21,7 @@ KBUILD_CFLAGS += -m64
|
||||
KBUILD_AFLAGS += -m64
|
||||
UTS_MACHINE := s390x
|
||||
STACK_SIZE := 16384
|
||||
CHECKFLAGS += -D__s390__ -D__s390x__
|
||||
CHECKFLAGS += -D__s390__ -D__s390x__ -mbig-endian
|
||||
|
||||
export LD_BFD
|
||||
|
||||
@@ -133,6 +133,7 @@ archclean:
|
||||
|
||||
archprepare:
|
||||
$(Q)$(MAKE) $(build)=$(tools) include/generated/facilities.h
|
||||
$(Q)$(MAKE) $(build)=$(tools) include/generated/dis.h
|
||||
|
||||
# Don't use tabs in echo arguments
|
||||
define archhelp
|
||||
|
||||
@@ -12,7 +12,7 @@ targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4
|
||||
targets += misc.o piggy.o sizes.h head.o
|
||||
|
||||
KBUILD_CFLAGS := -m64 -D__KERNEL__ -O2
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING -D__NO_FORTIFY
|
||||
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks -msoft-float
|
||||
KBUILD_CFLAGS += $(call cc-option,-mpacked-stack)
|
||||
KBUILD_CFLAGS += $(call cc-option,-ffreestanding)
|
||||
|
||||
@@ -170,9 +170,7 @@ unsigned long decompress_kernel(void)
|
||||
free_mem_ptr = (unsigned long) &_end;
|
||||
free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
|
||||
|
||||
puts("Uncompressing Linux... ");
|
||||
__decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error);
|
||||
puts("Ok, booting the kernel.\n");
|
||||
return (unsigned long) output;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,6 @@ CONFIG_KSM=y
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_FRONTSWAP=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_DEBUG=y
|
||||
CONFIG_CMA_DEBUGFS=y
|
||||
CONFIG_MEM_SOFT_DIRTY=y
|
||||
@@ -379,7 +378,6 @@ CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_DRBD=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_OSD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=32768
|
||||
CONFIG_BLK_DEV_RAM_DAX=y
|
||||
@@ -416,7 +414,6 @@ CONFIG_SCSI_OSD_ULD=m
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=m
|
||||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
@@ -483,6 +480,8 @@ CONFIG_INFINIBAND=m
|
||||
CONFIG_INFINIBAND_USER_ACCESS=m
|
||||
CONFIG_MLX4_INFINIBAND=m
|
||||
CONFIG_MLX5_INFINIBAND=m
|
||||
CONFIG_VFIO=m
|
||||
CONFIG_VFIO_PCI=m
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
@@ -599,7 +598,6 @@ CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_WQ_WATCHDOG=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_DEBUG_TIMEKEEPING=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_LOCK_STAT=y
|
||||
@@ -629,10 +627,8 @@ CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_UPROBE_EVENTS=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
CONFIG_LKDTM=m
|
||||
CONFIG_TEST_LIST_SORT=y
|
||||
CONFIG_TEST_SORT=y
|
||||
@@ -649,6 +645,7 @@ CONFIG_ENCRYPTED_KEYS=m
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
CONFIG_HARDENED_USERCOPY=y
|
||||
CONFIG_FORTIFY_SOURCE=y
|
||||
CONFIG_SECURITY_SELINUX=y
|
||||
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
||||
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0
|
||||
@@ -705,12 +702,12 @@ CONFIG_CRYPTO_USER_API_RNG=m
|
||||
CONFIG_CRYPTO_USER_API_AEAD=m
|
||||
CONFIG_ZCRYPT=m
|
||||
CONFIG_PKEY=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_SHA1_S390=m
|
||||
CONFIG_CRYPTO_SHA256_S390=m
|
||||
CONFIG_CRYPTO_SHA512_S390=m
|
||||
CONFIG_CRYPTO_DES_S390=m
|
||||
CONFIG_CRYPTO_AES_S390=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_GHASH_S390=m
|
||||
CONFIG_CRYPTO_CRC32_S390=y
|
||||
CONFIG_ASYMMETRIC_KEY_TYPE=y
|
||||
|
||||
@@ -70,7 +70,6 @@ CONFIG_KSM=y
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_FRONTSWAP=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_MEM_SOFT_DIRTY=y
|
||||
CONFIG_ZSWAP=y
|
||||
CONFIG_ZBUD=m
|
||||
@@ -376,7 +375,6 @@ CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_DRBD=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_OSD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=32768
|
||||
CONFIG_BLK_DEV_RAM_DAX=y
|
||||
@@ -412,7 +410,6 @@ CONFIG_SCSI_OSD_ULD=m
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=m
|
||||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
@@ -479,6 +476,8 @@ CONFIG_INFINIBAND=m
|
||||
CONFIG_INFINIBAND_USER_ACCESS=m
|
||||
CONFIG_MLX4_INFINIBAND=m
|
||||
CONFIG_MLX5_INFINIBAND=m
|
||||
CONFIG_VFIO=m
|
||||
CONFIG_VFIO_PCI=m
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
@@ -575,10 +574,8 @@ CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_UPROBE_EVENTS=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
CONFIG_LKDTM=m
|
||||
CONFIG_PERCPU_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=y
|
||||
@@ -650,12 +647,12 @@ CONFIG_CRYPTO_USER_API_RNG=m
|
||||
CONFIG_CRYPTO_USER_API_AEAD=m
|
||||
CONFIG_ZCRYPT=m
|
||||
CONFIG_PKEY=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_SHA1_S390=m
|
||||
CONFIG_CRYPTO_SHA256_S390=m
|
||||
CONFIG_CRYPTO_SHA512_S390=m
|
||||
CONFIG_CRYPTO_DES_S390=m
|
||||
CONFIG_CRYPTO_AES_S390=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_GHASH_S390=m
|
||||
CONFIG_CRYPTO_CRC32_S390=y
|
||||
CONFIG_CRC7=m
|
||||
|
||||
@@ -68,7 +68,6 @@ CONFIG_KSM=y
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_FRONTSWAP=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_MEM_SOFT_DIRTY=y
|
||||
CONFIG_ZSWAP=y
|
||||
CONFIG_ZBUD=m
|
||||
@@ -374,7 +373,6 @@ CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_DRBD=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_OSD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=32768
|
||||
CONFIG_BLK_DEV_RAM_DAX=y
|
||||
@@ -410,7 +408,6 @@ CONFIG_SCSI_OSD_ULD=m
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=m
|
||||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
@@ -477,6 +474,8 @@ CONFIG_INFINIBAND=m
|
||||
CONFIG_INFINIBAND_USER_ACCESS=m
|
||||
CONFIG_MLX4_INFINIBAND=m
|
||||
CONFIG_MLX5_INFINIBAND=m
|
||||
CONFIG_VFIO=m
|
||||
CONFIG_VFIO_PCI=m
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
@@ -573,10 +572,8 @@ CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_UPROBE_EVENTS=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
CONFIG_LKDTM=m
|
||||
CONFIG_PERCPU_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=y
|
||||
@@ -648,12 +645,12 @@ CONFIG_CRYPTO_USER_API_RNG=m
|
||||
CONFIG_CRYPTO_USER_API_AEAD=m
|
||||
CONFIG_ZCRYPT=m
|
||||
CONFIG_PKEY=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_SHA1_S390=m
|
||||
CONFIG_CRYPTO_SHA256_S390=m
|
||||
CONFIG_CRYPTO_SHA512_S390=m
|
||||
CONFIG_CRYPTO_DES_S390=m
|
||||
CONFIG_CRYPTO_AES_S390=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_GHASH_S390=m
|
||||
CONFIG_CRYPTO_CRC32_S390=y
|
||||
CONFIG_CRC7=m
|
||||
|
||||
+293
-3
@@ -4,9 +4,11 @@
|
||||
* s390 implementation of the AES Cipher Algorithm.
|
||||
*
|
||||
* s390 Version:
|
||||
* Copyright IBM Corp. 2005, 2007
|
||||
* Copyright IBM Corp. 2005, 2017
|
||||
* Author(s): Jan Glauber (jang@de.ibm.com)
|
||||
* Sebastian Siewior (sebastian@breakpoint.cc> SW-Fallback
|
||||
* Patrick Steuer <patrick.steuer@de.ibm.com>
|
||||
* Harald Freudenberger <freude@de.ibm.com>
|
||||
*
|
||||
* Derived from "crypto/aes_generic.c"
|
||||
*
|
||||
@@ -22,20 +24,25 @@
|
||||
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/algapi.h>
|
||||
#include <crypto/ghash.h>
|
||||
#include <crypto/internal/aead.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/fips.h>
|
||||
#include <linux/string.h>
|
||||
#include <crypto/xts.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
static u8 *ctrblk;
|
||||
static DEFINE_SPINLOCK(ctrblk_lock);
|
||||
|
||||
static cpacf_mask_t km_functions, kmc_functions, kmctr_functions;
|
||||
static cpacf_mask_t km_functions, kmc_functions, kmctr_functions,
|
||||
kma_functions;
|
||||
|
||||
struct s390_aes_ctx {
|
||||
u8 key[AES_MAX_KEY_SIZE];
|
||||
@@ -55,6 +62,17 @@ struct s390_xts_ctx {
|
||||
struct crypto_skcipher *fallback;
|
||||
};
|
||||
|
||||
struct gcm_sg_walk {
|
||||
struct scatter_walk walk;
|
||||
unsigned int walk_bytes;
|
||||
u8 *walk_ptr;
|
||||
unsigned int walk_bytes_remain;
|
||||
u8 buf[AES_BLOCK_SIZE];
|
||||
unsigned int buf_bytes;
|
||||
u8 *ptr;
|
||||
unsigned int nbytes;
|
||||
};
|
||||
|
||||
static int setkey_fallback_cip(struct crypto_tfm *tfm, const u8 *in_key,
|
||||
unsigned int key_len)
|
||||
{
|
||||
@@ -771,6 +789,267 @@ static struct crypto_alg ctr_aes_alg = {
|
||||
}
|
||||
};
|
||||
|
||||
static int gcm_aes_setkey(struct crypto_aead *tfm, const u8 *key,
|
||||
unsigned int keylen)
|
||||
{
|
||||
struct s390_aes_ctx *ctx = crypto_aead_ctx(tfm);
|
||||
|
||||
switch (keylen) {
|
||||
case AES_KEYSIZE_128:
|
||||
ctx->fc = CPACF_KMA_GCM_AES_128;
|
||||
break;
|
||||
case AES_KEYSIZE_192:
|
||||
ctx->fc = CPACF_KMA_GCM_AES_192;
|
||||
break;
|
||||
case AES_KEYSIZE_256:
|
||||
ctx->fc = CPACF_KMA_GCM_AES_256;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memcpy(ctx->key, key, keylen);
|
||||
ctx->key_len = keylen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gcm_aes_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
|
||||
{
|
||||
switch (authsize) {
|
||||
case 4:
|
||||
case 8:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gcm_sg_walk_start(struct gcm_sg_walk *gw, struct scatterlist *sg,
|
||||
unsigned int len)
|
||||
{
|
||||
memset(gw, 0, sizeof(*gw));
|
||||
gw->walk_bytes_remain = len;
|
||||
scatterwalk_start(&gw->walk, sg);
|
||||
}
|
||||
|
||||
static int gcm_sg_walk_go(struct gcm_sg_walk *gw, unsigned int minbytesneeded)
|
||||
{
|
||||
int n;
|
||||
|
||||
/* minbytesneeded <= AES_BLOCK_SIZE */
|
||||
if (gw->buf_bytes && gw->buf_bytes >= minbytesneeded) {
|
||||
gw->ptr = gw->buf;
|
||||
gw->nbytes = gw->buf_bytes;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (gw->walk_bytes_remain == 0) {
|
||||
gw->ptr = NULL;
|
||||
gw->nbytes = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
gw->walk_bytes = scatterwalk_clamp(&gw->walk, gw->walk_bytes_remain);
|
||||
if (!gw->walk_bytes) {
|
||||
scatterwalk_start(&gw->walk, sg_next(gw->walk.sg));
|
||||
gw->walk_bytes = scatterwalk_clamp(&gw->walk,
|
||||
gw->walk_bytes_remain);
|
||||
}
|
||||
gw->walk_ptr = scatterwalk_map(&gw->walk);
|
||||
|
||||
if (!gw->buf_bytes && gw->walk_bytes >= minbytesneeded) {
|
||||
gw->ptr = gw->walk_ptr;
|
||||
gw->nbytes = gw->walk_bytes;
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
n = min(gw->walk_bytes, AES_BLOCK_SIZE - gw->buf_bytes);
|
||||
memcpy(gw->buf + gw->buf_bytes, gw->walk_ptr, n);
|
||||
gw->buf_bytes += n;
|
||||
gw->walk_bytes_remain -= n;
|
||||
scatterwalk_unmap(&gw->walk);
|
||||
scatterwalk_advance(&gw->walk, n);
|
||||
scatterwalk_done(&gw->walk, 0, gw->walk_bytes_remain);
|
||||
|
||||
if (gw->buf_bytes >= minbytesneeded) {
|
||||
gw->ptr = gw->buf;
|
||||
gw->nbytes = gw->buf_bytes;
|
||||
goto out;
|
||||
}
|
||||
|
||||
gw->walk_bytes = scatterwalk_clamp(&gw->walk,
|
||||
gw->walk_bytes_remain);
|
||||
if (!gw->walk_bytes) {
|
||||
scatterwalk_start(&gw->walk, sg_next(gw->walk.sg));
|
||||
gw->walk_bytes = scatterwalk_clamp(&gw->walk,
|
||||
gw->walk_bytes_remain);
|
||||
}
|
||||
gw->walk_ptr = scatterwalk_map(&gw->walk);
|
||||
}
|
||||
|
||||
out:
|
||||
return gw->nbytes;
|
||||
}
|
||||
|
||||
static void gcm_sg_walk_done(struct gcm_sg_walk *gw, unsigned int bytesdone)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (gw->ptr == NULL)
|
||||
return;
|
||||
|
||||
if (gw->ptr == gw->buf) {
|
||||
n = gw->buf_bytes - bytesdone;
|
||||
if (n > 0) {
|
||||
memmove(gw->buf, gw->buf + bytesdone, n);
|
||||
gw->buf_bytes -= n;
|
||||
} else
|
||||
gw->buf_bytes = 0;
|
||||
} else {
|
||||
gw->walk_bytes_remain -= bytesdone;
|
||||
scatterwalk_unmap(&gw->walk);
|
||||
scatterwalk_advance(&gw->walk, bytesdone);
|
||||
scatterwalk_done(&gw->walk, 0, gw->walk_bytes_remain);
|
||||
}
|
||||
}
|
||||
|
||||
static int gcm_aes_crypt(struct aead_request *req, unsigned int flags)
|
||||
{
|
||||
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||
struct s390_aes_ctx *ctx = crypto_aead_ctx(tfm);
|
||||
unsigned int ivsize = crypto_aead_ivsize(tfm);
|
||||
unsigned int taglen = crypto_aead_authsize(tfm);
|
||||
unsigned int aadlen = req->assoclen;
|
||||
unsigned int pclen = req->cryptlen;
|
||||
int ret = 0;
|
||||
|
||||
unsigned int len, in_bytes, out_bytes,
|
||||
min_bytes, bytes, aad_bytes, pc_bytes;
|
||||
struct gcm_sg_walk gw_in, gw_out;
|
||||
u8 tag[GHASH_DIGEST_SIZE];
|
||||
|
||||
struct {
|
||||
u32 _[3]; /* reserved */
|
||||
u32 cv; /* Counter Value */
|
||||
u8 t[GHASH_DIGEST_SIZE];/* Tag */
|
||||
u8 h[AES_BLOCK_SIZE]; /* Hash-subkey */
|
||||
u64 taadl; /* Total AAD Length */
|
||||
u64 tpcl; /* Total Plain-/Cipher-text Length */
|
||||
u8 j0[GHASH_BLOCK_SIZE];/* initial counter value */
|
||||
u8 k[AES_MAX_KEY_SIZE]; /* Key */
|
||||
} param;
|
||||
|
||||
/*
|
||||
* encrypt
|
||||
* req->src: aad||plaintext
|
||||
* req->dst: aad||ciphertext||tag
|
||||
* decrypt
|
||||
* req->src: aad||ciphertext||tag
|
||||
* req->dst: aad||plaintext, return 0 or -EBADMSG
|
||||
* aad, plaintext and ciphertext may be empty.
|
||||
*/
|
||||
if (flags & CPACF_DECRYPT)
|
||||
pclen -= taglen;
|
||||
len = aadlen + pclen;
|
||||
|
||||
memset(¶m, 0, sizeof(param));
|
||||
param.cv = 1;
|
||||
param.taadl = aadlen * 8;
|
||||
param.tpcl = pclen * 8;
|
||||
memcpy(param.j0, req->iv, ivsize);
|
||||
*(u32 *)(param.j0 + ivsize) = 1;
|
||||
memcpy(param.k, ctx->key, ctx->key_len);
|
||||
|
||||
gcm_sg_walk_start(&gw_in, req->src, len);
|
||||
gcm_sg_walk_start(&gw_out, req->dst, len);
|
||||
|
||||
do {
|
||||
min_bytes = min_t(unsigned int,
|
||||
aadlen > 0 ? aadlen : pclen, AES_BLOCK_SIZE);
|
||||
in_bytes = gcm_sg_walk_go(&gw_in, min_bytes);
|
||||
out_bytes = gcm_sg_walk_go(&gw_out, min_bytes);
|
||||
bytes = min(in_bytes, out_bytes);
|
||||
|
||||
if (aadlen + pclen <= bytes) {
|
||||
aad_bytes = aadlen;
|
||||
pc_bytes = pclen;
|
||||
flags |= CPACF_KMA_LAAD | CPACF_KMA_LPC;
|
||||
} else {
|
||||
if (aadlen <= bytes) {
|
||||
aad_bytes = aadlen;
|
||||
pc_bytes = (bytes - aadlen) &
|
||||
~(AES_BLOCK_SIZE - 1);
|
||||
flags |= CPACF_KMA_LAAD;
|
||||
} else {
|
||||
aad_bytes = bytes & ~(AES_BLOCK_SIZE - 1);
|
||||
pc_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (aad_bytes > 0)
|
||||
memcpy(gw_out.ptr, gw_in.ptr, aad_bytes);
|
||||
|
||||
cpacf_kma(ctx->fc | flags, ¶m,
|
||||
gw_out.ptr + aad_bytes,
|
||||
gw_in.ptr + aad_bytes, pc_bytes,
|
||||
gw_in.ptr, aad_bytes);
|
||||
|
||||
gcm_sg_walk_done(&gw_in, aad_bytes + pc_bytes);
|
||||
gcm_sg_walk_done(&gw_out, aad_bytes + pc_bytes);
|
||||
aadlen -= aad_bytes;
|
||||
pclen -= pc_bytes;
|
||||
} while (aadlen + pclen > 0);
|
||||
|
||||
if (flags & CPACF_DECRYPT) {
|
||||
scatterwalk_map_and_copy(tag, req->src, len, taglen, 0);
|
||||
if (crypto_memneq(tag, param.t, taglen))
|
||||
ret = -EBADMSG;
|
||||
} else
|
||||
scatterwalk_map_and_copy(param.t, req->dst, len, taglen, 1);
|
||||
|
||||
memzero_explicit(¶m, sizeof(param));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int gcm_aes_encrypt(struct aead_request *req)
|
||||
{
|
||||
return gcm_aes_crypt(req, CPACF_ENCRYPT);
|
||||
}
|
||||
|
||||
static int gcm_aes_decrypt(struct aead_request *req)
|
||||
{
|
||||
return gcm_aes_crypt(req, CPACF_DECRYPT);
|
||||
}
|
||||
|
||||
static struct aead_alg gcm_aes_aead = {
|
||||
.setkey = gcm_aes_setkey,
|
||||
.setauthsize = gcm_aes_setauthsize,
|
||||
.encrypt = gcm_aes_encrypt,
|
||||
.decrypt = gcm_aes_decrypt,
|
||||
|
||||
.ivsize = GHASH_BLOCK_SIZE - sizeof(u32),
|
||||
.maxauthsize = GHASH_DIGEST_SIZE,
|
||||
.chunksize = AES_BLOCK_SIZE,
|
||||
|
||||
.base = {
|
||||
.cra_flags = CRYPTO_ALG_TYPE_AEAD,
|
||||
.cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct s390_aes_ctx),
|
||||
.cra_priority = 900,
|
||||
.cra_name = "gcm(aes)",
|
||||
.cra_driver_name = "gcm-aes-s390",
|
||||
.cra_module = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct crypto_alg *aes_s390_algs_ptr[5];
|
||||
static int aes_s390_algs_num;
|
||||
|
||||
@@ -790,16 +1069,19 @@ static void aes_s390_fini(void)
|
||||
crypto_unregister_alg(aes_s390_algs_ptr[aes_s390_algs_num]);
|
||||
if (ctrblk)
|
||||
free_page((unsigned long) ctrblk);
|
||||
|
||||
crypto_unregister_aead(&gcm_aes_aead);
|
||||
}
|
||||
|
||||
static int __init aes_s390_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Query available functions for KM, KMC and KMCTR */
|
||||
/* Query available functions for KM, KMC, KMCTR and KMA */
|
||||
cpacf_query(CPACF_KM, &km_functions);
|
||||
cpacf_query(CPACF_KMC, &kmc_functions);
|
||||
cpacf_query(CPACF_KMCTR, &kmctr_functions);
|
||||
cpacf_query(CPACF_KMA, &kma_functions);
|
||||
|
||||
if (cpacf_test_func(&km_functions, CPACF_KM_AES_128) ||
|
||||
cpacf_test_func(&km_functions, CPACF_KM_AES_192) ||
|
||||
@@ -840,6 +1122,14 @@ static int __init aes_s390_init(void)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (cpacf_test_func(&kma_functions, CPACF_KMA_GCM_AES_128) ||
|
||||
cpacf_test_func(&kma_functions, CPACF_KMA_GCM_AES_192) ||
|
||||
cpacf_test_func(&kma_functions, CPACF_KMA_GCM_AES_256)) {
|
||||
ret = crypto_register_aead(&gcm_aes_aead);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out_err:
|
||||
aes_s390_fini();
|
||||
|
||||
@@ -53,7 +53,6 @@ CONFIG_KSM=y
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_FRONTSWAP=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_ZSWAP=y
|
||||
CONFIG_ZBUD=m
|
||||
CONFIG_ZSMALLOC=m
|
||||
@@ -163,7 +162,6 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_LOCK_STAT=y
|
||||
CONFIG_DEBUG_LOCKDEP=y
|
||||
@@ -179,7 +177,6 @@ CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
CONFIG_KPROBES_SANITY_TEST=y
|
||||
CONFIG_S390_PTDUMP=y
|
||||
CONFIG_CRYPTO_CRYPTD=m
|
||||
|
||||
@@ -15,6 +15,7 @@ generic-y += local64.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += mm-arch-hooks.h
|
||||
generic-y += preempt.h
|
||||
generic-y += rwsem.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += unaligned.h
|
||||
generic-y += word-at-a-time.h
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
#ifndef _ASM_S390_ALTERNATIVE_H
|
||||
#define _ASM_S390_ALTERNATIVE_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
struct alt_instr {
|
||||
s32 instr_offset; /* original instruction */
|
||||
s32 repl_offset; /* offset to replacement instruction */
|
||||
u16 facility; /* facility bit set for replacement */
|
||||
u8 instrlen; /* length of original instruction */
|
||||
u8 replacementlen; /* length of new instruction */
|
||||
} __packed;
|
||||
|
||||
#ifdef CONFIG_ALTERNATIVES
|
||||
extern void apply_alternative_instructions(void);
|
||||
extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
|
||||
#else
|
||||
static inline void apply_alternative_instructions(void) {};
|
||||
static inline void apply_alternatives(struct alt_instr *start,
|
||||
struct alt_instr *end) {};
|
||||
#endif
|
||||
/*
|
||||
* |661: |662: |6620 |663:
|
||||
* +-----------+---------------------+
|
||||
* | oldinstr | oldinstr_padding |
|
||||
* | +----------+----------+
|
||||
* | | | |
|
||||
* | | >6 bytes |6/4/2 nops|
|
||||
* | |6 bytes jg----------->
|
||||
* +-----------+---------------------+
|
||||
* ^^ static padding ^^
|
||||
*
|
||||
* .altinstr_replacement section
|
||||
* +---------------------+-----------+
|
||||
* |6641: |6651:
|
||||
* | alternative instr 1 |
|
||||
* +-----------+---------+- - - - - -+
|
||||
* |6642: |6652: |
|
||||
* | alternative instr 2 | padding
|
||||
* +---------------------+- - - - - -+
|
||||
* ^ runtime ^
|
||||
*
|
||||
* .altinstructions section
|
||||
* +---------------------------------+
|
||||
* | alt_instr entries for each |
|
||||
* | alternative instr |
|
||||
* +---------------------------------+
|
||||
*/
|
||||
|
||||
#define b_altinstr(num) "664"#num
|
||||
#define e_altinstr(num) "665"#num
|
||||
|
||||
#define e_oldinstr_pad_end "663"
|
||||
#define oldinstr_len "662b-661b"
|
||||
#define oldinstr_total_len e_oldinstr_pad_end"b-661b"
|
||||
#define altinstr_len(num) e_altinstr(num)"b-"b_altinstr(num)"b"
|
||||
#define oldinstr_pad_len(num) \
|
||||
"-(((" altinstr_len(num) ")-(" oldinstr_len ")) > 0) * " \
|
||||
"((" altinstr_len(num) ")-(" oldinstr_len "))"
|
||||
|
||||
#define INSTR_LEN_SANITY_CHECK(len) \
|
||||
".if " len " > 254\n" \
|
||||
"\t.error \"cpu alternatives does not support instructions " \
|
||||
"blocks > 254 bytes\"\n" \
|
||||
".endif\n" \
|
||||
".if (" len ") %% 2\n" \
|
||||
"\t.error \"cpu alternatives instructions length is odd\"\n" \
|
||||
".endif\n"
|
||||
|
||||
#define OLDINSTR_PADDING(oldinstr, num) \
|
||||
".if " oldinstr_pad_len(num) " > 6\n" \
|
||||
"\tjg " e_oldinstr_pad_end "f\n" \
|
||||
"6620:\n" \
|
||||
"\t.fill (" oldinstr_pad_len(num) " - (6620b-662b)) / 2, 2, 0x0700\n" \
|
||||
".else\n" \
|
||||
"\t.fill " oldinstr_pad_len(num) " / 6, 6, 0xc0040000\n" \
|
||||
"\t.fill " oldinstr_pad_len(num) " %% 6 / 4, 4, 0x47000000\n" \
|
||||
"\t.fill " oldinstr_pad_len(num) " %% 6 %% 4 / 2, 2, 0x0700\n" \
|
||||
".endif\n"
|
||||
|
||||
#define OLDINSTR(oldinstr, num) \
|
||||
"661:\n\t" oldinstr "\n662:\n" \
|
||||
OLDINSTR_PADDING(oldinstr, num) \
|
||||
e_oldinstr_pad_end ":\n" \
|
||||
INSTR_LEN_SANITY_CHECK(oldinstr_len)
|
||||
|
||||
#define OLDINSTR_2(oldinstr, num1, num2) \
|
||||
"661:\n\t" oldinstr "\n662:\n" \
|
||||
".if " altinstr_len(num1) " < " altinstr_len(num2) "\n" \
|
||||
OLDINSTR_PADDING(oldinstr, num2) \
|
||||
".else\n" \
|
||||
OLDINSTR_PADDING(oldinstr, num1) \
|
||||
".endif\n" \
|
||||
e_oldinstr_pad_end ":\n" \
|
||||
INSTR_LEN_SANITY_CHECK(oldinstr_len)
|
||||
|
||||
#define ALTINSTR_ENTRY(facility, num) \
|
||||
"\t.long 661b - .\n" /* old instruction */ \
|
||||
"\t.long " b_altinstr(num)"b - .\n" /* alt instruction */ \
|
||||
"\t.word " __stringify(facility) "\n" /* facility bit */ \
|
||||
"\t.byte " oldinstr_total_len "\n" /* source len */ \
|
||||
"\t.byte " altinstr_len(num) "\n" /* alt instruction len */
|
||||
|
||||
#define ALTINSTR_REPLACEMENT(altinstr, num) /* replacement */ \
|
||||
b_altinstr(num)":\n\t" altinstr "\n" e_altinstr(num) ":\n" \
|
||||
INSTR_LEN_SANITY_CHECK(altinstr_len(num))
|
||||
|
||||
#ifdef CONFIG_ALTERNATIVES
|
||||
/* alternative assembly primitive: */
|
||||
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
||||
".pushsection .altinstr_replacement, \"ax\"\n" \
|
||||
ALTINSTR_REPLACEMENT(altinstr, 1) \
|
||||
".popsection\n" \
|
||||
OLDINSTR(oldinstr, 1) \
|
||||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ALTINSTR_ENTRY(facility, 1) \
|
||||
".popsection\n"
|
||||
|
||||
#define ALTERNATIVE_2(oldinstr, altinstr1, facility1, altinstr2, facility2)\
|
||||
".pushsection .altinstr_replacement, \"ax\"\n" \
|
||||
ALTINSTR_REPLACEMENT(altinstr1, 1) \
|
||||
ALTINSTR_REPLACEMENT(altinstr2, 2) \
|
||||
".popsection\n" \
|
||||
OLDINSTR_2(oldinstr, 1, 2) \
|
||||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ALTINSTR_ENTRY(facility1, 1) \
|
||||
ALTINSTR_ENTRY(facility2, 2) \
|
||||
".popsection\n"
|
||||
#else
|
||||
/* Alternative instructions are disabled, let's put just oldinstr in */
|
||||
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
||||
oldinstr "\n"
|
||||
|
||||
#define ALTERNATIVE_2(oldinstr, altinstr1, facility1, altinstr2, facility2) \
|
||||
oldinstr "\n"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Alternative instructions for different CPU types or capabilities.
|
||||
*
|
||||
* This allows to use optimized instructions even on generic binary
|
||||
* kernels.
|
||||
*
|
||||
* oldinstr is padded with jump and nops at compile time if altinstr is
|
||||
* longer. altinstr is padded with jump and nops at run-time during patching.
|
||||
*
|
||||
* For non barrier like inlines please define new variants
|
||||
* without volatile and memory clobber.
|
||||
*/
|
||||
#define alternative(oldinstr, altinstr, facility) \
|
||||
asm volatile(ALTERNATIVE(oldinstr, altinstr, facility) : : : "memory")
|
||||
|
||||
#define alternative_2(oldinstr, altinstr1, facility1, altinstr2, facility2) \
|
||||
asm volatile(ALTERNATIVE_2(oldinstr, altinstr1, facility1, \
|
||||
altinstr2, facility2) ::: "memory")
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_S390_ALTERNATIVE_H */
|
||||
@@ -28,26 +28,27 @@ static void s390_arch_random_generate(u8 *buf, unsigned int nbytes)
|
||||
|
||||
static inline bool arch_has_random(void)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool arch_has_random_seed(void)
|
||||
{
|
||||
return arch_has_random();
|
||||
if (static_branch_likely(&s390_arch_random_available))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool arch_get_random_long(unsigned long *v)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available)) {
|
||||
s390_arch_random_generate((u8 *)v, sizeof(*v));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool arch_get_random_int(unsigned int *v)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool arch_get_random_seed_long(unsigned long *v)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available)) {
|
||||
s390_arch_random_generate((u8 *)v, sizeof(*v));
|
||||
@@ -56,14 +57,13 @@ static inline bool arch_get_random_int(unsigned int *v)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool arch_get_random_seed_long(unsigned long *v)
|
||||
{
|
||||
return arch_get_random_long(v);
|
||||
}
|
||||
|
||||
static inline bool arch_get_random_seed_int(unsigned int *v)
|
||||
{
|
||||
return arch_get_random_int(v);
|
||||
if (static_branch_likely(&s390_arch_random_available)) {
|
||||
s390_arch_random_generate((u8 *)v, sizeof(*v));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ARCH_RANDOM */
|
||||
|
||||
@@ -40,19 +40,24 @@ __ATOMIC_OPS(__atomic64_xor, long, "laxg")
|
||||
#undef __ATOMIC_OPS
|
||||
#undef __ATOMIC_OP
|
||||
|
||||
static inline void __atomic_add_const(int val, int *ptr)
|
||||
{
|
||||
asm volatile(
|
||||
" asi %[ptr],%[val]\n"
|
||||
: [ptr] "+Q" (*ptr) : [val] "i" (val) : "cc");
|
||||
#define __ATOMIC_CONST_OP(op_name, op_type, op_string, op_barrier) \
|
||||
static inline void op_name(op_type val, op_type *ptr) \
|
||||
{ \
|
||||
asm volatile( \
|
||||
op_string " %[ptr],%[val]\n" \
|
||||
op_barrier \
|
||||
: [ptr] "+Q" (*ptr) : [val] "i" (val) : "cc", "memory");\
|
||||
}
|
||||
|
||||
static inline void __atomic64_add_const(long val, long *ptr)
|
||||
{
|
||||
asm volatile(
|
||||
" agsi %[ptr],%[val]\n"
|
||||
: [ptr] "+Q" (*ptr) : [val] "i" (val) : "cc");
|
||||
}
|
||||
#define __ATOMIC_CONST_OPS(op_name, op_type, op_string) \
|
||||
__ATOMIC_CONST_OP(op_name, op_type, op_string, "\n") \
|
||||
__ATOMIC_CONST_OP(op_name##_barrier, op_type, op_string, "bcr 14,0\n")
|
||||
|
||||
__ATOMIC_CONST_OPS(__atomic_add_const, int, "asi")
|
||||
__ATOMIC_CONST_OPS(__atomic64_add_const, long, "agsi")
|
||||
|
||||
#undef __ATOMIC_CONST_OPS
|
||||
#undef __ATOMIC_CONST_OP
|
||||
|
||||
#else /* CONFIG_HAVE_MARCH_Z196_FEATURES */
|
||||
|
||||
@@ -108,6 +113,11 @@ __ATOMIC64_OPS(__atomic64_xor, "xgr")
|
||||
|
||||
#undef __ATOMIC64_OPS
|
||||
|
||||
#define __atomic_add_const(val, ptr) __atomic_add(val, ptr)
|
||||
#define __atomic_add_const_barrier(val, ptr) __atomic_add(val, ptr)
|
||||
#define __atomic64_add_const(val, ptr) __atomic64_add(val, ptr)
|
||||
#define __atomic64_add_const_barrier(val, ptr) __atomic64_add(val, ptr)
|
||||
|
||||
#endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
|
||||
|
||||
static inline int __atomic_cmpxchg(int *ptr, int old, int new)
|
||||
|
||||
@@ -42,6 +42,7 @@ struct ccwgroup_device {
|
||||
* @thaw: undo work done in @freeze
|
||||
* @restore: callback for restoring after hibernation
|
||||
* @driver: embedded driver structure
|
||||
* @ccw_driver: supported ccw_driver (optional)
|
||||
*/
|
||||
struct ccwgroup_driver {
|
||||
int (*setup) (struct ccwgroup_device *);
|
||||
@@ -56,6 +57,7 @@ struct ccwgroup_driver {
|
||||
int (*restore)(struct ccwgroup_device *);
|
||||
|
||||
struct device_driver driver;
|
||||
struct ccw_driver *ccw_driver;
|
||||
};
|
||||
|
||||
extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* CP Assist for Cryptographic Functions (CPACF)
|
||||
*
|
||||
* Copyright IBM Corp. 2003, 2016
|
||||
* Copyright IBM Corp. 2003, 2017
|
||||
* Author(s): Thomas Spatzier
|
||||
* Jan Glauber
|
||||
* Harald Freudenberger (freude@de.ibm.com)
|
||||
@@ -134,6 +134,22 @@
|
||||
#define CPACF_PRNO_TRNG_Q_R2C_RATIO 0x70
|
||||
#define CPACF_PRNO_TRNG 0x72
|
||||
|
||||
/*
|
||||
* Function codes for the KMA (CIPHER MESSAGE WITH AUTHENTICATION)
|
||||
* instruction
|
||||
*/
|
||||
#define CPACF_KMA_QUERY 0x00
|
||||
#define CPACF_KMA_GCM_AES_128 0x12
|
||||
#define CPACF_KMA_GCM_AES_192 0x13
|
||||
#define CPACF_KMA_GCM_AES_256 0x14
|
||||
|
||||
/*
|
||||
* Flags for the KMA (CIPHER MESSAGE WITH AUTHENTICATION) instruction
|
||||
*/
|
||||
#define CPACF_KMA_LPC 0x100 /* Last-Plaintext/Ciphertext */
|
||||
#define CPACF_KMA_LAAD 0x200 /* Last-AAD */
|
||||
#define CPACF_KMA_HS 0x400 /* Hash-subkey Supplied */
|
||||
|
||||
typedef struct { unsigned char bytes[16]; } cpacf_mask_t;
|
||||
|
||||
/**
|
||||
@@ -179,6 +195,8 @@ static inline int __cpacf_check_opcode(unsigned int opcode)
|
||||
return test_facility(77); /* check for MSA4 */
|
||||
case CPACF_PRNO:
|
||||
return test_facility(57); /* check for MSA5 */
|
||||
case CPACF_KMA:
|
||||
return test_facility(146); /* check for MSA8 */
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
@@ -470,4 +488,36 @@ static inline void cpacf_pckmo(long func, void *param)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* cpacf_kma() - executes the KMA (CIPHER MESSAGE WITH AUTHENTICATION)
|
||||
* instruction
|
||||
* @func: the function code passed to KMA; see CPACF_KMA_xxx defines
|
||||
* @param: address of parameter block; see POP for details on each func
|
||||
* @dest: address of destination memory area
|
||||
* @src: address of source memory area
|
||||
* @src_len: length of src operand in bytes
|
||||
* @aad: address of additional authenticated data memory area
|
||||
* @aad_len: length of aad operand in bytes
|
||||
*/
|
||||
static inline void cpacf_kma(unsigned long func, void *param, u8 *dest,
|
||||
const u8 *src, unsigned long src_len,
|
||||
const u8 *aad, unsigned long aad_len)
|
||||
{
|
||||
register unsigned long r0 asm("0") = (unsigned long) func;
|
||||
register unsigned long r1 asm("1") = (unsigned long) param;
|
||||
register unsigned long r2 asm("2") = (unsigned long) src;
|
||||
register unsigned long r3 asm("3") = (unsigned long) src_len;
|
||||
register unsigned long r4 asm("4") = (unsigned long) aad;
|
||||
register unsigned long r5 asm("5") = (unsigned long) aad_len;
|
||||
register unsigned long r6 asm("6") = (unsigned long) dest;
|
||||
|
||||
asm volatile(
|
||||
"0: .insn rrf,%[opc] << 16,%[dst],%[src],%[aad],0\n"
|
||||
" brc 1,0b\n" /* handle partial completion */
|
||||
: [dst] "+a" (r6), [src] "+a" (r2), [slen] "+d" (r3),
|
||||
[aad] "+a" (r4), [alen] "+d" (r5)
|
||||
: [fc] "d" (r0), [pba] "a" (r1), [opc] "i" (CPACF_KMA)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_CPACF_H */
|
||||
|
||||
@@ -8,6 +8,18 @@
|
||||
#ifndef __ASM_CTL_REG_H
|
||||
#define __ASM_CTL_REG_H
|
||||
|
||||
#include <linux/const.h>
|
||||
|
||||
#define CR2_GUARDED_STORAGE _BITUL(63 - 59)
|
||||
|
||||
#define CR14_CHANNEL_REPORT_SUBMASK _BITUL(63 - 35)
|
||||
#define CR14_RECOVERY_SUBMASK _BITUL(63 - 36)
|
||||
#define CR14_DEGRADATION_SUBMASK _BITUL(63 - 37)
|
||||
#define CR14_EXTERNAL_DAMAGE_SUBMASK _BITUL(63 - 38)
|
||||
#define CR14_WARNING_SUBMASK _BITUL(63 - 39)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/bug.h>
|
||||
|
||||
#define __ctl_load(array, low, high) do { \
|
||||
@@ -55,7 +67,11 @@ void smp_ctl_clear_bit(int cr, int bit);
|
||||
union ctlreg0 {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long : 32;
|
||||
unsigned long : 8;
|
||||
unsigned long tcx : 1; /* Transactional-Execution control */
|
||||
unsigned long pifo : 1; /* Transactional-Execution Program-
|
||||
Interruption-Filtering Override */
|
||||
unsigned long : 22;
|
||||
unsigned long : 3;
|
||||
unsigned long lap : 1; /* Low-address-protection control */
|
||||
unsigned long : 4;
|
||||
@@ -71,6 +87,19 @@ union ctlreg0 {
|
||||
};
|
||||
};
|
||||
|
||||
union ctlreg2 {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long : 33;
|
||||
unsigned long ducto : 25;
|
||||
unsigned long : 1;
|
||||
unsigned long gse : 1;
|
||||
unsigned long : 1;
|
||||
unsigned long tds : 1;
|
||||
unsigned long tdc : 2;
|
||||
};
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
# define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
|
||||
# define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
|
||||
@@ -79,4 +108,5 @@ union ctlreg0 {
|
||||
# define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit)
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_CTL_REG_H */
|
||||
|
||||
@@ -14,71 +14,71 @@
|
||||
#include <linux/refcount.h>
|
||||
#include <uapi/asm/debug.h>
|
||||
|
||||
#define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */
|
||||
#define DEBUG_OFF_LEVEL -1 /* level where debug is switched off */
|
||||
#define DEBUG_FLUSH_ALL -1 /* parameter to flush all areas */
|
||||
#define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
|
||||
#define DEBUG_MAX_NAME_LEN 64 /* max length for a debugfs file name */
|
||||
#define DEBUG_DEFAULT_LEVEL 3 /* initial debug level */
|
||||
#define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */
|
||||
#define DEBUG_OFF_LEVEL -1 /* level where debug is switched off */
|
||||
#define DEBUG_FLUSH_ALL -1 /* parameter to flush all areas */
|
||||
#define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
|
||||
#define DEBUG_MAX_NAME_LEN 64 /* max length for a debugfs file name */
|
||||
#define DEBUG_DEFAULT_LEVEL 3 /* initial debug level */
|
||||
|
||||
#define DEBUG_DIR_ROOT "s390dbf" /* name of debug root directory in proc fs */
|
||||
|
||||
#define DEBUG_DATA(entry) (char*)(entry + 1) /* data is stored behind */
|
||||
/* the entry information */
|
||||
#define DEBUG_DATA(entry) (char *)(entry + 1) /* data is stored behind */
|
||||
/* the entry information */
|
||||
|
||||
typedef struct __debug_entry debug_entry_t;
|
||||
|
||||
struct debug_view;
|
||||
|
||||
typedef struct debug_info {
|
||||
struct debug_info* next;
|
||||
struct debug_info* prev;
|
||||
typedef struct debug_info {
|
||||
struct debug_info *next;
|
||||
struct debug_info *prev;
|
||||
refcount_t ref_count;
|
||||
spinlock_t lock;
|
||||
spinlock_t lock;
|
||||
int level;
|
||||
int nr_areas;
|
||||
int pages_per_area;
|
||||
int buf_size;
|
||||
int entry_size;
|
||||
debug_entry_t*** areas;
|
||||
int entry_size;
|
||||
debug_entry_t ***areas;
|
||||
int active_area;
|
||||
int *active_pages;
|
||||
int *active_entries;
|
||||
struct dentry* debugfs_root_entry;
|
||||
struct dentry* debugfs_entries[DEBUG_MAX_VIEWS];
|
||||
struct debug_view* views[DEBUG_MAX_VIEWS];
|
||||
struct dentry *debugfs_root_entry;
|
||||
struct dentry *debugfs_entries[DEBUG_MAX_VIEWS];
|
||||
struct debug_view *views[DEBUG_MAX_VIEWS];
|
||||
char name[DEBUG_MAX_NAME_LEN];
|
||||
umode_t mode;
|
||||
} debug_info_t;
|
||||
|
||||
typedef int (debug_header_proc_t) (debug_info_t* id,
|
||||
struct debug_view* view,
|
||||
typedef int (debug_header_proc_t) (debug_info_t *id,
|
||||
struct debug_view *view,
|
||||
int area,
|
||||
debug_entry_t* entry,
|
||||
char* out_buf);
|
||||
debug_entry_t *entry,
|
||||
char *out_buf);
|
||||
|
||||
typedef int (debug_format_proc_t) (debug_info_t* id,
|
||||
struct debug_view* view, char* out_buf,
|
||||
const char* in_buf);
|
||||
typedef int (debug_prolog_proc_t) (debug_info_t* id,
|
||||
struct debug_view* view,
|
||||
char* out_buf);
|
||||
typedef int (debug_input_proc_t) (debug_info_t* id,
|
||||
struct debug_view* view,
|
||||
struct file* file,
|
||||
typedef int (debug_format_proc_t) (debug_info_t *id,
|
||||
struct debug_view *view, char *out_buf,
|
||||
const char *in_buf);
|
||||
typedef int (debug_prolog_proc_t) (debug_info_t *id,
|
||||
struct debug_view *view,
|
||||
char *out_buf);
|
||||
typedef int (debug_input_proc_t) (debug_info_t *id,
|
||||
struct debug_view *view,
|
||||
struct file *file,
|
||||
const char __user *user_buf,
|
||||
size_t in_buf_size, loff_t* offset);
|
||||
size_t in_buf_size, loff_t *offset);
|
||||
|
||||
int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view,
|
||||
int area, debug_entry_t *entry, char *out_buf);
|
||||
|
||||
int debug_dflt_header_fn(debug_info_t* id, struct debug_view* view,
|
||||
int area, debug_entry_t* entry, char* out_buf);
|
||||
|
||||
struct debug_view {
|
||||
char name[DEBUG_MAX_NAME_LEN];
|
||||
debug_prolog_proc_t* prolog_proc;
|
||||
debug_header_proc_t* header_proc;
|
||||
debug_format_proc_t* format_proc;
|
||||
debug_input_proc_t* input_proc;
|
||||
void* private_data;
|
||||
debug_prolog_proc_t *prolog_proc;
|
||||
debug_header_proc_t *header_proc;
|
||||
debug_format_proc_t *format_proc;
|
||||
debug_input_proc_t *input_proc;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
extern struct debug_view debug_hex_ascii_view;
|
||||
@@ -87,65 +87,67 @@ extern struct debug_view debug_sprintf_view;
|
||||
|
||||
/* do NOT use the _common functions */
|
||||
|
||||
debug_entry_t* debug_event_common(debug_info_t* id, int level,
|
||||
const void* data, int length);
|
||||
debug_entry_t *debug_event_common(debug_info_t *id, int level,
|
||||
const void *data, int length);
|
||||
|
||||
debug_entry_t* debug_exception_common(debug_info_t* id, int level,
|
||||
const void* data, int length);
|
||||
debug_entry_t *debug_exception_common(debug_info_t *id, int level,
|
||||
const void *data, int length);
|
||||
|
||||
/* Debug Feature API: */
|
||||
|
||||
debug_info_t *debug_register(const char *name, int pages, int nr_areas,
|
||||
int buf_size);
|
||||
int buf_size);
|
||||
|
||||
debug_info_t *debug_register_mode(const char *name, int pages, int nr_areas,
|
||||
int buf_size, umode_t mode, uid_t uid,
|
||||
gid_t gid);
|
||||
|
||||
void debug_unregister(debug_info_t* id);
|
||||
void debug_unregister(debug_info_t *id);
|
||||
|
||||
void debug_set_level(debug_info_t* id, int new_level);
|
||||
void debug_set_level(debug_info_t *id, int new_level);
|
||||
|
||||
void debug_set_critical(void);
|
||||
void debug_stop_all(void);
|
||||
|
||||
static inline bool debug_level_enabled(debug_info_t* id, int level)
|
||||
static inline bool debug_level_enabled(debug_info_t *id, int level)
|
||||
{
|
||||
return level <= id->level;
|
||||
}
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_event(debug_info_t* id, int level, void* data, int length)
|
||||
static inline debug_entry_t *debug_event(debug_info_t *id, int level,
|
||||
void *data, int length)
|
||||
{
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_event_common(id,level,data,length);
|
||||
return debug_event_common(id, level, data, length);
|
||||
}
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_int_event(debug_info_t* id, int level, unsigned int tag)
|
||||
static inline debug_entry_t *debug_int_event(debug_info_t *id, int level,
|
||||
unsigned int tag)
|
||||
{
|
||||
unsigned int t=tag;
|
||||
unsigned int t = tag;
|
||||
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_event_common(id,level,&t,sizeof(unsigned int));
|
||||
return debug_event_common(id, level, &t, sizeof(unsigned int));
|
||||
}
|
||||
|
||||
static inline debug_entry_t *
|
||||
debug_long_event (debug_info_t* id, int level, unsigned long tag)
|
||||
static inline debug_entry_t *debug_long_event(debug_info_t *id, int level,
|
||||
unsigned long tag)
|
||||
{
|
||||
unsigned long t=tag;
|
||||
unsigned long t = tag;
|
||||
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_event_common(id,level,&t,sizeof(unsigned long));
|
||||
return debug_event_common(id, level, &t, sizeof(unsigned long));
|
||||
}
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_text_event(debug_info_t* id, int level, const char* txt)
|
||||
static inline debug_entry_t *debug_text_event(debug_info_t *id, int level,
|
||||
const char *txt)
|
||||
{
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_event_common(id,level,txt,strlen(txt));
|
||||
return debug_event_common(id, level, txt, strlen(txt));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -161,6 +163,7 @@ __debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
|
||||
debug_entry_t *__ret; \
|
||||
debug_info_t *__id = _id; \
|
||||
int __level = _level; \
|
||||
\
|
||||
if ((!__id) || (__level > __id->level)) \
|
||||
__ret = NULL; \
|
||||
else \
|
||||
@@ -169,38 +172,40 @@ __debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
|
||||
__ret; \
|
||||
})
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_exception(debug_info_t* id, int level, void* data, int length)
|
||||
static inline debug_entry_t *debug_exception(debug_info_t *id, int level,
|
||||
void *data, int length)
|
||||
{
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_exception_common(id,level,data,length);
|
||||
return debug_exception_common(id, level, data, length);
|
||||
}
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_int_exception(debug_info_t* id, int level, unsigned int tag)
|
||||
static inline debug_entry_t *debug_int_exception(debug_info_t *id, int level,
|
||||
unsigned int tag)
|
||||
{
|
||||
unsigned int t=tag;
|
||||
unsigned int t = tag;
|
||||
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_exception_common(id,level,&t,sizeof(unsigned int));
|
||||
return debug_exception_common(id, level, &t, sizeof(unsigned int));
|
||||
}
|
||||
|
||||
static inline debug_entry_t *
|
||||
debug_long_exception (debug_info_t* id, int level, unsigned long tag)
|
||||
static inline debug_entry_t *debug_long_exception (debug_info_t *id, int level,
|
||||
unsigned long tag)
|
||||
{
|
||||
unsigned long t=tag;
|
||||
unsigned long t = tag;
|
||||
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_exception_common(id,level,&t,sizeof(unsigned long));
|
||||
return debug_exception_common(id, level, &t, sizeof(unsigned long));
|
||||
}
|
||||
|
||||
static inline debug_entry_t*
|
||||
debug_text_exception(debug_info_t* id, int level, const char* txt)
|
||||
static inline debug_entry_t *debug_text_exception(debug_info_t *id, int level,
|
||||
const char *txt)
|
||||
{
|
||||
if ((!id) || (level > id->level) || (id->pages_per_area == 0))
|
||||
return NULL;
|
||||
return debug_exception_common(id,level,txt,strlen(txt));
|
||||
return debug_exception_common(id, level, txt, strlen(txt));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -216,6 +221,7 @@ __debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
|
||||
debug_entry_t *__ret; \
|
||||
debug_info_t *__id = _id; \
|
||||
int __level = _level; \
|
||||
\
|
||||
if ((!__id) || (__level > __id->level)) \
|
||||
__ret = NULL; \
|
||||
else \
|
||||
@@ -224,13 +230,13 @@ __debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
|
||||
__ret; \
|
||||
})
|
||||
|
||||
int debug_register_view(debug_info_t* id, struct debug_view* view);
|
||||
int debug_unregister_view(debug_info_t* id, struct debug_view* view);
|
||||
int debug_register_view(debug_info_t *id, struct debug_view *view);
|
||||
int debug_unregister_view(debug_info_t *id, struct debug_view *view);
|
||||
|
||||
/*
|
||||
define the debug levels:
|
||||
- 0 No debugging output to console or syslog
|
||||
- 1 Log internal errors to syslog, ignore check conditions
|
||||
- 1 Log internal errors to syslog, ignore check conditions
|
||||
- 2 Log internal errors and check conditions to syslog
|
||||
- 3 Log internal errors to console, log check conditions to syslog
|
||||
- 4 Log internal errors and check conditions to console
|
||||
@@ -248,17 +254,17 @@ int debug_unregister_view(debug_info_t* id, struct debug_view* view);
|
||||
#define INTERNAL_DEBMSG(x,y...) "D" __FILE__ "%d: " x, __LINE__, y
|
||||
|
||||
#if DEBUG_LEVEL > 0
|
||||
#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER x )
|
||||
#define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER x )
|
||||
#define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER x )
|
||||
#define PRINT_FATAL(x...) panic ( PRINTK_HEADER x )
|
||||
#define PRINT_DEBUG(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#define PRINT_INFO(x...) printk(KERN_INFO PRINTK_HEADER x)
|
||||
#define PRINT_WARN(x...) printk(KERN_WARNING PRINTK_HEADER x)
|
||||
#define PRINT_ERR(x...) printk(KERN_ERR PRINTK_HEADER x)
|
||||
#define PRINT_FATAL(x...) panic(PRINTK_HEADER x)
|
||||
#else
|
||||
#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#endif /* DASD_DEBUG */
|
||||
#define PRINT_DEBUG(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#define PRINT_INFO(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#define PRINT_WARN(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#define PRINT_ERR(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#define PRINT_FATAL(x...) printk(KERN_DEBUG PRINTK_HEADER x)
|
||||
#endif /* DASD_DEBUG */
|
||||
|
||||
#endif /* DEBUG_H */
|
||||
#endif /* DEBUG_H */
|
||||
|
||||
@@ -9,32 +9,7 @@
|
||||
#ifndef __ASM_S390_DIS_H__
|
||||
#define __ASM_S390_DIS_H__
|
||||
|
||||
/* Type of operand */
|
||||
#define OPERAND_GPR 0x1 /* Operand printed as %rx */
|
||||
#define OPERAND_FPR 0x2 /* Operand printed as %fx */
|
||||
#define OPERAND_AR 0x4 /* Operand printed as %ax */
|
||||
#define OPERAND_CR 0x8 /* Operand printed as %cx */
|
||||
#define OPERAND_VR 0x10 /* Operand printed as %vx */
|
||||
#define OPERAND_DISP 0x20 /* Operand printed as displacement */
|
||||
#define OPERAND_BASE 0x40 /* Operand printed as base register */
|
||||
#define OPERAND_INDEX 0x80 /* Operand printed as index register */
|
||||
#define OPERAND_PCREL 0x100 /* Operand printed as pc-relative symbol */
|
||||
#define OPERAND_SIGNED 0x200 /* Operand printed as signed value */
|
||||
#define OPERAND_LENGTH 0x400 /* Operand printed as length (+1) */
|
||||
|
||||
|
||||
struct s390_operand {
|
||||
int bits; /* The number of bits in the operand. */
|
||||
int shift; /* The number of bits to shift. */
|
||||
int flags; /* One bit syntax flags. */
|
||||
};
|
||||
|
||||
struct s390_insn {
|
||||
const char name[5];
|
||||
unsigned char opfrag;
|
||||
unsigned char format;
|
||||
};
|
||||
|
||||
#include <generated/dis.h>
|
||||
|
||||
static inline int insn_length(unsigned char code)
|
||||
{
|
||||
@@ -45,7 +20,6 @@ struct pt_regs;
|
||||
|
||||
void show_code(struct pt_regs *regs);
|
||||
void print_fn_code(unsigned char *code, unsigned long len);
|
||||
int insn_to_mnemonic(unsigned char *instruction, char *buf, unsigned int len);
|
||||
struct s390_insn *find_insn(unsigned char *code);
|
||||
|
||||
static inline int is_known_insn(unsigned char *code)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user