mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Merge 586592478b ("Merge tag 's390-5.11-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux") into android-mainline
Steps on the way to 5.11-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib0e3f340d1509c0d9663fc1f0bf68c772d9ffac0
This commit is contained in:
@@ -1,27 +1,159 @@
|
||||
What: /sys/firmware/sgi_uv/
|
||||
Date: August 2008
|
||||
Contact: Russ Anderson <rja@sgi.com>
|
||||
Date: September 2020
|
||||
Contact: Justin Ernst <justin.ernst@hpe.com>
|
||||
Description:
|
||||
The /sys/firmware/sgi_uv directory contains information
|
||||
about the SGI UV platform.
|
||||
about the UV platform.
|
||||
|
||||
Under that directory are a number of files::
|
||||
Under that directory are a number of read-only attributes::
|
||||
|
||||
archtype
|
||||
hub_type
|
||||
hubless
|
||||
partition_id
|
||||
coherence_id
|
||||
uv_type
|
||||
|
||||
The archtype entry contains the UV architecture type that
|
||||
is used to select arch-dependent addresses and features.
|
||||
It can be set via the OEM_ID in the ACPI MADT table or by
|
||||
UVsystab entry both passed from UV BIOS.
|
||||
|
||||
The hub_type entry is used to select the type of hub which is
|
||||
similar to uv_type but encoded in a binary format. Include
|
||||
the file uv_hub.h to get the definitions.
|
||||
|
||||
The hubless entry basically is present and set only if there
|
||||
is no hub. In this case the hub_type entry is not present.
|
||||
|
||||
The partition_id entry contains the partition id.
|
||||
SGI UV systems can be partitioned into multiple physical
|
||||
UV systems can be partitioned into multiple physical
|
||||
machines, which each partition running a unique copy
|
||||
of the operating system. Each partition will have a unique
|
||||
partition id. To display the partition id, use the command::
|
||||
|
||||
cat /sys/firmware/sgi_uv/partition_id
|
||||
of the operating system. Each partition will have a unique
|
||||
partition id.
|
||||
|
||||
The coherence_id entry contains the coherence id.
|
||||
A partitioned SGI UV system can have one or more coherence
|
||||
domain. The coherence id indicates which coherence domain
|
||||
this partition is in. To display the coherence id, use the
|
||||
command::
|
||||
A partitioned UV system can have one or more coherence
|
||||
domains. The coherence id indicates which coherence domain
|
||||
this partition is in.
|
||||
|
||||
cat /sys/firmware/sgi_uv/coherence_id
|
||||
The uv_type entry contains the hub revision number.
|
||||
This value can be used to identify the UV system version::
|
||||
"0.*" = Hubless UV ('*' is subtype)
|
||||
|
||||
"3.0" = UV2
|
||||
"5.0" = UV3
|
||||
"7.0" = UV4
|
||||
"7.1" = UV4a
|
||||
"9.0" = UV5
|
||||
|
||||
The /sys/firmware/sgi_uv directory also contains two directories::
|
||||
|
||||
hubs/
|
||||
pcibuses/
|
||||
|
||||
The hubs directory contains a number of hub objects, each representing
|
||||
a UV Hub visible to the BIOS. Each hub object's name is appended by a
|
||||
unique ordinal value (ex. /sys/firmware/sgi_uv/hubs/hub_5)
|
||||
|
||||
Each hub object directory contains a number of read-only attributes::
|
||||
|
||||
cnode
|
||||
location
|
||||
name
|
||||
nasid
|
||||
shared
|
||||
this_partition
|
||||
|
||||
The cnode entry contains the cnode number of the corresponding hub.
|
||||
If a cnode value is not applicable, the value returned will be -1.
|
||||
|
||||
The location entry contains the location string of the corresponding hub.
|
||||
This value is used to physically identify a hub within a system.
|
||||
|
||||
The name entry contains the name of the corresponding hub. This name can
|
||||
be two variants::
|
||||
|
||||
"UVHub x.x" = A 'node' ASIC, connecting a CPU to the interconnect
|
||||
fabric. The 'x.x' value represents the ASIC revision.
|
||||
(ex. 'UVHub 5.0')
|
||||
|
||||
"NLxRouter" = A 'router ASIC, only connecting other ASICs to
|
||||
the interconnect fabric. The 'x' value representing
|
||||
the fabric technology version. (ex. 'NL8Router')
|
||||
|
||||
The nasid entry contains the nasid number of the corresponding hub.
|
||||
If a nasid value is not applicable, the value returned will be -1.
|
||||
|
||||
The shared entry contains a boolean value describing whether the
|
||||
corresponding hub is shared between system partitions.
|
||||
|
||||
The this_partition entry contains a boolean value describing whether
|
||||
the corresponding hub is local to the current partition.
|
||||
|
||||
Each hub object directory also contains a number of port objects,
|
||||
each representing a fabric port on the corresponding hub.
|
||||
A port object's name is appended by a unique ordinal value
|
||||
(ex. /sys/firmware/sgi_uv/hubs/hub_5/port_3)
|
||||
|
||||
Each port object directory contains a number of read-only attributes::
|
||||
|
||||
conn_hub
|
||||
conn_port
|
||||
|
||||
The conn_hub entry contains a value representing the unique
|
||||
oridinal value of the hub on the other end of the fabric
|
||||
cable plugged into the port. If the port is disconnected,
|
||||
the value returned will be -1.
|
||||
|
||||
The conn_port entry contains a value representing the unique
|
||||
oridinal value of the port on the other end of the fabric cable
|
||||
plugged into the port. If the port is disconnected, the value
|
||||
returned will be -1.
|
||||
|
||||
Ex:
|
||||
A value of '3' is read from:
|
||||
/sys/firmware/sgi_uv/hubs/hub_5/port_3/conn_hub
|
||||
|
||||
and a value of '6' is read from:
|
||||
/sys/firmware/sgi_uv/hubs/hub_5/port_3/conn_port
|
||||
|
||||
representing that this port is connected to:
|
||||
/sys/firmware/sgi_uv/hubs/hub_3/port_6
|
||||
|
||||
The pcibuses directory contains a number of PCI bus objects.
|
||||
Each PCI bus object's name is appended by its PCI bus address.
|
||||
(ex. pcibus_0003:80)
|
||||
|
||||
Each pcibus object has a number of possible read-only attributes::
|
||||
|
||||
type
|
||||
location
|
||||
slot
|
||||
ppb_addr
|
||||
iio_stack
|
||||
|
||||
The type entry contains a value describing the type of IO at
|
||||
the corresponding PCI bus address. Known possible values
|
||||
across all UV versions are::
|
||||
|
||||
BASE IO
|
||||
PCIe IO
|
||||
PCIe SLOT
|
||||
NODE IO
|
||||
Riser
|
||||
PPB
|
||||
|
||||
The location entry contains the location string of the UV Hub
|
||||
of the CPU physically connected to the corresponding PCI bus.
|
||||
|
||||
The slot entry contains the physical slot number of the
|
||||
corresponding PCI bus. This value is used to physically locate
|
||||
PCI cards within a system.
|
||||
|
||||
The ppb_addr entry contains the PCI address string of the
|
||||
bridged PCI bus. This entry is only present when the PCI bus
|
||||
object type is 'PPB'.
|
||||
|
||||
The iio_stack entry contains a value describing the IIO stack
|
||||
number that the corresponding PCI bus object is connected to.
|
||||
|
||||
@@ -3379,6 +3379,8 @@
|
||||
|
||||
nosep [BUGS=X86-32] Disables x86 SYSENTER/SYSEXIT support.
|
||||
|
||||
nosgx [X86-64,SGX] Disables Intel SGX kernel support.
|
||||
|
||||
nosmp [SMP] Tells an SMP kernel to act as a UP kernel,
|
||||
and disable the IO APIC. legacy for "maxcpus=0".
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/crypto/intel,keembay-ocs-aes.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Intel Keem Bay OCS AES Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Daniele Alessandrelli <daniele.alessandrelli@intel.com>
|
||||
|
||||
description:
|
||||
The Intel Keem Bay Offload and Crypto Subsystem (OCS) AES engine provides
|
||||
hardware-accelerated AES/SM4 encryption/decryption.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: intel,keembay-ocs-aes
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
crypto@30008000 {
|
||||
compatible = "intel,keembay-ocs-aes";
|
||||
reg = <0x30008000 0x1000>;
|
||||
interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&scmi_clk 95>;
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
Aspeed AST2500 SoC EDAC node
|
||||
Aspeed BMC SoC EDAC node
|
||||
|
||||
The Aspeed AST2500 SoC supports DDR3 and DDR4 memory with and without ECC (error
|
||||
The Aspeed BMC SoC supports DDR3 and DDR4 memory with and without ECC (error
|
||||
correction check).
|
||||
|
||||
The memory controller supports SECDED (single bit error correction, double bit
|
||||
@@ -11,7 +11,10 @@ Note, the bootloader must configure ECC mode in the memory controller.
|
||||
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "aspeed,ast2500-sdram-edac"
|
||||
- compatible: should be one of
|
||||
- "aspeed,ast2400-sdram-edac"
|
||||
- "aspeed,ast2500-sdram-edac"
|
||||
- "aspeed,ast2600-sdram-edac"
|
||||
- reg: sdram controller register set should be <0x1e6e0000 0x174>
|
||||
- interrupts: should be AVIC interrupt #0
|
||||
|
||||
|
||||
@@ -27,9 +27,9 @@ automatically verified against the file's Merkle tree. Reads of any
|
||||
corrupted data, including mmap reads, will fail.
|
||||
|
||||
Userspace can use another ioctl to retrieve the root hash (actually
|
||||
the "file measurement", which is a hash that includes the root hash)
|
||||
that fs-verity is enforcing for the file. This ioctl executes in
|
||||
constant time, regardless of the file size.
|
||||
the "fs-verity file digest", which is a hash that includes the Merkle
|
||||
tree root hash) that fs-verity is enforcing for the file. This ioctl
|
||||
executes in constant time, regardless of the file size.
|
||||
|
||||
fs-verity is essentially a way to hash a file in constant time,
|
||||
subject to the caveat that reads which would violate the hash will
|
||||
@@ -177,9 +177,10 @@ FS_IOC_ENABLE_VERITY can fail with the following errors:
|
||||
FS_IOC_MEASURE_VERITY
|
||||
---------------------
|
||||
|
||||
The FS_IOC_MEASURE_VERITY ioctl retrieves the measurement of a verity
|
||||
file. The file measurement is a digest that cryptographically
|
||||
identifies the file contents that are being enforced on reads.
|
||||
The FS_IOC_MEASURE_VERITY ioctl retrieves the digest of a verity file.
|
||||
The fs-verity file digest is a cryptographic digest that identifies
|
||||
the file contents that are being enforced on reads; it is computed via
|
||||
a Merkle tree and is different from a traditional full-file digest.
|
||||
|
||||
This ioctl takes in a pointer to a variable-length structure::
|
||||
|
||||
@@ -197,7 +198,7 @@ On success, 0 is returned and the kernel fills in the structure as
|
||||
follows:
|
||||
|
||||
- ``digest_algorithm`` will be the hash algorithm used for the file
|
||||
measurement. It will match ``fsverity_enable_arg::hash_algorithm``.
|
||||
digest. It will match ``fsverity_enable_arg::hash_algorithm``.
|
||||
- ``digest_size`` will be the size of the digest in bytes, e.g. 32
|
||||
for SHA-256. (This can be redundant with ``digest_algorithm``.)
|
||||
- ``digest`` will be the actual bytes of the digest.
|
||||
@@ -257,25 +258,24 @@ non-verity one, with the following exceptions:
|
||||
with EIO (for read()) or SIGBUS (for mmap() reads).
|
||||
|
||||
- If the sysctl "fs.verity.require_signatures" is set to 1 and the
|
||||
file's verity measurement is not signed by a key in the fs-verity
|
||||
keyring, then opening the file will fail. See `Built-in signature
|
||||
verification`_.
|
||||
file is not signed by a key in the fs-verity keyring, then opening
|
||||
the file will fail. See `Built-in signature verification`_.
|
||||
|
||||
Direct access to the Merkle tree is not supported. Therefore, if a
|
||||
verity file is copied, or is backed up and restored, then it will lose
|
||||
its "verity"-ness. fs-verity is primarily meant for files like
|
||||
executables that are managed by a package manager.
|
||||
|
||||
File measurement computation
|
||||
============================
|
||||
File digest computation
|
||||
=======================
|
||||
|
||||
This section describes how fs-verity hashes the file contents using a
|
||||
Merkle tree to produce the "file measurement" which cryptographically
|
||||
identifies the file contents. This algorithm is the same for all
|
||||
filesystems that support fs-verity.
|
||||
Merkle tree to produce the digest which cryptographically identifies
|
||||
the file contents. This algorithm is the same for all filesystems
|
||||
that support fs-verity.
|
||||
|
||||
Userspace only needs to be aware of this algorithm if it needs to
|
||||
compute the file measurement itself, e.g. in order to sign the file.
|
||||
compute fs-verity file digests itself, e.g. in order to sign files.
|
||||
|
||||
.. _fsverity_merkle_tree:
|
||||
|
||||
@@ -325,26 +325,22 @@ can't a distinguish a large file from a small second file whose data
|
||||
is exactly the top-level hash block of the first file. Ambiguities
|
||||
also arise from the convention of padding to the next block boundary.
|
||||
|
||||
To solve this problem, the verity file measurement is actually
|
||||
computed as a hash of the following structure, which contains the
|
||||
Merkle tree root hash as well as other fields such as the file size::
|
||||
To solve this problem, the fs-verity file digest is actually computed
|
||||
as a hash of the following structure, which contains the Merkle tree
|
||||
root hash as well as other fields such as the file size::
|
||||
|
||||
struct fsverity_descriptor {
|
||||
__u8 version; /* must be 1 */
|
||||
__u8 hash_algorithm; /* Merkle tree hash algorithm */
|
||||
__u8 log_blocksize; /* log2 of size of data and tree blocks */
|
||||
__u8 salt_size; /* size of salt in bytes; 0 if none */
|
||||
__le32 sig_size; /* must be 0 */
|
||||
__le32 __reserved_0x04; /* must be 0 */
|
||||
__le64 data_size; /* size of file the Merkle tree is built over */
|
||||
__u8 root_hash[64]; /* Merkle tree root hash */
|
||||
__u8 salt[32]; /* salt prepended to each hashed block */
|
||||
__u8 __reserved[144]; /* must be 0's */
|
||||
};
|
||||
|
||||
Note that the ``sig_size`` field must be set to 0 for the purpose of
|
||||
computing the file measurement, even if a signature was provided (or
|
||||
will be provided) to `FS_IOC_ENABLE_VERITY`_.
|
||||
|
||||
Built-in signature verification
|
||||
===============================
|
||||
|
||||
@@ -359,20 +355,20 @@ kernel. Specifically, it adds support for:
|
||||
certificates from being added.
|
||||
|
||||
2. `FS_IOC_ENABLE_VERITY`_ accepts a pointer to a PKCS#7 formatted
|
||||
detached signature in DER format of the file measurement. On
|
||||
success, this signature is persisted alongside the Merkle tree.
|
||||
detached signature in DER format of the file's fs-verity digest.
|
||||
On success, this signature is persisted alongside the Merkle tree.
|
||||
Then, any time the file is opened, the kernel will verify the
|
||||
file's actual measurement against this signature, using the
|
||||
certificates in the ".fs-verity" keyring.
|
||||
file's actual digest against this signature, using the certificates
|
||||
in the ".fs-verity" keyring.
|
||||
|
||||
3. A new sysctl "fs.verity.require_signatures" is made available.
|
||||
When set to 1, the kernel requires that all verity files have a
|
||||
correctly signed file measurement as described in (2).
|
||||
correctly signed digest as described in (2).
|
||||
|
||||
File measurements must be signed in the following format, which is
|
||||
similar to the structure used by `FS_IOC_MEASURE_VERITY`_::
|
||||
fs-verity file digests must be signed in the following format, which
|
||||
is similar to the structure used by `FS_IOC_MEASURE_VERITY`_::
|
||||
|
||||
struct fsverity_signed_digest {
|
||||
struct fsverity_formatted_digest {
|
||||
char magic[8]; /* must be "FSVerity" */
|
||||
__le16 digest_algorithm;
|
||||
__le16 digest_size;
|
||||
@@ -421,8 +417,8 @@ can only be set by `FS_IOC_ENABLE_VERITY`_, and it cannot be cleared.
|
||||
|
||||
ext4 also supports encryption, which can be used simultaneously with
|
||||
fs-verity. In this case, the plaintext data is verified rather than
|
||||
the ciphertext. This is necessary in order to make the file
|
||||
measurement meaningful, since every file is encrypted differently.
|
||||
the ciphertext. This is necessary in order to make the fs-verity file
|
||||
digest meaningful, since every file is encrypted differently.
|
||||
|
||||
ext4 stores the verity metadata (Merkle tree and fsverity_descriptor)
|
||||
past the end of the file, starting at the first 64K boundary beyond
|
||||
@@ -592,8 +588,8 @@ weren't already directly answered in other parts of this document.
|
||||
:Q: Isn't fs-verity useless because the attacker can just modify the
|
||||
hashes in the Merkle tree, which is stored on-disk?
|
||||
:A: To verify the authenticity of an fs-verity file you must verify
|
||||
the authenticity of the "file measurement", which is basically the
|
||||
root hash of the Merkle tree. See `Use cases`_.
|
||||
the authenticity of the "fs-verity file digest", which
|
||||
incorporates the root hash of the Merkle tree. See `Use cases`_.
|
||||
|
||||
:Q: Isn't fs-verity useless because the attacker can just replace a
|
||||
verity file with a non-verity one?
|
||||
|
||||
@@ -323,6 +323,7 @@ Code Seq# Include File Comments
|
||||
<mailto:tlewis@mindspring.com>
|
||||
0xA3 90-9F linux/dtlk.h
|
||||
0xA4 00-1F uapi/linux/tee.h Generic TEE subsystem
|
||||
0xA4 00-1F uapi/asm/sgx.h <mailto:linux-sgx@vger.kernel.org>
|
||||
0xAA 00-3F linux/uapi/linux/userfaultfd.h
|
||||
0xAB 00-1F linux/nbd.h
|
||||
0xAC 00-1F linux/raw.h
|
||||
|
||||
@@ -27,9 +27,10 @@ x86-specific Documentation
|
||||
pti
|
||||
mds
|
||||
microcode
|
||||
resctrl_ui
|
||||
resctrl
|
||||
tsx_async_abort
|
||||
usb-legacy-support
|
||||
i386/index
|
||||
x86_64/index
|
||||
sva
|
||||
sgx
|
||||
|
||||
@@ -1209,3 +1209,96 @@ View the llc occupancy snapshot::
|
||||
|
||||
# cat /sys/fs/resctrl/p1/mon_data/mon_L3_00/llc_occupancy
|
||||
11234000
|
||||
|
||||
Intel RDT Errata
|
||||
================
|
||||
|
||||
Intel MBM Counters May Report System Memory Bandwidth Incorrectly
|
||||
-----------------------------------------------------------------
|
||||
|
||||
Errata SKX99 for Skylake server and BDF102 for Broadwell server.
|
||||
|
||||
Problem: Intel Memory Bandwidth Monitoring (MBM) counters track metrics
|
||||
according to the assigned Resource Monitor ID (RMID) for that logical
|
||||
core. The IA32_QM_CTR register (MSR 0xC8E), used to report these
|
||||
metrics, may report incorrect system bandwidth for certain RMID values.
|
||||
|
||||
Implication: Due to the errata, system memory bandwidth may not match
|
||||
what is reported.
|
||||
|
||||
Workaround: MBM total and local readings are corrected according to the
|
||||
following correction factor table:
|
||||
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|core count |rmid count |rmid threshold |correction factor|
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|1 |8 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|2 |16 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|3 |24 |15 |0.969650 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|4 |32 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|6 |48 |31 |0.969650 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|7 |56 |47 |1.142857 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|8 |64 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|9 |72 |63 |1.185115 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|10 |80 |63 |1.066553 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|11 |88 |79 |1.454545 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|12 |96 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|13 |104 |95 |1.230769 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|14 |112 |95 |1.142857 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|15 |120 |95 |1.066667 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|16 |128 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|17 |136 |127 |1.254863 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|18 |144 |127 |1.185255 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|19 |152 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|20 |160 |127 |1.066667 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|21 |168 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|22 |176 |159 |1.454334 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|23 |184 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|24 |192 |127 |0.969744 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|25 |200 |191 |1.280246 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|26 |208 |191 |1.230921 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|27 |216 |0 |1.000000 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|28 |224 |191 |1.143118 |
|
||||
+---------------+---------------+---------------+-----------------+
|
||||
|
||||
If rmid > rmid threshold, MBM total and local values should be multiplied
|
||||
by the correction factor.
|
||||
|
||||
See:
|
||||
|
||||
1. Erratum SKX99 in Intel Xeon Processor Scalable Family Specification Update:
|
||||
http://web.archive.org/web/20200716124958/https://www.intel.com/content/www/us/en/processors/xeon/scalable/xeon-scalable-spec-update.html
|
||||
|
||||
2. Erratum BDF102 in Intel Xeon E5-2600 v4 Processor Product Family Specification Update:
|
||||
http://web.archive.org/web/20191125200531/https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-e5-v4-spec-update.pdf
|
||||
|
||||
3. The errata in Intel Resource Director Technology (Intel RDT) on 2nd Generation Intel Xeon Scalable Processors Reference Manual:
|
||||
https://software.intel.com/content/www/us/en/develop/articles/intel-resource-director-technology-rdt-reference-manual.html
|
||||
|
||||
for further information.
|
||||
211
Documentation/x86/sgx.rst
Normal file
211
Documentation/x86/sgx.rst
Normal file
@@ -0,0 +1,211 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============================
|
||||
Software Guard eXtensions (SGX)
|
||||
===============================
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Software Guard eXtensions (SGX) hardware enables for user space applications
|
||||
to set aside private memory regions of code and data:
|
||||
|
||||
* Privileged (ring-0) ENCLS functions orchestrate the construction of the.
|
||||
regions.
|
||||
* Unprivileged (ring-3) ENCLU functions allow an application to enter and
|
||||
execute inside the regions.
|
||||
|
||||
These memory regions are called enclaves. An enclave can be only entered at a
|
||||
fixed set of entry points. Each entry point can hold a single hardware thread
|
||||
at a time. While the enclave is loaded from a regular binary file by using
|
||||
ENCLS functions, only the threads inside the enclave can access its memory. The
|
||||
region is denied from outside access by the CPU, and encrypted before it leaves
|
||||
from LLC.
|
||||
|
||||
The support can be determined by
|
||||
|
||||
``grep sgx /proc/cpuinfo``
|
||||
|
||||
SGX must both be supported in the processor and enabled by the BIOS. If SGX
|
||||
appears to be unsupported on a system which has hardware support, ensure
|
||||
support is enabled in the BIOS. If a BIOS presents a choice between "Enabled"
|
||||
and "Software Enabled" modes for SGX, choose "Enabled".
|
||||
|
||||
Enclave Page Cache
|
||||
==================
|
||||
|
||||
SGX utilizes an *Enclave Page Cache (EPC)* to store pages that are associated
|
||||
with an enclave. It is contained in a BIOS-reserved region of physical memory.
|
||||
Unlike pages used for regular memory, pages can only be accessed from outside of
|
||||
the enclave during enclave construction with special, limited SGX instructions.
|
||||
|
||||
Only a CPU executing inside an enclave can directly access enclave memory.
|
||||
However, a CPU executing inside an enclave may access normal memory outside the
|
||||
enclave.
|
||||
|
||||
The kernel manages enclave memory similar to how it treats device memory.
|
||||
|
||||
Enclave Page Types
|
||||
------------------
|
||||
|
||||
**SGX Enclave Control Structure (SECS)**
|
||||
Enclave's address range, attributes and other global data are defined
|
||||
by this structure.
|
||||
|
||||
**Regular (REG)**
|
||||
Regular EPC pages contain the code and data of an enclave.
|
||||
|
||||
**Thread Control Structure (TCS)**
|
||||
Thread Control Structure pages define the entry points to an enclave and
|
||||
track the execution state of an enclave thread.
|
||||
|
||||
**Version Array (VA)**
|
||||
Version Array pages contain 512 slots, each of which can contain a version
|
||||
number for a page evicted from the EPC.
|
||||
|
||||
Enclave Page Cache Map
|
||||
----------------------
|
||||
|
||||
The processor tracks EPC pages in a hardware metadata structure called the
|
||||
*Enclave Page Cache Map (EPCM)*. The EPCM contains an entry for each EPC page
|
||||
which describes the owning enclave, access rights and page type among the other
|
||||
things.
|
||||
|
||||
EPCM permissions are separate from the normal page tables. This prevents the
|
||||
kernel from, for instance, allowing writes to data which an enclave wishes to
|
||||
remain read-only. EPCM permissions may only impose additional restrictions on
|
||||
top of normal x86 page permissions.
|
||||
|
||||
For all intents and purposes, the SGX architecture allows the processor to
|
||||
invalidate all EPCM entries at will. This requires that software be prepared to
|
||||
handle an EPCM fault at any time. In practice, this can happen on events like
|
||||
power transitions when the ephemeral key that encrypts enclave memory is lost.
|
||||
|
||||
Application interface
|
||||
=====================
|
||||
|
||||
Enclave build functions
|
||||
-----------------------
|
||||
|
||||
In addition to the traditional compiler and linker build process, SGX has a
|
||||
separate enclave “build” process. Enclaves must be built before they can be
|
||||
executed (entered). The first step in building an enclave is opening the
|
||||
**/dev/sgx_enclave** device. Since enclave memory is protected from direct
|
||||
access, special privileged instructions are Then used to copy data into enclave
|
||||
pages and establish enclave page permissions.
|
||||
|
||||
.. kernel-doc:: arch/x86/kernel/cpu/sgx/ioctl.c
|
||||
:functions: sgx_ioc_enclave_create
|
||||
sgx_ioc_enclave_add_pages
|
||||
sgx_ioc_enclave_init
|
||||
sgx_ioc_enclave_provision
|
||||
|
||||
Enclave vDSO
|
||||
------------
|
||||
|
||||
Entering an enclave can only be done through SGX-specific EENTER and ERESUME
|
||||
functions, and is a non-trivial process. Because of the complexity of
|
||||
transitioning to and from an enclave, enclaves typically utilize a library to
|
||||
handle the actual transitions. This is roughly analogous to how glibc
|
||||
implementations are used by most applications to wrap system calls.
|
||||
|
||||
Another crucial characteristic of enclaves is that they can generate exceptions
|
||||
as part of their normal operation that need to be handled in the enclave or are
|
||||
unique to SGX.
|
||||
|
||||
Instead of the traditional signal mechanism to handle these exceptions, SGX
|
||||
can leverage special exception fixup provided by the vDSO. The kernel-provided
|
||||
vDSO function wraps low-level transitions to/from the enclave like EENTER and
|
||||
ERESUME. The vDSO function intercepts exceptions that would otherwise generate
|
||||
a signal and return the fault information directly to its caller. This avoids
|
||||
the need to juggle signal handlers.
|
||||
|
||||
.. kernel-doc:: arch/x86/include/uapi/asm/sgx.h
|
||||
:functions: vdso_sgx_enter_enclave_t
|
||||
|
||||
ksgxd
|
||||
=====
|
||||
|
||||
SGX support includes a kernel thread called *ksgxwapd*.
|
||||
|
||||
EPC sanitization
|
||||
----------------
|
||||
|
||||
ksgxd is started when SGX initializes. Enclave memory is typically ready
|
||||
For use when the processor powers on or resets. However, if SGX has been in
|
||||
use since the reset, enclave pages may be in an inconsistent state. This might
|
||||
occur after a crash and kexec() cycle, for instance. At boot, ksgxd
|
||||
reinitializes all enclave pages so that they can be allocated and re-used.
|
||||
|
||||
The sanitization is done by going through EPC address space and applying the
|
||||
EREMOVE function to each physical page. Some enclave pages like SECS pages have
|
||||
hardware dependencies on other pages which prevents EREMOVE from functioning.
|
||||
Executing two EREMOVE passes removes the dependencies.
|
||||
|
||||
Page reclaimer
|
||||
--------------
|
||||
|
||||
Similar to the core kswapd, ksgxd, is responsible for managing the
|
||||
overcommitment of enclave memory. If the system runs out of enclave memory,
|
||||
*ksgxwapd* “swaps” enclave memory to normal memory.
|
||||
|
||||
Launch Control
|
||||
==============
|
||||
|
||||
SGX provides a launch control mechanism. After all enclave pages have been
|
||||
copied, kernel executes EINIT function, which initializes the enclave. Only after
|
||||
this the CPU can execute inside the enclave.
|
||||
|
||||
ENIT function takes an RSA-3072 signature of the enclave measurement. The function
|
||||
checks that the measurement is correct and signature is signed with the key
|
||||
hashed to the four **IA32_SGXLEPUBKEYHASH{0, 1, 2, 3}** MSRs representing the
|
||||
SHA256 of a public key.
|
||||
|
||||
Those MSRs can be configured by the BIOS to be either readable or writable.
|
||||
Linux supports only writable configuration in order to give full control to the
|
||||
kernel on launch control policy. Before calling EINIT function, the driver sets
|
||||
the MSRs to match the enclave's signing key.
|
||||
|
||||
Encryption engines
|
||||
==================
|
||||
|
||||
In order to conceal the enclave data while it is out of the CPU package, the
|
||||
memory controller has an encryption engine to transparently encrypt and decrypt
|
||||
enclave memory.
|
||||
|
||||
In CPUs prior to Ice Lake, the Memory Encryption Engine (MEE) is used to
|
||||
encrypt pages leaving the CPU caches. MEE uses a n-ary Merkle tree with root in
|
||||
SRAM to maintain integrity of the encrypted data. This provides integrity and
|
||||
anti-replay protection but does not scale to large memory sizes because the time
|
||||
required to update the Merkle tree grows logarithmically in relation to the
|
||||
memory size.
|
||||
|
||||
CPUs starting from Icelake use Total Memory Encryption (TME) in the place of
|
||||
MEE. TME-based SGX implementations do not have an integrity Merkle tree, which
|
||||
means integrity and replay-attacks are not mitigated. B, it includes
|
||||
additional changes to prevent cipher text from being returned and SW memory
|
||||
aliases from being Created.
|
||||
|
||||
DMA to enclave memory is blocked by range registers on both MEE and TME systems
|
||||
(SDM section 41.10).
|
||||
|
||||
Usage Models
|
||||
============
|
||||
|
||||
Shared Library
|
||||
--------------
|
||||
|
||||
Sensitive data and the code that acts on it is partitioned from the application
|
||||
into a separate library. The library is then linked as a DSO which can be loaded
|
||||
into an enclave. The application can then make individual function calls into
|
||||
the enclave through special SGX instructions. A run-time within the enclave is
|
||||
configured to marshal function parameters into and out of the enclave and to
|
||||
call the correct library function.
|
||||
|
||||
Application Container
|
||||
---------------------
|
||||
|
||||
An application may be loaded into a container enclave which is specially
|
||||
configured with a library OS and run-time which permits the application to run.
|
||||
The enclave run-time and library OS work together to execute the application
|
||||
when a thread enters the enclave.
|
||||
@@ -41,6 +41,8 @@ Package
|
||||
Packages contain a number of cores plus shared resources, e.g. DRAM
|
||||
controller, shared caches etc.
|
||||
|
||||
Modern systems may also use the term 'Die' for package.
|
||||
|
||||
AMD nomenclature for package is 'Node'.
|
||||
|
||||
Package-related topology information in the kernel:
|
||||
@@ -53,11 +55,18 @@ Package-related topology information in the kernel:
|
||||
|
||||
The number of dies in a package. This information is retrieved via CPUID.
|
||||
|
||||
- cpuinfo_x86.cpu_die_id:
|
||||
|
||||
The physical ID of the die. This information is retrieved via CPUID.
|
||||
|
||||
- cpuinfo_x86.phys_proc_id:
|
||||
|
||||
The physical ID of the package. This information is retrieved via CPUID
|
||||
and deduced from the APIC IDs of the cores in the package.
|
||||
|
||||
Modern systems use this value for the socket. There may be multiple
|
||||
packages within a socket. This value may differ from cpu_die_id.
|
||||
|
||||
- cpuinfo_x86.logical_proc_id:
|
||||
|
||||
The logical ID of the package. As we do not trust BIOSes to enumerate the
|
||||
|
||||
52
MAINTAINERS
52
MAINTAINERS
@@ -2485,7 +2485,7 @@ F: drivers/clk/socfpga/
|
||||
ARM/SOCFPGA EDAC SUPPORT
|
||||
M: Dinh Nguyen <dinguyen@kernel.org>
|
||||
S: Maintained
|
||||
F: drivers/edac/altera_edac.
|
||||
F: drivers/edac/altera_edac.[ch]
|
||||
|
||||
ARM/SPREADTRUM SoC SUPPORT
|
||||
M: Orson Zhai <orsonzhai@gmail.com>
|
||||
@@ -6370,6 +6370,13 @@ L: linux-edac@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/edac/ie31200_edac.c
|
||||
|
||||
EDAC-IGEN6
|
||||
M: Tony Luck <tony.luck@intel.com>
|
||||
R: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/edac/igen6_edac.c
|
||||
|
||||
EDAC-MPC85XX
|
||||
M: Johannes Thumshirn <morbidrsa@gmail.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
@@ -6419,7 +6426,7 @@ EDAC-SKYLAKE
|
||||
M: Tony Luck <tony.luck@intel.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/edac/skx_*.c
|
||||
F: drivers/edac/skx_*.[ch]
|
||||
|
||||
EDAC-TI
|
||||
M: Tero Kristo <t-kristo@ti.com>
|
||||
@@ -8016,7 +8023,7 @@ F: drivers/staging/hikey9xx/
|
||||
HISILICON TRUE RANDOM NUMBER GENERATOR V2 SUPPORT
|
||||
M: Zaibo Xu <xuzaibo@huawei.com>
|
||||
S: Maintained
|
||||
F: drivers/char/hw_random/hisi-trng-v2.c
|
||||
F: drivers/crypto/hisilicon/trng/trng.c
|
||||
|
||||
HISILICON V3XX SPI NOR FLASH Controller Driver
|
||||
M: John Garry <john.garry@huawei.com>
|
||||
@@ -8982,13 +8989,23 @@ M: Deepak Saxena <dsaxena@plexity.net>
|
||||
S: Maintained
|
||||
F: drivers/char/hw_random/ixp4xx-rng.c
|
||||
|
||||
INTEL KEEMBAY DRM DRIVER
|
||||
INTEL KEEM BAY DRM DRIVER
|
||||
M: Anitha Chrisanthus <anitha.chrisanthus@intel.com>
|
||||
M: Edmund Dea <edmund.j.dea@intel.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/display/intel,kmb_display.yaml
|
||||
F: drivers/gpu/drm/kmb/
|
||||
|
||||
INTEL KEEM BAY OCS AES/SM4 CRYPTO DRIVER
|
||||
M: Daniele Alessandrelli <daniele.alessandrelli@intel.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/crypto/intel,keembay-ocs-aes.yaml
|
||||
F: drivers/crypto/keembay/Kconfig
|
||||
F: drivers/crypto/keembay/Makefile
|
||||
F: drivers/crypto/keembay/keembay-ocs-aes-core.c
|
||||
F: drivers/crypto/keembay/ocs-aes.c
|
||||
F: drivers/crypto/keembay/ocs-aes.h
|
||||
|
||||
INTEL MANAGEMENT ENGINE (mei)
|
||||
M: Tomas Winkler <tomas.winkler@intel.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
@@ -9157,6 +9174,19 @@ F: Documentation/x86/intel_txt.rst
|
||||
F: arch/x86/kernel/tboot.c
|
||||
F: include/linux/tboot.h
|
||||
|
||||
INTEL SGX
|
||||
M: Jarkko Sakkinen <jarkko@kernel.org>
|
||||
L: linux-sgx@vger.kernel.org
|
||||
S: Supported
|
||||
Q: https://patchwork.kernel.org/project/intel-sgx/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-sgx.git
|
||||
F: Documentation/x86/sgx.rst
|
||||
F: arch/x86/entry/vdso/vsgx.S
|
||||
F: arch/x86/include/uapi/asm/sgx.h
|
||||
F: arch/x86/kernel/cpu/sgx/*
|
||||
F: tools/testing/selftests/sgx/*
|
||||
K: \bSGX_
|
||||
|
||||
INTERCONNECT API
|
||||
M: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
L: linux-pm@vger.kernel.org
|
||||
@@ -10403,6 +10433,8 @@ L: linux-m68k@lists.linux-m68k.org
|
||||
S: Maintained
|
||||
W: http://www.mac.linux-m68k.org/
|
||||
F: arch/m68k/mac/
|
||||
F: drivers/macintosh/adb-iop.c
|
||||
F: drivers/macintosh/via-macii.c
|
||||
|
||||
M68K ON HP9000/300
|
||||
M: Philip Blundell <philb@gnu.org>
|
||||
@@ -15888,13 +15920,14 @@ F: include/linux/sfp.h
|
||||
K: phylink\.h|struct\s+phylink|\.phylink|>phylink_|phylink_(autoneg|clear|connect|create|destroy|disconnect|ethtool|helper|mac|mii|of|set|start|stop|test|validate)
|
||||
|
||||
SGI GRU DRIVER
|
||||
M: Dimitri Sivanich <sivanich@sgi.com>
|
||||
M: Dimitri Sivanich <dimitri.sivanich@hpe.com>
|
||||
S: Maintained
|
||||
F: drivers/misc/sgi-gru/
|
||||
|
||||
SGI XP/XPC/XPNET DRIVER
|
||||
M: Cliff Whickman <cpw@sgi.com>
|
||||
M: Robin Holt <robinmholt@gmail.com>
|
||||
M: Steve Wahl <steve.wahl@hpe.com>
|
||||
R: Mike Travis <mike.travis@hpe.com>
|
||||
S: Maintained
|
||||
F: drivers/misc/sgi-xp/
|
||||
|
||||
@@ -18437,6 +18470,12 @@ F: include/uapi/linux/uuid.h
|
||||
F: lib/test_uuid.c
|
||||
F: lib/uuid.c
|
||||
|
||||
UV SYSFS DRIVER
|
||||
M: Justin Ernst <justin.ernst@hpe.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/uv_sysfs.c
|
||||
|
||||
UVESAFB DRIVER
|
||||
M: Michal Januszewski <spock@gentoo.org>
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
@@ -19143,6 +19182,7 @@ F: arch/x86/platform
|
||||
|
||||
X86 PLATFORM UV HPE SUPERDOME FLEX
|
||||
M: Steve Wahl <steve.wahl@hpe.com>
|
||||
R: Mike Travis <mike.travis@hpe.com>
|
||||
R: Dimitri Sivanich <dimitri.sivanich@hpe.com>
|
||||
R: Russ Anderson <russ.anderson@hpe.com>
|
||||
S: Supported
|
||||
|
||||
@@ -69,6 +69,12 @@
|
||||
always-on;
|
||||
};
|
||||
|
||||
edac: sdram@1e6e0000 {
|
||||
compatible = "aspeed,ast2600-sdram-edac", "syscon";
|
||||
reg = <0x1e6e0000 0x174>;
|
||||
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
ahb {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -386,20 +386,32 @@ ENTRY(ce_aes_ctr_encrypt)
|
||||
.Lctrloop4x:
|
||||
subs r4, r4, #4
|
||||
bmi .Lctr1x
|
||||
add r6, r6, #1
|
||||
|
||||
/*
|
||||
* NOTE: the sequence below has been carefully tweaked to avoid
|
||||
* a silicon erratum that exists in Cortex-A57 (#1742098) and
|
||||
* Cortex-A72 (#1655431) cores, where AESE/AESMC instruction pairs
|
||||
* may produce an incorrect result if they take their input from a
|
||||
* register of which a single 32-bit lane has been updated the last
|
||||
* time it was modified. To work around this, the lanes of registers
|
||||
* q0-q3 below are not manipulated individually, and the different
|
||||
* counter values are prepared by successive manipulations of q7.
|
||||
*/
|
||||
add ip, r6, #1
|
||||
vmov q0, q7
|
||||
rev ip, ip
|
||||
add lr, r6, #2
|
||||
vmov s31, ip @ set lane 3 of q1 via q7
|
||||
add ip, r6, #3
|
||||
rev lr, lr
|
||||
vmov q1, q7
|
||||
rev ip, r6
|
||||
add r6, r6, #1
|
||||
vmov s31, lr @ set lane 3 of q2 via q7
|
||||
rev ip, ip
|
||||
vmov q2, q7
|
||||
vmov s7, ip
|
||||
rev ip, r6
|
||||
add r6, r6, #1
|
||||
vmov s31, ip @ set lane 3 of q3 via q7
|
||||
add r6, r6, #4
|
||||
vmov q3, q7
|
||||
vmov s11, ip
|
||||
rev ip, r6
|
||||
add r6, r6, #1
|
||||
vmov s15, ip
|
||||
|
||||
vld1.8 {q4-q5}, [r1]!
|
||||
vld1.8 {q6}, [r1]!
|
||||
vld1.8 {q15}, [r1]!
|
||||
|
||||
@@ -19,7 +19,7 @@ MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
MODULE_ALIAS_CRYPTO("ecb(aes)");
|
||||
MODULE_ALIAS_CRYPTO("cbc(aes)");
|
||||
MODULE_ALIAS_CRYPTO("cbc(aes)-all");
|
||||
MODULE_ALIAS_CRYPTO("ctr(aes)");
|
||||
MODULE_ALIAS_CRYPTO("xts(aes)");
|
||||
|
||||
@@ -191,7 +191,8 @@ static int cbc_init(struct crypto_skcipher *tfm)
|
||||
struct aesbs_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||
unsigned int reqsize;
|
||||
|
||||
ctx->enc_tfm = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
|
||||
ctx->enc_tfm = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_NEED_FALLBACK);
|
||||
if (IS_ERR(ctx->enc_tfm))
|
||||
return PTR_ERR(ctx->enc_tfm);
|
||||
|
||||
@@ -441,7 +442,8 @@ static struct skcipher_alg aes_algs[] = { {
|
||||
.base.cra_blocksize = AES_BLOCK_SIZE,
|
||||
.base.cra_ctxsize = sizeof(struct aesbs_cbc_ctx),
|
||||
.base.cra_module = THIS_MODULE,
|
||||
.base.cra_flags = CRYPTO_ALG_INTERNAL,
|
||||
.base.cra_flags = CRYPTO_ALG_INTERNAL |
|
||||
CRYPTO_ALG_NEED_FALLBACK,
|
||||
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
|
||||
int nrounds);
|
||||
asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
|
||||
int nrounds);
|
||||
int nrounds, unsigned int nbytes);
|
||||
asmlinkage void hchacha_block_arm(const u32 *state, u32 *out, int nrounds);
|
||||
asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
|
||||
|
||||
@@ -42,24 +42,24 @@ static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
|
||||
{
|
||||
u8 buf[CHACHA_BLOCK_SIZE];
|
||||
|
||||
while (bytes >= CHACHA_BLOCK_SIZE * 4) {
|
||||
chacha_4block_xor_neon(state, dst, src, nrounds);
|
||||
bytes -= CHACHA_BLOCK_SIZE * 4;
|
||||
src += CHACHA_BLOCK_SIZE * 4;
|
||||
dst += CHACHA_BLOCK_SIZE * 4;
|
||||
state[12] += 4;
|
||||
}
|
||||
while (bytes >= CHACHA_BLOCK_SIZE) {
|
||||
chacha_block_xor_neon(state, dst, src, nrounds);
|
||||
bytes -= CHACHA_BLOCK_SIZE;
|
||||
src += CHACHA_BLOCK_SIZE;
|
||||
dst += CHACHA_BLOCK_SIZE;
|
||||
state[12]++;
|
||||
while (bytes > CHACHA_BLOCK_SIZE) {
|
||||
unsigned int l = min(bytes, CHACHA_BLOCK_SIZE * 4U);
|
||||
|
||||
chacha_4block_xor_neon(state, dst, src, nrounds, l);
|
||||
bytes -= l;
|
||||
src += l;
|
||||
dst += l;
|
||||
state[12] += DIV_ROUND_UP(l, CHACHA_BLOCK_SIZE);
|
||||
}
|
||||
if (bytes) {
|
||||
memcpy(buf, src, bytes);
|
||||
chacha_block_xor_neon(state, buf, buf, nrounds);
|
||||
memcpy(dst, buf, bytes);
|
||||
const u8 *s = src;
|
||||
u8 *d = dst;
|
||||
|
||||
if (bytes != CHACHA_BLOCK_SIZE)
|
||||
s = d = memcpy(buf, src, bytes);
|
||||
chacha_block_xor_neon(state, d, s, nrounds);
|
||||
if (d != dst)
|
||||
memcpy(dst, buf, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
.text
|
||||
.fpu neon
|
||||
@@ -205,7 +206,7 @@ ENDPROC(hchacha_block_neon)
|
||||
|
||||
.align 5
|
||||
ENTRY(chacha_4block_xor_neon)
|
||||
push {r4-r5}
|
||||
push {r4, lr}
|
||||
mov r4, sp // preserve the stack pointer
|
||||
sub ip, sp, #0x20 // allocate a 32 byte buffer
|
||||
bic ip, ip, #0x1f // aligned to 32 bytes
|
||||
@@ -229,10 +230,10 @@ ENTRY(chacha_4block_xor_neon)
|
||||
vld1.32 {q0-q1}, [r0]
|
||||
vld1.32 {q2-q3}, [ip]
|
||||
|
||||
adr r5, .Lctrinc
|
||||
adr lr, .Lctrinc
|
||||
vdup.32 q15, d7[1]
|
||||
vdup.32 q14, d7[0]
|
||||
vld1.32 {q4}, [r5, :128]
|
||||
vld1.32 {q4}, [lr, :128]
|
||||
vdup.32 q13, d6[1]
|
||||
vdup.32 q12, d6[0]
|
||||
vdup.32 q11, d5[1]
|
||||
@@ -455,7 +456,7 @@ ENTRY(chacha_4block_xor_neon)
|
||||
|
||||
// Re-interleave the words in the first two rows of each block (x0..7).
|
||||
// Also add the counter values 0-3 to x12[0-3].
|
||||
vld1.32 {q8}, [r5, :128] // load counter values 0-3
|
||||
vld1.32 {q8}, [lr, :128] // load counter values 0-3
|
||||
vzip.32 q0, q1 // => (0 1 0 1) (0 1 0 1)
|
||||
vzip.32 q2, q3 // => (2 3 2 3) (2 3 2 3)
|
||||
vzip.32 q4, q5 // => (4 5 4 5) (4 5 4 5)
|
||||
@@ -493,6 +494,8 @@ ENTRY(chacha_4block_xor_neon)
|
||||
|
||||
// Re-interleave the words in the last two rows of each block (x8..15).
|
||||
vld1.32 {q8-q9}, [sp, :256]
|
||||
mov sp, r4 // restore original stack pointer
|
||||
ldr r4, [r4, #8] // load number of bytes
|
||||
vzip.32 q12, q13 // => (12 13 12 13) (12 13 12 13)
|
||||
vzip.32 q14, q15 // => (14 15 14 15) (14 15 14 15)
|
||||
vzip.32 q8, q9 // => (8 9 8 9) (8 9 8 9)
|
||||
@@ -520,41 +523,121 @@ ENTRY(chacha_4block_xor_neon)
|
||||
// XOR the rest of the data with the keystream
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #96
|
||||
veor q0, q0, q8
|
||||
veor q1, q1, q12
|
||||
ble .Lle96
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #32
|
||||
veor q0, q0, q2
|
||||
veor q1, q1, q6
|
||||
ble .Lle128
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #32
|
||||
veor q0, q0, q10
|
||||
veor q1, q1, q14
|
||||
ble .Lle160
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #32
|
||||
veor q0, q0, q4
|
||||
veor q1, q1, q5
|
||||
ble .Lle192
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #32
|
||||
veor q0, q0, q9
|
||||
veor q1, q1, q13
|
||||
ble .Lle224
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]!
|
||||
subs r4, r4, #32
|
||||
veor q0, q0, q3
|
||||
veor q1, q1, q7
|
||||
blt .Llt256
|
||||
.Lout:
|
||||
vst1.8 {q0-q1}, [r1]!
|
||||
|
||||
vld1.8 {q0-q1}, [r2]
|
||||
mov sp, r4 // restore original stack pointer
|
||||
veor q0, q0, q11
|
||||
veor q1, q1, q15
|
||||
vst1.8 {q0-q1}, [r1]
|
||||
|
||||
pop {r4-r5}
|
||||
bx lr
|
||||
pop {r4, pc}
|
||||
|
||||
.Lle192:
|
||||
vmov q4, q9
|
||||
vmov q5, q13
|
||||
|
||||
.Lle160:
|
||||
// nothing to do
|
||||
|
||||
.Lfinalblock:
|
||||
// Process the final block if processing less than 4 full blocks.
|
||||
// Entered with 32 bytes of ChaCha cipher stream in q4-q5, and the
|
||||
// previous 32 byte output block that still needs to be written at
|
||||
// [r1] in q0-q1.
|
||||
beq .Lfullblock
|
||||
|
||||
.Lpartialblock:
|
||||
adr lr, .Lpermute + 32
|
||||
add r2, r2, r4
|
||||
add lr, lr, r4
|
||||
add r4, r4, r1
|
||||
|
||||
vld1.8 {q2-q3}, [lr]
|
||||
vld1.8 {q6-q7}, [r2]
|
||||
|
||||
add r4, r4, #32
|
||||
|
||||
vtbl.8 d4, {q4-q5}, d4
|
||||
vtbl.8 d5, {q4-q5}, d5
|
||||
vtbl.8 d6, {q4-q5}, d6
|
||||
vtbl.8 d7, {q4-q5}, d7
|
||||
|
||||
veor q6, q6, q2
|
||||
veor q7, q7, q3
|
||||
|
||||
vst1.8 {q6-q7}, [r4] // overlapping stores
|
||||
vst1.8 {q0-q1}, [r1]
|
||||
pop {r4, pc}
|
||||
|
||||
.Lfullblock:
|
||||
vmov q11, q4
|
||||
vmov q15, q5
|
||||
b .Lout
|
||||
.Lle96:
|
||||
vmov q4, q2
|
||||
vmov q5, q6
|
||||
b .Lfinalblock
|
||||
.Lle128:
|
||||
vmov q4, q10
|
||||
vmov q5, q14
|
||||
b .Lfinalblock
|
||||
.Lle224:
|
||||
vmov q4, q3
|
||||
vmov q5, q7
|
||||
b .Lfinalblock
|
||||
.Llt256:
|
||||
vmov q4, q11
|
||||
vmov q5, q15
|
||||
b .Lpartialblock
|
||||
ENDPROC(chacha_4block_xor_neon)
|
||||
|
||||
.align L1_CACHE_SHIFT
|
||||
.Lpermute:
|
||||
.byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
|
||||
.byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
|
||||
.byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
|
||||
.byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
|
||||
.byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
|
||||
.byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
|
||||
.byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
|
||||
.byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <crypto/sha1_base.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#define ASM_ARM_CRYPTO_SHA1_H
|
||||
|
||||
#include <linux/crypto.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
|
||||
extern int sha1_update_arm(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <crypto/sha1_base.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <crypto/sha1_base.h>
|
||||
#include <asm/neon.h>
|
||||
#include <asm/simd.h>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha256_base.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha256_base.h>
|
||||
#include <asm/simd.h>
|
||||
#include <asm/neon.h>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha256_base.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/simd.h>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha512_base.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha512_base.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -1082,6 +1082,7 @@ CONFIG_CRYPTO_DEV_CCREE=m
|
||||
CONFIG_CRYPTO_DEV_HISI_SEC2=m
|
||||
CONFIG_CRYPTO_DEV_HISI_ZIP=m
|
||||
CONFIG_CRYPTO_DEV_HISI_HPRE=m
|
||||
CONFIG_CRYPTO_DEV_HISI_TRNG=m
|
||||
CONFIG_CMA_SIZE_MBYTES=32
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <asm/simd.h>
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/ctr.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
|
||||
@@ -195,7 +195,6 @@ SYM_FUNC_START(chacha_4block_xor_neon)
|
||||
adr_l x10, .Lpermute
|
||||
and x5, x4, #63
|
||||
add x10, x10, x5
|
||||
add x11, x10, #64
|
||||
|
||||
//
|
||||
// This function encrypts four consecutive ChaCha blocks by loading
|
||||
@@ -645,11 +644,11 @@ CPU_BE( rev a15, a15 )
|
||||
zip2 v31.4s, v14.4s, v15.4s
|
||||
eor a15, a15, w9
|
||||
|
||||
mov x3, #64
|
||||
add x3, x2, x4
|
||||
sub x3, x3, #128 // start of last block
|
||||
|
||||
subs x5, x4, #128
|
||||
add x6, x5, x2
|
||||
csel x3, x3, xzr, ge
|
||||
csel x2, x2, x6, ge
|
||||
csel x2, x2, x3, ge
|
||||
|
||||
// interleave 64-bit words in state n, n+2
|
||||
zip1 v0.2d, v16.2d, v18.2d
|
||||
@@ -658,13 +657,10 @@ CPU_BE( rev a15, a15 )
|
||||
zip1 v8.2d, v17.2d, v19.2d
|
||||
zip2 v12.2d, v17.2d, v19.2d
|
||||
stp a2, a3, [x1, #-56]
|
||||
ld1 {v16.16b-v19.16b}, [x2], x3
|
||||
|
||||
subs x6, x4, #192
|
||||
ccmp x3, xzr, #4, lt
|
||||
add x7, x6, x2
|
||||
csel x3, x3, xzr, eq
|
||||
csel x2, x2, x7, eq
|
||||
ld1 {v16.16b-v19.16b}, [x2], #64
|
||||
csel x2, x2, x3, ge
|
||||
|
||||
zip1 v1.2d, v20.2d, v22.2d
|
||||
zip2 v5.2d, v20.2d, v22.2d
|
||||
@@ -672,13 +668,10 @@ CPU_BE( rev a15, a15 )
|
||||
zip1 v9.2d, v21.2d, v23.2d
|
||||
zip2 v13.2d, v21.2d, v23.2d
|
||||
stp a6, a7, [x1, #-40]
|
||||
ld1 {v20.16b-v23.16b}, [x2], x3
|
||||
|
||||
subs x7, x4, #256
|
||||
ccmp x3, xzr, #4, lt
|
||||
add x8, x7, x2
|
||||
csel x3, x3, xzr, eq
|
||||
csel x2, x2, x8, eq
|
||||
ld1 {v20.16b-v23.16b}, [x2], #64
|
||||
csel x2, x2, x3, ge
|
||||
|
||||
zip1 v2.2d, v24.2d, v26.2d
|
||||
zip2 v6.2d, v24.2d, v26.2d
|
||||
@@ -686,12 +679,10 @@ CPU_BE( rev a15, a15 )
|
||||
zip1 v10.2d, v25.2d, v27.2d
|
||||
zip2 v14.2d, v25.2d, v27.2d
|
||||
stp a10, a11, [x1, #-24]
|
||||
ld1 {v24.16b-v27.16b}, [x2], x3
|
||||
|
||||
subs x8, x4, #320
|
||||
ccmp x3, xzr, #4, lt
|
||||
add x9, x8, x2
|
||||
csel x2, x2, x9, eq
|
||||
ld1 {v24.16b-v27.16b}, [x2], #64
|
||||
csel x2, x2, x3, ge
|
||||
|
||||
zip1 v3.2d, v28.2d, v30.2d
|
||||
zip2 v7.2d, v28.2d, v30.2d
|
||||
@@ -699,151 +690,105 @@ CPU_BE( rev a15, a15 )
|
||||
zip1 v11.2d, v29.2d, v31.2d
|
||||
zip2 v15.2d, v29.2d, v31.2d
|
||||
stp a14, a15, [x1, #-8]
|
||||
|
||||
tbnz x5, #63, .Lt128
|
||||
ld1 {v28.16b-v31.16b}, [x2]
|
||||
|
||||
// xor with corresponding input, write to output
|
||||
tbnz x5, #63, 0f
|
||||
eor v16.16b, v16.16b, v0.16b
|
||||
eor v17.16b, v17.16b, v1.16b
|
||||
eor v18.16b, v18.16b, v2.16b
|
||||
eor v19.16b, v19.16b, v3.16b
|
||||
st1 {v16.16b-v19.16b}, [x1], #64
|
||||
cbz x5, .Lout
|
||||
|
||||
tbnz x6, #63, 1f
|
||||
tbnz x6, #63, .Lt192
|
||||
|
||||
eor v20.16b, v20.16b, v4.16b
|
||||
eor v21.16b, v21.16b, v5.16b
|
||||
eor v22.16b, v22.16b, v6.16b
|
||||
eor v23.16b, v23.16b, v7.16b
|
||||
st1 {v20.16b-v23.16b}, [x1], #64
|
||||
cbz x6, .Lout
|
||||
|
||||
tbnz x7, #63, 2f
|
||||
st1 {v16.16b-v19.16b}, [x1], #64
|
||||
tbnz x7, #63, .Lt256
|
||||
|
||||
eor v24.16b, v24.16b, v8.16b
|
||||
eor v25.16b, v25.16b, v9.16b
|
||||
eor v26.16b, v26.16b, v10.16b
|
||||
eor v27.16b, v27.16b, v11.16b
|
||||
st1 {v24.16b-v27.16b}, [x1], #64
|
||||
cbz x7, .Lout
|
||||
|
||||
tbnz x8, #63, 3f
|
||||
st1 {v20.16b-v23.16b}, [x1], #64
|
||||
tbnz x8, #63, .Lt320
|
||||
|
||||
eor v28.16b, v28.16b, v12.16b
|
||||
eor v29.16b, v29.16b, v13.16b
|
||||
eor v30.16b, v30.16b, v14.16b
|
||||
eor v31.16b, v31.16b, v15.16b
|
||||
|
||||
st1 {v24.16b-v27.16b}, [x1], #64
|
||||
st1 {v28.16b-v31.16b}, [x1]
|
||||
|
||||
.Lout: frame_pop
|
||||
ret
|
||||
|
||||
// fewer than 128 bytes of in/output
|
||||
0: ld1 {v8.16b}, [x10]
|
||||
ld1 {v9.16b}, [x11]
|
||||
movi v10.16b, #16
|
||||
sub x2, x1, #64
|
||||
add x1, x1, x5
|
||||
ld1 {v16.16b-v19.16b}, [x2]
|
||||
tbl v4.16b, {v0.16b-v3.16b}, v8.16b
|
||||
tbx v20.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v5.16b, {v0.16b-v3.16b}, v8.16b
|
||||
tbx v21.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v6.16b, {v0.16b-v3.16b}, v8.16b
|
||||
tbx v22.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v7.16b, {v0.16b-v3.16b}, v8.16b
|
||||
tbx v23.16b, {v16.16b-v19.16b}, v9.16b
|
||||
|
||||
eor v20.16b, v20.16b, v4.16b
|
||||
eor v21.16b, v21.16b, v5.16b
|
||||
eor v22.16b, v22.16b, v6.16b
|
||||
eor v23.16b, v23.16b, v7.16b
|
||||
st1 {v20.16b-v23.16b}, [x1]
|
||||
b .Lout
|
||||
|
||||
// fewer than 192 bytes of in/output
|
||||
1: ld1 {v8.16b}, [x10]
|
||||
ld1 {v9.16b}, [x11]
|
||||
movi v10.16b, #16
|
||||
add x1, x1, x6
|
||||
tbl v0.16b, {v4.16b-v7.16b}, v8.16b
|
||||
tbx v20.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v1.16b, {v4.16b-v7.16b}, v8.16b
|
||||
tbx v21.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v2.16b, {v4.16b-v7.16b}, v8.16b
|
||||
tbx v22.16b, {v16.16b-v19.16b}, v9.16b
|
||||
add v8.16b, v8.16b, v10.16b
|
||||
add v9.16b, v9.16b, v10.16b
|
||||
tbl v3.16b, {v4.16b-v7.16b}, v8.16b
|
||||
tbx v23.16b, {v16.16b-v19.16b}, v9.16b
|
||||
.Lt192: cbz x5, 1f // exactly 128 bytes?
|
||||
ld1 {v28.16b-v31.16b}, [x10]
|
||||
add x5, x5, x1
|
||||
tbl v28.16b, {v4.16b-v7.16b}, v28.16b
|
||||
tbl v29.16b, {v4.16b-v7.16b}, v29.16b
|
||||
tbl v30.16b, {v4.16b-v7.16b}, v30.16b
|
||||
tbl v31.16b, {v4.16b-v7.16b}, v31.16b
|
||||
|
||||
eor v20.16b, v20.16b, v0.16b
|
||||
eor v21.16b, v21.16b, v1.16b
|
||||
eor v22.16b, v22.16b, v2.16b
|
||||
eor v23.16b, v23.16b, v3.16b
|
||||
st1 {v20.16b-v23.16b}, [x1]
|
||||
0: eor v20.16b, v20.16b, v28.16b
|
||||
eor v21.16b, v21.16b, v29.16b
|
||||
eor v22.16b, v22.16b, v30.16b
|
||||
eor v23.16b, v23.16b, v31.16b
|
||||
st1 {v20.16b-v23.16b}, [x5] // overlapping stores
|
||||
1: st1 {v16.16b-v19.16b}, [x1]
|
||||
b .Lout
|
||||
|
||||
// fewer than 128 bytes of in/output
|
||||
.Lt128: ld1 {v28.16b-v31.16b}, [x10]
|
||||
add x5, x5, x1
|
||||
sub x1, x1, #64
|
||||
tbl v28.16b, {v0.16b-v3.16b}, v28.16b
|
||||
tbl v29.16b, {v0.16b-v3.16b}, v29.16b
|
||||
tbl v30.16b, {v0.16b-v3.16b}, v30.16b
|
||||
tbl v31.16b, {v0.16b-v3.16b}, v31.16b
|
||||
ld1 {v16.16b-v19.16b}, [x1] // reload first output block
|
||||
b 0b
|
||||
|
||||
// fewer than 256 bytes of in/output
|
||||
2: ld1 {v4.16b}, [x10]
|
||||
ld1 {v5.16b}, [x11]
|
||||
movi v6.16b, #16
|
||||
add x1, x1, x7
|
||||
.Lt256: cbz x6, 2f // exactly 192 bytes?
|
||||
ld1 {v4.16b-v7.16b}, [x10]
|
||||
add x6, x6, x1
|
||||
tbl v0.16b, {v8.16b-v11.16b}, v4.16b
|
||||
tbx v24.16b, {v20.16b-v23.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v1.16b, {v8.16b-v11.16b}, v4.16b
|
||||
tbx v25.16b, {v20.16b-v23.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v2.16b, {v8.16b-v11.16b}, v4.16b
|
||||
tbx v26.16b, {v20.16b-v23.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v3.16b, {v8.16b-v11.16b}, v4.16b
|
||||
tbx v27.16b, {v20.16b-v23.16b}, v5.16b
|
||||
|
||||
eor v24.16b, v24.16b, v0.16b
|
||||
eor v25.16b, v25.16b, v1.16b
|
||||
eor v26.16b, v26.16b, v2.16b
|
||||
eor v27.16b, v27.16b, v3.16b
|
||||
st1 {v24.16b-v27.16b}, [x1]
|
||||
b .Lout
|
||||
|
||||
// fewer than 320 bytes of in/output
|
||||
3: ld1 {v4.16b}, [x10]
|
||||
ld1 {v5.16b}, [x11]
|
||||
movi v6.16b, #16
|
||||
add x1, x1, x8
|
||||
tbl v0.16b, {v12.16b-v15.16b}, v4.16b
|
||||
tbx v28.16b, {v24.16b-v27.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v1.16b, {v12.16b-v15.16b}, v4.16b
|
||||
tbx v29.16b, {v24.16b-v27.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v2.16b, {v12.16b-v15.16b}, v4.16b
|
||||
tbx v30.16b, {v24.16b-v27.16b}, v5.16b
|
||||
add v4.16b, v4.16b, v6.16b
|
||||
add v5.16b, v5.16b, v6.16b
|
||||
tbl v3.16b, {v12.16b-v15.16b}, v4.16b
|
||||
tbx v31.16b, {v24.16b-v27.16b}, v5.16b
|
||||
tbl v1.16b, {v8.16b-v11.16b}, v5.16b
|
||||
tbl v2.16b, {v8.16b-v11.16b}, v6.16b
|
||||
tbl v3.16b, {v8.16b-v11.16b}, v7.16b
|
||||
|
||||
eor v28.16b, v28.16b, v0.16b
|
||||
eor v29.16b, v29.16b, v1.16b
|
||||
eor v30.16b, v30.16b, v2.16b
|
||||
eor v31.16b, v31.16b, v3.16b
|
||||
st1 {v28.16b-v31.16b}, [x1]
|
||||
st1 {v28.16b-v31.16b}, [x6] // overlapping stores
|
||||
2: st1 {v20.16b-v23.16b}, [x1]
|
||||
b .Lout
|
||||
|
||||
// fewer than 320 bytes of in/output
|
||||
.Lt320: cbz x7, 3f // exactly 256 bytes?
|
||||
ld1 {v4.16b-v7.16b}, [x10]
|
||||
add x7, x7, x1
|
||||
tbl v0.16b, {v12.16b-v15.16b}, v4.16b
|
||||
tbl v1.16b, {v12.16b-v15.16b}, v5.16b
|
||||
tbl v2.16b, {v12.16b-v15.16b}, v6.16b
|
||||
tbl v3.16b, {v12.16b-v15.16b}, v7.16b
|
||||
|
||||
eor v28.16b, v28.16b, v0.16b
|
||||
eor v29.16b, v29.16b, v1.16b
|
||||
eor v30.16b, v30.16b, v2.16b
|
||||
eor v31.16b, v31.16b, v3.16b
|
||||
st1 {v28.16b-v31.16b}, [x7] // overlapping stores
|
||||
3: st1 {v24.16b-v27.16b}, [x1]
|
||||
b .Lout
|
||||
SYM_FUNC_END(chacha_4block_xor_neon)
|
||||
|
||||
@@ -851,7 +796,7 @@ SYM_FUNC_END(chacha_4block_xor_neon)
|
||||
.align L1_CACHE_SHIFT
|
||||
.Lpermute:
|
||||
.set .Li, 0
|
||||
.rept 192
|
||||
.rept 128
|
||||
.byte (.Li - 64)
|
||||
.set .Li, .Li + 1
|
||||
.endr
|
||||
|
||||
@@ -544,7 +544,22 @@ CPU_LE( rev w8, w8 )
|
||||
ext XL.16b, XL.16b, XL.16b, #8
|
||||
rev64 XL.16b, XL.16b
|
||||
eor XL.16b, XL.16b, KS0.16b
|
||||
|
||||
.if \enc == 1
|
||||
st1 {XL.16b}, [x10] // store tag
|
||||
.else
|
||||
ldp x11, x12, [sp, #40] // load tag pointer and authsize
|
||||
adr_l x17, .Lpermute_table
|
||||
ld1 {KS0.16b}, [x11] // load supplied tag
|
||||
add x17, x17, x12
|
||||
ld1 {KS1.16b}, [x17] // load permute vector
|
||||
|
||||
cmeq XL.16b, XL.16b, KS0.16b // compare tags
|
||||
mvn XL.16b, XL.16b // -1 for fail, 0 for pass
|
||||
tbl XL.16b, {XL.16b}, KS1.16b // keep authsize bytes only
|
||||
sminv b0, XL.16b // signed minimum across XL
|
||||
smov w0, v0.b[0] // return b0
|
||||
.endif
|
||||
|
||||
4: ldp x29, x30, [sp], #32
|
||||
ret
|
||||
|
||||
@@ -55,10 +55,10 @@ asmlinkage void pmull_ghash_update_p8(int blocks, u64 dg[], const char *src,
|
||||
asmlinkage void pmull_gcm_encrypt(int bytes, u8 dst[], const u8 src[],
|
||||
u64 const h[][2], u64 dg[], u8 ctr[],
|
||||
u32 const rk[], int rounds, u8 tag[]);
|
||||
|
||||
asmlinkage void pmull_gcm_decrypt(int bytes, u8 dst[], const u8 src[],
|
||||
u64 const h[][2], u64 dg[], u8 ctr[],
|
||||
u32 const rk[], int rounds, u8 tag[]);
|
||||
asmlinkage int pmull_gcm_decrypt(int bytes, u8 dst[], const u8 src[],
|
||||
u64 const h[][2], u64 dg[], u8 ctr[],
|
||||
u32 const rk[], int rounds, const u8 l[],
|
||||
const u8 tag[], u64 authsize);
|
||||
|
||||
static int ghash_init(struct shash_desc *desc)
|
||||
{
|
||||
@@ -168,7 +168,7 @@ static int ghash_final(struct shash_desc *desc, u8 *dst)
|
||||
put_unaligned_be64(ctx->digest[1], dst);
|
||||
put_unaligned_be64(ctx->digest[0], dst + 8);
|
||||
|
||||
*ctx = (struct ghash_desc_ctx){};
|
||||
memzero_explicit(ctx, sizeof(*ctx));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -458,6 +458,7 @@ static int gcm_decrypt(struct aead_request *req)
|
||||
unsigned int authsize = crypto_aead_authsize(aead);
|
||||
int nrounds = num_rounds(&ctx->aes_key);
|
||||
struct skcipher_walk walk;
|
||||
u8 otag[AES_BLOCK_SIZE];
|
||||
u8 buf[AES_BLOCK_SIZE];
|
||||
u8 iv[AES_BLOCK_SIZE];
|
||||
u64 dg[2] = {};
|
||||
@@ -474,9 +475,15 @@ static int gcm_decrypt(struct aead_request *req)
|
||||
memcpy(iv, req->iv, GCM_IV_SIZE);
|
||||
put_unaligned_be32(2, iv + GCM_IV_SIZE);
|
||||
|
||||
scatterwalk_map_and_copy(otag, req->src,
|
||||
req->assoclen + req->cryptlen - authsize,
|
||||
authsize, 0);
|
||||
|
||||
err = skcipher_walk_aead_decrypt(&walk, req, false);
|
||||
|
||||
if (likely(crypto_simd_usable())) {
|
||||
int ret;
|
||||
|
||||
do {
|
||||
const u8 *src = walk.src.virt.addr;
|
||||
u8 *dst = walk.dst.virt.addr;
|
||||
@@ -493,9 +500,10 @@ static int gcm_decrypt(struct aead_request *req)
|
||||
}
|
||||
|
||||
kernel_neon_begin();
|
||||
pmull_gcm_decrypt(nbytes, dst, src, ctx->ghash_key.h,
|
||||
dg, iv, ctx->aes_key.key_enc, nrounds,
|
||||
tag);
|
||||
ret = pmull_gcm_decrypt(nbytes, dst, src,
|
||||
ctx->ghash_key.h,
|
||||
dg, iv, ctx->aes_key.key_enc,
|
||||
nrounds, tag, otag, authsize);
|
||||
kernel_neon_end();
|
||||
|
||||
if (unlikely(!nbytes))
|
||||
@@ -507,6 +515,11 @@ static int gcm_decrypt(struct aead_request *req)
|
||||
|
||||
err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
|
||||
} while (walk.nbytes);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
if (ret)
|
||||
return -EBADMSG;
|
||||
} else {
|
||||
while (walk.nbytes >= AES_BLOCK_SIZE) {
|
||||
int blocks = walk.nbytes / AES_BLOCK_SIZE;
|
||||
@@ -548,23 +561,20 @@ static int gcm_decrypt(struct aead_request *req)
|
||||
err = skcipher_walk_done(&walk, 0);
|
||||
}
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
put_unaligned_be64(dg[1], tag);
|
||||
put_unaligned_be64(dg[0], tag + 8);
|
||||
put_unaligned_be32(1, iv + GCM_IV_SIZE);
|
||||
aes_encrypt(&ctx->aes_key, iv, iv);
|
||||
crypto_xor(tag, iv, AES_BLOCK_SIZE);
|
||||
|
||||
if (crypto_memneq(tag, otag, authsize)) {
|
||||
memzero_explicit(tag, AES_BLOCK_SIZE);
|
||||
return -EBADMSG;
|
||||
}
|
||||
}
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* compare calculated auth tag with the stored one */
|
||||
scatterwalk_map_and_copy(buf, req->src,
|
||||
req->assoclen + req->cryptlen - authsize,
|
||||
authsize, 0);
|
||||
|
||||
if (crypto_memneq(tag, buf, authsize))
|
||||
return -EBADMSG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -840,7 +840,6 @@ poly1305_blocks_neon:
|
||||
ldp d14,d15,[sp,#64]
|
||||
addp $ACC2,$ACC2,$ACC2
|
||||
ldr x30,[sp,#8]
|
||||
.inst 0xd50323bf // autiasp
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// lazy reduction, but without narrowing
|
||||
@@ -882,6 +881,7 @@ poly1305_blocks_neon:
|
||||
str x4,[$ctx,#8] // set is_base2_26
|
||||
|
||||
ldr x29,[sp],#80
|
||||
.inst 0xd50323bf // autiasp
|
||||
ret
|
||||
.size poly1305_blocks_neon,.-poly1305_blocks_neon
|
||||
|
||||
|
||||
@@ -779,7 +779,6 @@ poly1305_blocks_neon:
|
||||
ldp d14,d15,[sp,#64]
|
||||
addp v21.2d,v21.2d,v21.2d
|
||||
ldr x30,[sp,#8]
|
||||
.inst 0xd50323bf // autiasp
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// lazy reduction, but without narrowing
|
||||
@@ -821,6 +820,7 @@ poly1305_blocks_neon:
|
||||
str x4,[x0,#8] // set is_base2_26
|
||||
|
||||
ldr x29,[sp],#80
|
||||
.inst 0xd50323bf // autiasp
|
||||
ret
|
||||
.size poly1305_blocks_neon,.-poly1305_blocks_neon
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
|
||||
}
|
||||
|
||||
poly1305_emit(&dctx->h, dst, dctx->s);
|
||||
*dctx = (struct poly1305_desc_ctx){};
|
||||
memzero_explicit(dctx, sizeof(*dctx));
|
||||
}
|
||||
EXPORT_SYMBOL(poly1305_final_arch);
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <crypto/sha1_base.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha256_base.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <asm/simd.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha256_base.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
@@ -94,7 +94,7 @@ static int sha3_final(struct shash_desc *desc, u8 *out)
|
||||
if (digest_size & 4)
|
||||
put_unaligned_le32(sctx->st[i], (__le32 *)digest);
|
||||
|
||||
*sctx = (struct sha3_state){};
|
||||
memzero_explicit(sctx, sizeof(*sctx));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/internal/simd.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha512_base.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha512_base.h>
|
||||
#include <asm/neon.h>
|
||||
|
||||
|
||||
@@ -30,11 +30,9 @@ config MAC
|
||||
select HAVE_ARCH_NVRAM_OPS
|
||||
help
|
||||
This option enables support for the Apple Macintosh series of
|
||||
computers (yes, there is experimental support now, at least for part
|
||||
of the series).
|
||||
|
||||
Say N unless you're willing to code the remaining necessary support.
|
||||
;)
|
||||
computers. If you plan to use this kernel on a Mac, say Y here and
|
||||
browse the documentation available at <http://www.mac.linux-m68k.org/>;
|
||||
otherwise say N.
|
||||
|
||||
config APOLLO
|
||||
bool "Apollo support"
|
||||
|
||||
@@ -383,14 +383,6 @@ void __init config_amiga(void)
|
||||
mach_init_IRQ = amiga_init_IRQ;
|
||||
mach_get_model = amiga_get_model;
|
||||
mach_get_hardware_list = amiga_get_hardware_list;
|
||||
|
||||
/*
|
||||
* default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI
|
||||
* code will not be able to allocate any mem for transfers, unless we are
|
||||
* dealing with a Z2 mem only system. /Jes
|
||||
*/
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
|
||||
mach_reset = amiga_reset;
|
||||
#if IS_ENABLED(CONFIG_INPUT_M68K_BEEP)
|
||||
mach_beep = amiga_mksound;
|
||||
|
||||
@@ -150,7 +150,6 @@ void __init config_apollo(void)
|
||||
|
||||
mach_sched_init=dn_sched_init; /* */
|
||||
mach_init_IRQ=dn_init_IRQ;
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
mach_hwclk = dn_dummy_hwclk; /* */
|
||||
mach_reset = dn_dummy_reset; /* */
|
||||
#ifdef CONFIG_HEARTBEAT
|
||||
|
||||
@@ -205,7 +205,6 @@ void __init config_atari(void)
|
||||
mach_get_model = atari_get_model;
|
||||
mach_get_hardware_list = atari_get_hardware_list;
|
||||
mach_reset = atari_reset;
|
||||
mach_max_dma_address = 0xffffff;
|
||||
#if IS_ENABLED(CONFIG_INPUT_M68K_BEEP)
|
||||
mach_beep = atari_mksound;
|
||||
#endif
|
||||
|
||||
@@ -101,7 +101,6 @@ void __init config_bvme6000(void)
|
||||
bvme6000_set_vectors();
|
||||
#endif
|
||||
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
mach_sched_init = bvme6000_sched_init;
|
||||
mach_init_IRQ = bvme6000_init_IRQ;
|
||||
mach_hwclk = bvme6000_hwclk;
|
||||
|
||||
@@ -563,6 +563,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -583,7 +584,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -626,6 +626,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -638,7 +640,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -653,9 +654,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -519,6 +519,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -539,7 +540,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -582,6 +582,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -594,7 +596,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -609,9 +610,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -541,6 +541,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -561,7 +562,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -604,6 +604,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -616,7 +618,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -631,9 +632,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -512,6 +512,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -532,7 +533,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -575,6 +575,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -587,7 +589,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -602,9 +603,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -521,6 +521,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -541,7 +542,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -584,6 +584,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -596,7 +598,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -611,9 +612,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -544,6 +544,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -564,7 +565,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -607,6 +607,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -619,7 +621,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -634,9 +635,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -630,6 +630,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -650,7 +651,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -693,6 +693,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -705,7 +707,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -720,9 +721,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -511,6 +511,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -531,7 +532,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -574,6 +574,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -586,7 +588,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -601,9 +602,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -512,6 +512,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -532,7 +533,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -575,6 +575,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -587,7 +589,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -602,9 +603,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -530,6 +530,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -550,7 +551,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -593,6 +593,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -605,7 +607,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -620,9 +621,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -514,6 +514,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -534,7 +535,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -576,6 +576,8 @@ CONFIG_STRING_SELFTEST=m
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -588,7 +590,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -603,9 +604,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -513,6 +513,7 @@ CONFIG_CRYPTO_RSA=m
|
||||
CONFIG_CRYPTO_DH=m
|
||||
CONFIG_CRYPTO_ECDH=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
@@ -533,7 +534,6 @@ CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
@@ -576,6 +576,8 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_KUNIT=m
|
||||
CONFIG_KUNIT_ALL_TESTS=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
@@ -588,7 +590,6 @@ CONFIG_TEST_STRSCPY=m
|
||||
CONFIG_TEST_KSTRTOX=m
|
||||
CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_BITFIELD=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_OVERFLOW=m
|
||||
@@ -603,9 +604,13 @@ CONFIG_TEST_BLACKHOLE_DEV=m
|
||||
CONFIG_FIND_BIT_BENCHMARK=m
|
||||
CONFIG_TEST_FIRMWARE=m
|
||||
CONFIG_TEST_SYSCTL=m
|
||||
CONFIG_BITFIELD_KUNIT=m
|
||||
CONFIG_LINEAR_RANGES_TEST=m
|
||||
CONFIG_BITS_TEST=m
|
||||
CONFIG_TEST_UDELAY=m
|
||||
CONFIG_TEST_STATIC_KEYS=m
|
||||
CONFIG_TEST_KMOD=m
|
||||
CONFIG_TEST_MEMCAT_P=m
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_TEST_FREE_PAGES=m
|
||||
|
||||
@@ -260,7 +260,6 @@ void __init config_hp300(void)
|
||||
#ifdef CONFIG_HEARTBEAT
|
||||
mach_heartbeat = hp300_pulse;
|
||||
#endif
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
|
||||
if (hp300_model >= HP_330 && hp300_model <= HP_433S &&
|
||||
hp300_model != HP_350) {
|
||||
|
||||
@@ -76,7 +76,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
|
||||
}
|
||||
#endif
|
||||
|
||||
#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
|
||||
#define xchg(ptr,x) ({(__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)));})
|
||||
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
@@ -119,11 +119,11 @@ static inline unsigned long __cmpxchg(volatile void *p, unsigned long old,
|
||||
}
|
||||
|
||||
#define cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
({(__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr)));})
|
||||
#define cmpxchg_local(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr))))
|
||||
({(__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), sizeof(*(ptr)));})
|
||||
|
||||
#define cmpxchg64(ptr, o, n) cmpxchg64_local((ptr), (o), (n))
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ extern void (*mach_halt)( void );
|
||||
extern void (*mach_power_off)( void );
|
||||
extern unsigned long (*mach_hd_init) (unsigned long, unsigned long);
|
||||
extern void (*mach_hd_setup)(char *, int *);
|
||||
extern long mach_max_dma_address;
|
||||
extern void (*mach_heartbeat) (int);
|
||||
extern void (*mach_l2_flush) (int);
|
||||
extern void (*mach_beep) (unsigned int, unsigned int);
|
||||
|
||||
@@ -99,7 +99,6 @@ EXPORT_SYMBOL(mach_set_rtc_pll);
|
||||
void (*mach_reset)( void );
|
||||
void (*mach_halt)( void );
|
||||
void (*mach_power_off)( void );
|
||||
long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
|
||||
#ifdef CONFIG_HEARTBEAT
|
||||
void (*mach_heartbeat) (int);
|
||||
EXPORT_SYMBOL(mach_heartbeat);
|
||||
|
||||
@@ -65,7 +65,6 @@ SECTIONS {
|
||||
_edata = .;
|
||||
|
||||
EXCEPTION_TABLE(16)
|
||||
NOTES
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_begin = .;
|
||||
@@ -87,7 +86,7 @@ SECTIONS {
|
||||
_end = .;
|
||||
|
||||
STABS_DEBUG
|
||||
.comment 0 : { *(.comment) }
|
||||
ELF_DETAILS
|
||||
|
||||
/* Sections to be discarded */
|
||||
DISCARDS
|
||||
|
||||
@@ -49,7 +49,6 @@ SECTIONS
|
||||
*(.m68k_fixup)
|
||||
__stop_fixup = .;
|
||||
}
|
||||
NOTES
|
||||
.init_end : {
|
||||
/* This ALIGN be in a section so that _end is at the end of the
|
||||
load segment. */
|
||||
@@ -60,7 +59,7 @@ SECTIONS
|
||||
_end = . ;
|
||||
|
||||
STABS_DEBUG
|
||||
.comment 0 : { *(.comment) }
|
||||
ELF_DETAILS
|
||||
|
||||
/* Sections to be discarded */
|
||||
DISCARDS
|
||||
|
||||
@@ -33,7 +33,6 @@ SECTIONS
|
||||
RW_DATA(16, PAGE_SIZE, THREAD_SIZE) :data
|
||||
/* End of data goes *here* so that freeing init code works properly. */
|
||||
_edata = .;
|
||||
NOTES
|
||||
|
||||
/* will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE); /* Init code and data */
|
||||
@@ -53,6 +52,7 @@ __init_begin = .;
|
||||
_end = . ;
|
||||
|
||||
STABS_DEBUG
|
||||
ELF_DETAILS
|
||||
|
||||
/* Sections to be discarded */
|
||||
DISCARDS
|
||||
|
||||
@@ -55,7 +55,6 @@ struct mac_booter_data mac_bi_data;
|
||||
static unsigned long mac_orig_videoaddr;
|
||||
|
||||
extern int mac_hwclk(int, struct rtc_time *);
|
||||
extern void iop_preinit(void);
|
||||
extern void iop_init(void);
|
||||
extern void via_init(void);
|
||||
extern void via_init_clock(irq_handler_t func);
|
||||
@@ -141,7 +140,6 @@ void __init config_mac(void)
|
||||
mach_reset = mac_reset;
|
||||
mach_halt = mac_poweroff;
|
||||
mach_power_off = mac_poweroff;
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
#if IS_ENABLED(CONFIG_INPUT_M68K_BEEP)
|
||||
mach_beep = mac_mksound;
|
||||
#endif
|
||||
@@ -777,16 +775,12 @@ static struct resource scc_b_rsrcs[] = {
|
||||
struct platform_device scc_a_pdev = {
|
||||
.name = "scc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(scc_a_rsrcs),
|
||||
.resource = scc_a_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_a_pdev);
|
||||
|
||||
struct platform_device scc_b_pdev = {
|
||||
.name = "scc",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(scc_b_rsrcs),
|
||||
.resource = scc_b_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_b_pdev);
|
||||
|
||||
@@ -813,10 +807,15 @@ static void __init mac_identify(void)
|
||||
|
||||
/* Set up serial port resources for the console initcall. */
|
||||
|
||||
scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
|
||||
scc_a_rsrcs[0].end = scc_a_rsrcs[0].start;
|
||||
scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
|
||||
scc_b_rsrcs[0].end = scc_b_rsrcs[0].start;
|
||||
scc_a_rsrcs[0].start = (resource_size_t)mac_bi_data.sccbase + 2;
|
||||
scc_a_rsrcs[0].end = scc_a_rsrcs[0].start;
|
||||
scc_a_pdev.num_resources = ARRAY_SIZE(scc_a_rsrcs);
|
||||
scc_a_pdev.resource = scc_a_rsrcs;
|
||||
|
||||
scc_b_rsrcs[0].start = (resource_size_t)mac_bi_data.sccbase;
|
||||
scc_b_rsrcs[0].end = scc_b_rsrcs[0].start;
|
||||
scc_b_pdev.num_resources = ARRAY_SIZE(scc_b_rsrcs);
|
||||
scc_b_pdev.resource = scc_b_rsrcs;
|
||||
|
||||
switch (macintosh_config->scc_type) {
|
||||
case MAC_SCC_PSC:
|
||||
@@ -835,13 +834,6 @@ static void __init mac_identify(void)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to pre-init the IOPs, if any. Otherwise
|
||||
* the serial console won't work if the user had
|
||||
* the serial ports set to "Faster" mode in MacOS.
|
||||
*/
|
||||
iop_preinit();
|
||||
|
||||
pr_info("Detected Macintosh model: %d\n", model);
|
||||
|
||||
/*
|
||||
|
||||
@@ -47,6 +47,10 @@
|
||||
*
|
||||
* TODO:
|
||||
*
|
||||
* o The SCC IOP has to be placed in bypass mode before the serial console
|
||||
* gets initialized. iop_init() would be one place to do that. Or the
|
||||
* bootloader could do that. For now, the Serial Switch control panel
|
||||
* is needed for that -- contrary to the changelog above.
|
||||
* o Something should be periodically checking iop_alive() to make sure the
|
||||
* IOP hasn't died.
|
||||
* o Some of the IOP manager routines need better error checking and
|
||||
@@ -224,40 +228,6 @@ static struct iop_msg *iop_get_unused_msg(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called by the startup code before anything else. Its purpose
|
||||
* is to find and initialize the IOPs early in the boot sequence, so that
|
||||
* the serial IOP can be placed into bypass mode _before_ we try to
|
||||
* initialize the serial console.
|
||||
*/
|
||||
|
||||
void __init iop_preinit(void)
|
||||
{
|
||||
if (macintosh_config->scc_type == MAC_SCC_IOP) {
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX) {
|
||||
iop_base[IOP_NUM_SCC] = (struct mac_iop *) SCC_IOP_BASE_IIFX;
|
||||
} else {
|
||||
iop_base[IOP_NUM_SCC] = (struct mac_iop *) SCC_IOP_BASE_QUADRA;
|
||||
}
|
||||
iop_scc_present = 1;
|
||||
} else {
|
||||
iop_base[IOP_NUM_SCC] = NULL;
|
||||
iop_scc_present = 0;
|
||||
}
|
||||
if (macintosh_config->adb_type == MAC_ADB_IOP) {
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX) {
|
||||
iop_base[IOP_NUM_ISM] = (struct mac_iop *) ISM_IOP_BASE_IIFX;
|
||||
} else {
|
||||
iop_base[IOP_NUM_ISM] = (struct mac_iop *) ISM_IOP_BASE_QUADRA;
|
||||
}
|
||||
iop_stop(iop_base[IOP_NUM_ISM]);
|
||||
iop_ism_present = 1;
|
||||
} else {
|
||||
iop_base[IOP_NUM_ISM] = NULL;
|
||||
iop_ism_present = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the IOPs, if present.
|
||||
*/
|
||||
@@ -266,11 +236,23 @@ void __init iop_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (iop_scc_present) {
|
||||
if (macintosh_config->scc_type == MAC_SCC_IOP) {
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
iop_base[IOP_NUM_SCC] = (struct mac_iop *)SCC_IOP_BASE_IIFX;
|
||||
else
|
||||
iop_base[IOP_NUM_SCC] = (struct mac_iop *)SCC_IOP_BASE_QUADRA;
|
||||
iop_scc_present = 1;
|
||||
pr_debug("SCC IOP detected at %p\n", iop_base[IOP_NUM_SCC]);
|
||||
}
|
||||
if (iop_ism_present) {
|
||||
if (macintosh_config->adb_type == MAC_ADB_IOP) {
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
iop_base[IOP_NUM_ISM] = (struct mac_iop *)ISM_IOP_BASE_IIFX;
|
||||
else
|
||||
iop_base[IOP_NUM_ISM] = (struct mac_iop *)ISM_IOP_BASE_QUADRA;
|
||||
iop_ism_present = 1;
|
||||
pr_debug("ISM IOP detected at %p\n", iop_base[IOP_NUM_ISM]);
|
||||
|
||||
iop_stop(iop_base[IOP_NUM_ISM]);
|
||||
iop_start(iop_base[IOP_NUM_ISM]);
|
||||
iop_alive(iop_base[IOP_NUM_ISM]); /* clears the alive flag */
|
||||
}
|
||||
|
||||
@@ -169,8 +169,6 @@ void __init via_init(void)
|
||||
|
||||
via1[vIER] = 0x7F;
|
||||
via1[vIFR] = 0x7F;
|
||||
via1[vT1LL] = 0;
|
||||
via1[vT1LH] = 0;
|
||||
via1[vT1CL] = 0;
|
||||
via1[vT1CH] = 0;
|
||||
via1[vT2CL] = 0;
|
||||
@@ -225,8 +223,6 @@ void __init via_init(void)
|
||||
via2[gIER] = 0x7F;
|
||||
via2[gIFR] = 0x7F | rbv_clear;
|
||||
if (!rbv_present) {
|
||||
via2[vT1LL] = 0;
|
||||
via2[vT1LH] = 0;
|
||||
via2[vT1CL] = 0;
|
||||
via2[vT1CH] = 0;
|
||||
via2[vT2CL] = 0;
|
||||
@@ -304,21 +300,6 @@ void via_l2_flush(int writeback)
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the status of the L2 cache on a IIci
|
||||
*/
|
||||
|
||||
int via_get_cache_disable(void)
|
||||
{
|
||||
/* Safeguard against being called accidentally */
|
||||
if (!via2) {
|
||||
printk(KERN_ERR "via_get_cache_disable called on a non-VIA machine!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return (int) via2[gBufB] & VIA2B_vCDis;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize VIA2 for Nubus access
|
||||
*/
|
||||
@@ -619,8 +600,6 @@ void __init via_init_clock(irq_handler_t timer_routine)
|
||||
return;
|
||||
}
|
||||
|
||||
via1[vT1LL] = VIA_TC_LOW;
|
||||
via1[vT1LH] = VIA_TC_HIGH;
|
||||
via1[vT1CL] = VIA_TC_LOW;
|
||||
via1[vT1CH] = VIA_TC_HIGH;
|
||||
via1[vACR] |= 0x40;
|
||||
|
||||
@@ -80,7 +80,6 @@ void __init mvme147_init_IRQ(void)
|
||||
|
||||
void __init config_mvme147(void)
|
||||
{
|
||||
mach_max_dma_address = 0x01000000;
|
||||
mach_sched_init = mvme147_sched_init;
|
||||
mach_init_IRQ = mvme147_init_IRQ;
|
||||
mach_hwclk = mvme147_hwclk;
|
||||
|
||||
@@ -268,7 +268,6 @@ void __init config_mvme16x(void)
|
||||
char id[40];
|
||||
uint16_t brdno = be16_to_cpu(p->brdno);
|
||||
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
mach_sched_init = mvme16x_sched_init;
|
||||
mach_init_IRQ = mvme16x_init_IRQ;
|
||||
mach_hwclk = mvme16x_hwclk;
|
||||
|
||||
@@ -185,11 +185,6 @@ void __init config_q40(void)
|
||||
|
||||
/* disable a few things that SMSQ might have left enabled */
|
||||
q40_disable_irqs();
|
||||
|
||||
/* no DMA at all, but ide-scsi requires it.. make sure
|
||||
* all physical RAM fits into the boundary - otherwise
|
||||
* allocator may play costly and useless tricks */
|
||||
mach_max_dma_address = 1024*1024*1024;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -44,8 +44,6 @@ void __init config_sun3x(void)
|
||||
|
||||
sun3x_prom_init();
|
||||
|
||||
mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */
|
||||
|
||||
mach_sched_init = sun3x_sched_init;
|
||||
mach_init_IRQ = sun3_init_IRQ;
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ do { \
|
||||
*/
|
||||
#define read_octeon_64bit_hash_dword(index) \
|
||||
({ \
|
||||
u64 __value; \
|
||||
__be64 __value; \
|
||||
\
|
||||
__asm__ __volatile__ ( \
|
||||
"dmfc2 %[rt],0x0048+" STR(index) \
|
||||
|
||||
@@ -68,10 +68,11 @@ static int octeon_md5_init(struct shash_desc *desc)
|
||||
{
|
||||
struct md5_state *mctx = shash_desc_ctx(desc);
|
||||
|
||||
mctx->hash[0] = cpu_to_le32(MD5_H0);
|
||||
mctx->hash[1] = cpu_to_le32(MD5_H1);
|
||||
mctx->hash[2] = cpu_to_le32(MD5_H2);
|
||||
mctx->hash[3] = cpu_to_le32(MD5_H3);
|
||||
mctx->hash[0] = MD5_H0;
|
||||
mctx->hash[1] = MD5_H1;
|
||||
mctx->hash[2] = MD5_H2;
|
||||
mctx->hash[3] = MD5_H3;
|
||||
cpu_to_le32_array(mctx->hash, 4);
|
||||
mctx->byte_count = 0;
|
||||
|
||||
return 0;
|
||||
@@ -139,8 +140,9 @@ static int octeon_md5_final(struct shash_desc *desc, u8 *out)
|
||||
}
|
||||
|
||||
memset(p, 0, padding);
|
||||
mctx->block[14] = cpu_to_le32(mctx->byte_count << 3);
|
||||
mctx->block[15] = cpu_to_le32(mctx->byte_count >> 29);
|
||||
mctx->block[14] = mctx->byte_count << 3;
|
||||
mctx->block[15] = mctx->byte_count >> 29;
|
||||
cpu_to_le32_array(mctx->block + 14, 2);
|
||||
octeon_md5_transform(mctx->block);
|
||||
|
||||
octeon_md5_read_hash(mctx);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <linux/hardirq.h>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
void powerpc_sha_transform(u32 *state, const u8 *src);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <linux/hardirq.h>
|
||||
@@ -177,7 +177,7 @@ static int ppc_spe_sha256_final(struct shash_desc *desc, u8 *out)
|
||||
|
||||
static int ppc_spe_sha224_final(struct shash_desc *desc, u8 *out)
|
||||
{
|
||||
u32 D[SHA256_DIGEST_SIZE >> 2];
|
||||
__be32 D[SHA256_DIGEST_SIZE >> 2];
|
||||
__be32 *dst = (__be32 *)out;
|
||||
|
||||
ppc_spe_sha256_final(desc, (u8 *)D);
|
||||
|
||||
@@ -53,8 +53,7 @@ config ARCH_SUPPORTS_UPROBES
|
||||
config KASAN_SHADOW_OFFSET
|
||||
hex
|
||||
depends on KASAN
|
||||
default 0x18000000000000 if KASAN_S390_4_LEVEL_PAGING
|
||||
default 0x30000000000
|
||||
default 0x18000000000000
|
||||
|
||||
config S390
|
||||
def_bool y
|
||||
@@ -191,7 +190,6 @@ config S390
|
||||
select PCI_DOMAINS if PCI
|
||||
select PCI_MSI if PCI
|
||||
select PCI_MSI_ARCH_FALLBACKS if PCI_MSI
|
||||
select SET_FS
|
||||
select SPARSE_IRQ
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select THREAD_INFO_IN_TASK
|
||||
@@ -714,7 +712,7 @@ if PCI
|
||||
config PCI_NR_FUNCTIONS
|
||||
int "Maximum number of PCI functions (1-4096)"
|
||||
range 1 4096
|
||||
default "128"
|
||||
default "512"
|
||||
help
|
||||
This allows you to specify the maximum number of PCI functions which
|
||||
this kernel will support.
|
||||
|
||||
@@ -5,3 +5,11 @@ config TRACE_IRQFLAGS_SUPPORT
|
||||
|
||||
config EARLY_PRINTK
|
||||
def_bool y
|
||||
|
||||
config DEBUG_USER_ASCE
|
||||
bool "Debug User ASCE"
|
||||
help
|
||||
Check on exit to user space that address space control
|
||||
elements are setup correctly.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
@@ -25,7 +25,7 @@ KBUILD_AFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -D__ASSEMBLY__
|
||||
KBUILD_AFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),$(aflags_dwarf))
|
||||
KBUILD_CFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -O2
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -DDISABLE_BRANCH_PROFILING -D__NO_FORTIFY
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fno-delete-null-pointer-checks -msoft-float
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fno-delete-null-pointer-checks -msoft-float -mbackchain
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -fno-asynchronous-unwind-tables
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += -ffreestanding
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, address-of-packed-member)
|
||||
|
||||
@@ -2,20 +2,32 @@
|
||||
#ifndef BOOT_BOOT_H
|
||||
#define BOOT_BOOT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define BOOT_STACK_OFFSET 0x8000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
void startup_kernel(void);
|
||||
void detect_memory(void);
|
||||
unsigned long detect_memory(void);
|
||||
bool is_ipl_block_dump(void);
|
||||
void store_ipl_parmblock(void);
|
||||
void setup_boot_command_line(void);
|
||||
void parse_boot_command_line(void);
|
||||
void setup_memory_end(void);
|
||||
void verify_facilities(void);
|
||||
void print_missing_facilities(void);
|
||||
void print_pgm_check_info(void);
|
||||
unsigned long get_random_base(unsigned long safe_addr);
|
||||
void __printf(1, 2) decompressor_printk(const char *fmt, ...);
|
||||
|
||||
extern int kaslr_enabled;
|
||||
extern const char kernel_version[];
|
||||
extern unsigned long memory_limit;
|
||||
extern int vmalloc_size_set;
|
||||
extern int kaslr_enabled;
|
||||
|
||||
unsigned long read_ipl_report(unsigned long safe_offset);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* BOOT_BOOT_H */
|
||||
|
||||
1
arch/s390/boot/compressed/.gitignore
vendored
1
arch/s390/boot/compressed/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
vmlinux
|
||||
vmlinux.lds
|
||||
vmlinux.syms
|
||||
|
||||
@@ -10,21 +10,39 @@ GCOV_PROFILE := n
|
||||
UBSAN_SANITIZE := n
|
||||
KASAN_SANITIZE := n
|
||||
|
||||
obj-y := $(if $(CONFIG_KERNEL_UNCOMPRESSED),,decompressor.o) piggy.o info.o
|
||||
obj-y := $(if $(CONFIG_KERNEL_UNCOMPRESSED),,decompressor.o) info.o
|
||||
obj-all := $(obj-y) piggy.o syms.o
|
||||
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2
|
||||
targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4
|
||||
targets += info.bin $(obj-y)
|
||||
targets += info.bin syms.bin vmlinux.syms $(obj-all)
|
||||
|
||||
KBUILD_AFLAGS := $(KBUILD_AFLAGS_DECOMPRESSOR)
|
||||
KBUILD_CFLAGS := $(KBUILD_CFLAGS_DECOMPRESSOR)
|
||||
OBJCOPYFLAGS :=
|
||||
|
||||
OBJECTS := $(addprefix $(obj)/,$(obj-y))
|
||||
OBJECTS_ALL := $(addprefix $(obj)/,$(obj-all))
|
||||
|
||||
LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS) FORCE
|
||||
LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup --build-id=sha1 -T
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS_ALL) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
LDFLAGS_vmlinux.syms := --oformat $(LD_BFD) -e startup -T
|
||||
$(obj)/vmlinux.syms: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
quiet_cmd_dumpsyms = DUMPSYMS $<
|
||||
define cmd_dumpsyms
|
||||
$(NM) -n -S --format=bsd "$<" | $(PERL) -ne '/(\w+)\s+(\w+)\s+[tT]\s+(\w+)/ and printf "%x %x %s\0",hex $$1,hex $$2,$$3' > "$@"
|
||||
endef
|
||||
|
||||
$(obj)/syms.bin: $(obj)/vmlinux.syms FORCE
|
||||
$(call if_changed,dumpsyms)
|
||||
|
||||
OBJCOPYFLAGS_syms.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.decompressor.syms
|
||||
$(obj)/syms.o: $(obj)/syms.bin FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
OBJCOPYFLAGS_info.bin := -O binary --only-section=.vmlinux.info --set-section-flags .vmlinux.info=load
|
||||
$(obj)/info.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
#ifndef BOOT_COMPRESSED_DECOMPRESSOR_H
|
||||
#define BOOT_COMPRESSED_DECOMPRESSOR_H
|
||||
|
||||
#include <linux/stddef.h>
|
||||
|
||||
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
||||
static inline void *decompress_kernel(void) {}
|
||||
static inline void *decompress_kernel(void) { return NULL; }
|
||||
#else
|
||||
void *decompress_kernel(void);
|
||||
#endif
|
||||
|
||||
@@ -27,6 +27,7 @@ SECTIONS
|
||||
*(.rodata.*)
|
||||
_erodata = . ;
|
||||
}
|
||||
NOTES
|
||||
.data : {
|
||||
_data = . ;
|
||||
*(.data)
|
||||
@@ -82,6 +83,14 @@ SECTIONS
|
||||
*(.vmlinux.info)
|
||||
}
|
||||
|
||||
.decompressor.syms : {
|
||||
. += 1; /* make sure we have \0 before the first entry */
|
||||
. = ALIGN(2);
|
||||
_decompressor_syms_start = .;
|
||||
*(.decompressor.syms)
|
||||
_decompressor_syms_end = .;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
||||
. = 0x100000;
|
||||
#else
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include "boot.h"
|
||||
|
||||
#define ARCH_OFFSET 4
|
||||
|
||||
@@ -62,8 +63,12 @@ __HEAD
|
||||
|
||||
.org __LC_RST_NEW_PSW # 0x1a0
|
||||
.quad 0,iplstart
|
||||
.org __LC_EXT_NEW_PSW # 0x1b0
|
||||
.quad 0x0002000180000000,0x1b0 # disabled wait
|
||||
.org __LC_PGM_NEW_PSW # 0x1d0
|
||||
.quad 0x0000000180000000,startup_pgm_check_handler
|
||||
.org __LC_IO_NEW_PSW # 0x1f0
|
||||
.quad 0x0002000180000000,0x1f0 # disabled wait
|
||||
|
||||
.org 0x200
|
||||
|
||||
@@ -275,8 +280,8 @@ iplstart:
|
||||
# or linload or SALIPL
|
||||
#
|
||||
.org 0x10000
|
||||
ENTRY(startup)
|
||||
j .Lep_startup_normal
|
||||
SYM_CODE_START(startup)
|
||||
j startup_normal
|
||||
.org EP_OFFSET
|
||||
#
|
||||
# This is a list of s390 kernel entry points. At address 0x1000f the number of
|
||||
@@ -290,9 +295,9 @@ ENTRY(startup)
|
||||
# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
|
||||
#
|
||||
.org 0x10010
|
||||
ENTRY(startup_kdump)
|
||||
j .Lep_startup_kdump
|
||||
.Lep_startup_normal:
|
||||
j startup_kdump
|
||||
SYM_CODE_END(startup)
|
||||
SYM_CODE_START_LOCAL(startup_normal)
|
||||
mvi __LC_AR_MODE_ID,1 # set esame flag
|
||||
slr %r0,%r0 # set cpuid to zero
|
||||
lhi %r1,2 # mode 2 = esame (dump)
|
||||
@@ -303,6 +308,9 @@ ENTRY(startup_kdump)
|
||||
sam64 # switch to 64 bit addressing mode
|
||||
basr %r13,0 # get base
|
||||
.LPG0:
|
||||
mvc __LC_EXT_NEW_PSW(16),.Lext_new_psw-.LPG0(%r13)
|
||||
mvc __LC_PGM_NEW_PSW(16),.Lpgm_new_psw-.LPG0(%r13)
|
||||
mvc __LC_IO_NEW_PSW(16),.Lio_new_psw-.LPG0(%r13)
|
||||
xc 0x200(256),0x200 # partially clear lowcore
|
||||
xc 0x300(256),0x300
|
||||
xc 0xe00(256),0xe00
|
||||
@@ -315,12 +323,18 @@ ENTRY(startup_kdump)
|
||||
l %r15,.Lstack-.LPG0(%r13)
|
||||
brasl %r14,verify_facilities
|
||||
brasl %r14,startup_kernel
|
||||
SYM_CODE_END(startup_normal)
|
||||
|
||||
.Lstack:
|
||||
.long 0x8000 + (1<<(PAGE_SHIFT+BOOT_STACK_ORDER)) - STACK_FRAME_OVERHEAD
|
||||
.long BOOT_STACK_OFFSET + BOOT_STACK_SIZE - STACK_FRAME_OVERHEAD
|
||||
.align 8
|
||||
6: .long 0x7fffffff,0xffffffff
|
||||
|
||||
.Lext_new_psw:
|
||||
.quad 0x0002000180000000,0x1b0 # disabled wait
|
||||
.Lpgm_new_psw:
|
||||
.quad 0x0000000180000000,startup_pgm_check_handler
|
||||
.Lio_new_psw:
|
||||
.quad 0x0002000180000000,0x1f0 # disabled wait
|
||||
.Lctl: .quad 0x04040000 # cr0: AFP registers & secondary space
|
||||
.quad 0 # cr1: primary space segment table
|
||||
.quad .Lduct # cr2: dispatchable unit control table
|
||||
@@ -359,7 +373,7 @@ ENTRY(startup_kdump)
|
||||
# It simply saves general/control registers and psw in
|
||||
# the save area and does disabled wait with a faulty address.
|
||||
#
|
||||
ENTRY(startup_pgm_check_handler)
|
||||
SYM_CODE_START_LOCAL(startup_pgm_check_handler)
|
||||
stmg %r8,%r15,__LC_SAVE_AREA_SYNC
|
||||
la %r8,4095
|
||||
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r8)
|
||||
@@ -378,9 +392,9 @@ ENTRY(startup_pgm_check_handler)
|
||||
la %r8,4095
|
||||
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r8)
|
||||
lpswe __LC_RETURN_PSW # disabled wait
|
||||
SYM_CODE_END(startup_pgm_check_handler)
|
||||
.Ldump_info_stack:
|
||||
.long 0x5000 + PAGE_SIZE - STACK_FRAME_OVERHEAD
|
||||
ENDPROC(startup_pgm_check_handler)
|
||||
|
||||
#
|
||||
# params at 10400 (setup.h)
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
# Note: This code has to be position independent
|
||||
#
|
||||
|
||||
.align 2
|
||||
.Lep_startup_kdump:
|
||||
SYM_CODE_START_LOCAL(startup_kdump)
|
||||
lhi %r1,2 # mode 2 = esame (dump)
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode
|
||||
sam64 # Switch to 64 bit addressing
|
||||
@@ -87,14 +86,15 @@
|
||||
startup_kdump_relocated:
|
||||
basr %r13,0
|
||||
0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel...
|
||||
SYM_CODE_END(startup_kdump)
|
||||
.align 8
|
||||
.Lrestart_psw:
|
||||
.quad 0x0000000080000000,0x0000000000000000 + startup
|
||||
#else
|
||||
.align 2
|
||||
.Lep_startup_kdump:
|
||||
SYM_CODE_START_LOCAL(startup_kdump)
|
||||
larl %r13,startup_kdump_crash
|
||||
lpswe 0(%r13)
|
||||
SYM_CODE_END(startup_kdump)
|
||||
.align 8
|
||||
startup_kdump_crash:
|
||||
.quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash
|
||||
|
||||
@@ -17,10 +17,10 @@ int __bootdata_preserved(ipl_block_valid);
|
||||
unsigned int __bootdata_preserved(zlib_dfltcc_support) = ZLIB_DFLTCC_FULL;
|
||||
|
||||
unsigned long __bootdata(vmalloc_size) = VMALLOC_DEFAULT_SIZE;
|
||||
unsigned long __bootdata(memory_end);
|
||||
int __bootdata(memory_end_set);
|
||||
int __bootdata(noexec_disabled);
|
||||
|
||||
unsigned long memory_limit;
|
||||
int vmalloc_size_set;
|
||||
int kaslr_enabled;
|
||||
|
||||
static inline int __diag308(unsigned long subcode, void *addr)
|
||||
@@ -57,6 +57,17 @@ void store_ipl_parmblock(void)
|
||||
ipl_block_valid = 1;
|
||||
}
|
||||
|
||||
bool is_ipl_block_dump(void)
|
||||
{
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_FCP &&
|
||||
ipl_block.fcp.opt == IPL_PB0_FCP_OPT_DUMP)
|
||||
return true;
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_NVME &&
|
||||
ipl_block.nvme.opt == IPL_PB0_NVME_OPT_DUMP)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static size_t scpdata_length(const u8 *buf, size_t count)
|
||||
{
|
||||
while (count) {
|
||||
@@ -237,13 +248,13 @@ void parse_boot_command_line(void)
|
||||
while (*args) {
|
||||
args = next_arg(args, ¶m, &val);
|
||||
|
||||
if (!strcmp(param, "mem") && val) {
|
||||
memory_end = round_down(memparse(val, NULL), PAGE_SIZE);
|
||||
memory_end_set = 1;
|
||||
}
|
||||
if (!strcmp(param, "mem") && val)
|
||||
memory_limit = round_down(memparse(val, NULL), PAGE_SIZE);
|
||||
|
||||
if (!strcmp(param, "vmalloc") && val)
|
||||
if (!strcmp(param, "vmalloc") && val) {
|
||||
vmalloc_size = round_up(memparse(val, NULL), PAGE_SIZE);
|
||||
vmalloc_size_set = 1;
|
||||
}
|
||||
|
||||
if (!strcmp(param, "dfltcc") && val) {
|
||||
if (!strcmp(val, "off"))
|
||||
@@ -279,27 +290,3 @@ void parse_boot_command_line(void)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool is_ipl_block_dump(void)
|
||||
{
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_FCP &&
|
||||
ipl_block.fcp.opt == IPL_PB0_FCP_OPT_DUMP)
|
||||
return true;
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_NVME &&
|
||||
ipl_block.nvme.opt == IPL_PB0_NVME_OPT_DUMP)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void setup_memory_end(void)
|
||||
{
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
if (OLDMEM_BASE) {
|
||||
kaslr_enabled = 0;
|
||||
} else if (ipl_block_valid && is_ipl_block_dump()) {
|
||||
kaslr_enabled = 0;
|
||||
if (!sclp_early_get_hsa_size(&memory_end) && memory_end)
|
||||
memory_end_set = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <asm/cpacf.h>
|
||||
#include <asm/timex.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <asm/kasan.h>
|
||||
#include "compressed/decompressor.h"
|
||||
#include "boot.h"
|
||||
|
||||
@@ -176,8 +177,14 @@ unsigned long get_random_base(unsigned long safe_addr)
|
||||
unsigned long kasan_needs;
|
||||
int i;
|
||||
|
||||
if (memory_end_set)
|
||||
memory_limit = min(memory_limit, memory_end);
|
||||
memory_limit = min(memory_limit, ident_map_size);
|
||||
|
||||
/*
|
||||
* Avoid putting kernel in the end of physical memory
|
||||
* which kasan will use for shadow memory and early pgtable
|
||||
* mapping allocations.
|
||||
*/
|
||||
memory_limit -= kasan_estimate_memory_needs(memory_limit);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && INITRD_START && INITRD_SIZE) {
|
||||
if (safe_addr < INITRD_START + INITRD_SIZE)
|
||||
@@ -185,28 +192,6 @@ unsigned long get_random_base(unsigned long safe_addr)
|
||||
}
|
||||
safe_addr = ALIGN(safe_addr, THREAD_SIZE);
|
||||
|
||||
if ((IS_ENABLED(CONFIG_KASAN))) {
|
||||
/*
|
||||
* Estimate kasan memory requirements, which it will reserve
|
||||
* at the very end of available physical memory. To estimate
|
||||
* that, we take into account that kasan would require
|
||||
* 1/8 of available physical memory (for shadow memory) +
|
||||
* creating page tables for the whole memory + shadow memory
|
||||
* region (1 + 1/8). To keep page tables estimates simple take
|
||||
* the double of combined ptes size.
|
||||
*/
|
||||
memory_limit = get_mem_detect_end();
|
||||
if (memory_end_set && memory_limit > memory_end)
|
||||
memory_limit = memory_end;
|
||||
|
||||
/* for shadow memory */
|
||||
kasan_needs = memory_limit / 8;
|
||||
/* for paging structures */
|
||||
kasan_needs += (memory_limit + kasan_needs) / PAGE_SIZE /
|
||||
_PAGE_ENTRIES * _PAGE_TABLE_SIZE * 2;
|
||||
memory_limit -= kasan_needs;
|
||||
}
|
||||
|
||||
kernel_size = vmlinux.image_size + vmlinux.bss_size;
|
||||
if (safe_addr + kernel_size > memory_limit)
|
||||
return 0;
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "compressed/decompressor.h"
|
||||
#include "boot.h"
|
||||
|
||||
unsigned long __bootdata(max_physmem_end);
|
||||
struct mem_detect_info __bootdata(mem_detect);
|
||||
|
||||
/* up to 256 storage elements, 1020 subincrements each */
|
||||
@@ -149,27 +148,29 @@ static void search_mem_end(void)
|
||||
add_mem_detect_block(0, (offset + 1) << 20);
|
||||
}
|
||||
|
||||
void detect_memory(void)
|
||||
unsigned long detect_memory(void)
|
||||
{
|
||||
unsigned long max_physmem_end;
|
||||
|
||||
sclp_early_get_memsize(&max_physmem_end);
|
||||
|
||||
if (!sclp_early_read_storage_info()) {
|
||||
mem_detect.info_source = MEM_DETECT_SCLP_STOR_INFO;
|
||||
return;
|
||||
return max_physmem_end;
|
||||
}
|
||||
|
||||
if (!diag260()) {
|
||||
mem_detect.info_source = MEM_DETECT_DIAG260;
|
||||
return;
|
||||
return max_physmem_end;
|
||||
}
|
||||
|
||||
if (max_physmem_end) {
|
||||
add_mem_detect_block(0, max_physmem_end);
|
||||
mem_detect.info_source = MEM_DETECT_SCLP_READ_INFO;
|
||||
return;
|
||||
return max_physmem_end;
|
||||
}
|
||||
|
||||
search_mem_end();
|
||||
mem_detect.info_source = MEM_DETECT_BIN_SEARCH;
|
||||
max_physmem_end = get_mem_detect_end();
|
||||
return get_mem_detect_end();
|
||||
}
|
||||
|
||||
@@ -1,99 +1,181 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <asm/stacktrace.h>
|
||||
#include <asm/boot_data.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <asm/uv.h>
|
||||
#include <stdarg.h>
|
||||
#include "boot.h"
|
||||
|
||||
const char hex_asc[] = "0123456789abcdef";
|
||||
|
||||
#define add_val_as_hex(dst, val) \
|
||||
__add_val_as_hex(dst, (const unsigned char *)&val, sizeof(val))
|
||||
|
||||
static char *__add_val_as_hex(char *dst, const unsigned char *src, size_t count)
|
||||
static char *as_hex(char *dst, unsigned long val, int pad)
|
||||
{
|
||||
while (count--)
|
||||
dst = hex_byte_pack(dst, *src++);
|
||||
return dst;
|
||||
char *p, *end = p = dst + max(pad, (int)__fls(val | 1) / 4 + 1);
|
||||
|
||||
for (*p-- = 0; p >= dst; val >>= 4)
|
||||
*p-- = hex_asc[val & 0x0f];
|
||||
return end;
|
||||
}
|
||||
|
||||
static char *add_str(char *dst, char *src)
|
||||
static char *symstart(char *p)
|
||||
{
|
||||
strcpy(dst, src);
|
||||
return dst + strlen(dst);
|
||||
while (*p)
|
||||
p--;
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
extern char _decompressor_syms_start[], _decompressor_syms_end[];
|
||||
static noinline char *findsym(unsigned long ip, unsigned short *off, unsigned short *len)
|
||||
{
|
||||
/* symbol entries are in a form "10000 c4 startup\0" */
|
||||
char *a = _decompressor_syms_start;
|
||||
char *b = _decompressor_syms_end;
|
||||
unsigned long start;
|
||||
unsigned long size;
|
||||
char *pivot;
|
||||
char *endp;
|
||||
|
||||
while (a < b) {
|
||||
pivot = symstart(a + (b - a) / 2);
|
||||
start = simple_strtoull(pivot, &endp, 16);
|
||||
size = simple_strtoull(endp + 1, &endp, 16);
|
||||
if (ip < start) {
|
||||
b = pivot;
|
||||
continue;
|
||||
}
|
||||
if (ip > start + size) {
|
||||
a = pivot + strlen(pivot) + 1;
|
||||
continue;
|
||||
}
|
||||
*off = ip - start;
|
||||
*len = size;
|
||||
return endp + 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static noinline char *strsym(void *ip)
|
||||
{
|
||||
static char buf[64];
|
||||
unsigned short off;
|
||||
unsigned short len;
|
||||
char *p;
|
||||
|
||||
p = findsym((unsigned long)ip, &off, &len);
|
||||
if (p) {
|
||||
strncpy(buf, p, sizeof(buf));
|
||||
/* reserve 15 bytes for offset/len in symbol+0x1234/0x1234 */
|
||||
p = buf + strnlen(buf, sizeof(buf) - 15);
|
||||
strcpy(p, "+0x");
|
||||
p = as_hex(p + 3, off, 0);
|
||||
strcpy(p, "/0x");
|
||||
as_hex(p + 3, len, 0);
|
||||
} else {
|
||||
as_hex(buf, (unsigned long)ip, 16);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
void decompressor_printk(const char *fmt, ...)
|
||||
{
|
||||
char buf[1024] = { 0 };
|
||||
char *end = buf + sizeof(buf) - 1; /* make sure buf is 0 terminated */
|
||||
unsigned long pad;
|
||||
char *p = buf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
for (; p < end && *fmt; fmt++) {
|
||||
if (*fmt != '%') {
|
||||
*p++ = *fmt;
|
||||
continue;
|
||||
}
|
||||
pad = isdigit(*++fmt) ? simple_strtol(fmt, (char **)&fmt, 10) : 0;
|
||||
switch (*fmt) {
|
||||
case 's':
|
||||
p = buf + strlcat(buf, va_arg(args, char *), sizeof(buf));
|
||||
break;
|
||||
case 'p':
|
||||
if (*++fmt != 'S')
|
||||
goto out;
|
||||
p = buf + strlcat(buf, strsym(va_arg(args, void *)), sizeof(buf));
|
||||
break;
|
||||
case 'l':
|
||||
if (*++fmt != 'x' || end - p <= max(sizeof(long) * 2, pad))
|
||||
goto out;
|
||||
p = as_hex(p, va_arg(args, unsigned long), pad);
|
||||
break;
|
||||
case 'x':
|
||||
if (end - p <= max(sizeof(int) * 2, pad))
|
||||
goto out;
|
||||
p = as_hex(p, va_arg(args, unsigned int), pad);
|
||||
break;
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
out:
|
||||
va_end(args);
|
||||
sclp_early_printk(buf);
|
||||
}
|
||||
|
||||
static noinline void print_stacktrace(void)
|
||||
{
|
||||
struct stack_info boot_stack = { STACK_TYPE_TASK, BOOT_STACK_OFFSET,
|
||||
BOOT_STACK_OFFSET + BOOT_STACK_SIZE };
|
||||
unsigned long sp = S390_lowcore.gpregs_save_area[15];
|
||||
bool first = true;
|
||||
|
||||
decompressor_printk("Call Trace:\n");
|
||||
while (!(sp & 0x7) && on_stack(&boot_stack, sp, sizeof(struct stack_frame))) {
|
||||
struct stack_frame *sf = (struct stack_frame *)sp;
|
||||
|
||||
decompressor_printk(first ? "(sp:%016lx [<%016lx>] %pS)\n" :
|
||||
" sp:%016lx [<%016lx>] %pS\n",
|
||||
sp, sf->gprs[8], (void *)sf->gprs[8]);
|
||||
if (sf->back_chain <= sp)
|
||||
break;
|
||||
sp = sf->back_chain;
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
void print_pgm_check_info(void)
|
||||
{
|
||||
unsigned long *gpregs = (unsigned long *)S390_lowcore.gpregs_save_area;
|
||||
struct psw_bits *psw = &psw_bits(S390_lowcore.psw_save_area);
|
||||
unsigned short ilc = S390_lowcore.pgm_ilc >> 1;
|
||||
char buf[256];
|
||||
int row, col;
|
||||
char *p;
|
||||
|
||||
add_str(buf, "Linux version ");
|
||||
strlcat(buf, kernel_version, sizeof(buf) - 1);
|
||||
strlcat(buf, "\n", sizeof(buf));
|
||||
sclp_early_printk(buf);
|
||||
|
||||
p = add_str(buf, "Kernel fault: interruption code ");
|
||||
p = add_val_as_hex(buf + strlen(buf), S390_lowcore.pgm_code);
|
||||
p = add_str(p, " ilc:");
|
||||
*p++ = hex_asc_lo(ilc);
|
||||
add_str(p, "\n");
|
||||
sclp_early_printk(buf);
|
||||
|
||||
if (kaslr_enabled) {
|
||||
p = add_str(buf, "Kernel random base: ");
|
||||
p = add_val_as_hex(p, __kaslr_offset);
|
||||
add_str(p, "\n");
|
||||
sclp_early_printk(buf);
|
||||
}
|
||||
|
||||
p = add_str(buf, "PSW : ");
|
||||
p = add_val_as_hex(p, S390_lowcore.psw_save_area.mask);
|
||||
p = add_str(p, " ");
|
||||
p = add_val_as_hex(p, S390_lowcore.psw_save_area.addr);
|
||||
add_str(p, "\n");
|
||||
sclp_early_printk(buf);
|
||||
|
||||
p = add_str(buf, " R:");
|
||||
*p++ = hex_asc_lo(psw->per);
|
||||
p = add_str(p, " T:");
|
||||
*p++ = hex_asc_lo(psw->dat);
|
||||
p = add_str(p, " IO:");
|
||||
*p++ = hex_asc_lo(psw->io);
|
||||
p = add_str(p, " EX:");
|
||||
*p++ = hex_asc_lo(psw->ext);
|
||||
p = add_str(p, " Key:");
|
||||
*p++ = hex_asc_lo(psw->key);
|
||||
p = add_str(p, " M:");
|
||||
*p++ = hex_asc_lo(psw->mcheck);
|
||||
p = add_str(p, " W:");
|
||||
*p++ = hex_asc_lo(psw->wait);
|
||||
p = add_str(p, " P:");
|
||||
*p++ = hex_asc_lo(psw->pstate);
|
||||
p = add_str(p, " AS:");
|
||||
*p++ = hex_asc_lo(psw->as);
|
||||
p = add_str(p, " CC:");
|
||||
*p++ = hex_asc_lo(psw->cc);
|
||||
p = add_str(p, " PM:");
|
||||
*p++ = hex_asc_lo(psw->pm);
|
||||
p = add_str(p, " RI:");
|
||||
*p++ = hex_asc_lo(psw->ri);
|
||||
p = add_str(p, " EA:");
|
||||
*p++ = hex_asc_lo(psw->eaba);
|
||||
add_str(p, "\n");
|
||||
sclp_early_printk(buf);
|
||||
|
||||
for (row = 0; row < 4; row++) {
|
||||
p = add_str(buf, row == 0 ? "GPRS:" : " ");
|
||||
for (col = 0; col < 4; col++) {
|
||||
p = add_str(p, " ");
|
||||
p = add_val_as_hex(p, S390_lowcore.gpregs_save_area[row * 4 + col]);
|
||||
}
|
||||
add_str(p, "\n");
|
||||
sclp_early_printk(buf);
|
||||
}
|
||||
decompressor_printk("Linux version %s\n", kernel_version);
|
||||
if (!is_prot_virt_guest() && early_command_line[0])
|
||||
decompressor_printk("Kernel command line: %s\n", early_command_line);
|
||||
decompressor_printk("Kernel fault: interruption code %04x ilc:%x\n",
|
||||
S390_lowcore.pgm_code, S390_lowcore.pgm_ilc >> 1);
|
||||
if (kaslr_enabled)
|
||||
decompressor_printk("Kernel random base: %lx\n", __kaslr_offset);
|
||||
decompressor_printk("PSW : %016lx %016lx (%pS)\n",
|
||||
S390_lowcore.psw_save_area.mask,
|
||||
S390_lowcore.psw_save_area.addr,
|
||||
(void *)S390_lowcore.psw_save_area.addr);
|
||||
decompressor_printk(
|
||||
" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x P:%x AS:%x CC:%x PM:%x RI:%x EA:%x\n",
|
||||
psw->per, psw->dat, psw->io, psw->ext, psw->key, psw->mcheck,
|
||||
psw->wait, psw->pstate, psw->as, psw->cc, psw->pm, psw->ri,
|
||||
psw->eaba);
|
||||
decompressor_printk("GPRS: %016lx %016lx %016lx %016lx\n",
|
||||
gpregs[0], gpregs[1], gpregs[2], gpregs[3]);
|
||||
decompressor_printk(" %016lx %016lx %016lx %016lx\n",
|
||||
gpregs[4], gpregs[5], gpregs[6], gpregs[7]);
|
||||
decompressor_printk(" %016lx %016lx %016lx %016lx\n",
|
||||
gpregs[8], gpregs[9], gpregs[10], gpregs[11]);
|
||||
decompressor_printk(" %016lx %016lx %016lx %016lx\n",
|
||||
gpregs[12], gpregs[13], gpregs[14], gpregs[15]);
|
||||
print_stacktrace();
|
||||
decompressor_printk("Last Breaking-Event-Address:\n");
|
||||
decompressor_printk(" [<%016lx>] %pS\n", (unsigned long)S390_lowcore.breaking_event_addr,
|
||||
(void *)S390_lowcore.breaking_event_addr);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/string.h>
|
||||
#include <linux/elf.h>
|
||||
#include <asm/boot_data.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/cpu_mf.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/kexec.h>
|
||||
#include <asm/sclp.h>
|
||||
@@ -13,6 +15,7 @@
|
||||
extern char __boot_data_start[], __boot_data_end[];
|
||||
extern char __boot_data_preserved_start[], __boot_data_preserved_end[];
|
||||
unsigned long __bootdata_preserved(__kaslr_offset);
|
||||
unsigned long __bootdata(ident_map_size);
|
||||
|
||||
/*
|
||||
* Some code and data needs to stay below 2 GB, even when the kernel would be
|
||||
@@ -58,6 +61,14 @@ void error(char *x)
|
||||
disabled_wait();
|
||||
}
|
||||
|
||||
static void setup_lpp(void)
|
||||
{
|
||||
S390_lowcore.current_pid = 0;
|
||||
S390_lowcore.lpp = LPP_MAGIC;
|
||||
if (test_facility(40))
|
||||
lpp(&S390_lowcore.lpp);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
||||
unsigned long mem_safe_offset(void)
|
||||
{
|
||||
@@ -118,6 +129,46 @@ static void handle_relocs(unsigned long offset)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Merge information from several sources into a single ident_map_size value.
|
||||
* "ident_map_size" represents the upper limit of physical memory we may ever
|
||||
* reach. It might not be all online memory, but also include standby (offline)
|
||||
* memory. "ident_map_size" could be lower then actual standby or even online
|
||||
* memory present, due to limiting factors. We should never go above this limit.
|
||||
* It is the size of our identity mapping.
|
||||
*
|
||||
* Consider the following factors:
|
||||
* 1. max_physmem_end - end of physical memory online or standby.
|
||||
* Always <= end of the last online memory block (get_mem_detect_end()).
|
||||
* 2. CONFIG_MAX_PHYSMEM_BITS - the maximum size of physical memory the
|
||||
* kernel is able to support.
|
||||
* 3. "mem=" kernel command line option which limits physical memory usage.
|
||||
* 4. OLDMEM_BASE which is a kdump memory limit when the kernel is executed as
|
||||
* crash kernel.
|
||||
* 5. "hsa" size which is a memory limit when the kernel is executed during
|
||||
* zfcp/nvme dump.
|
||||
*/
|
||||
static void setup_ident_map_size(unsigned long max_physmem_end)
|
||||
{
|
||||
unsigned long hsa_size;
|
||||
|
||||
ident_map_size = max_physmem_end;
|
||||
if (memory_limit)
|
||||
ident_map_size = min(ident_map_size, memory_limit);
|
||||
ident_map_size = min(ident_map_size, 1UL << MAX_PHYSMEM_BITS);
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
if (OLDMEM_BASE) {
|
||||
kaslr_enabled = 0;
|
||||
ident_map_size = min(ident_map_size, OLDMEM_SIZE);
|
||||
} else if (ipl_block_valid && is_ipl_block_dump()) {
|
||||
kaslr_enabled = 0;
|
||||
if (!sclp_early_get_hsa_size(&hsa_size) && hsa_size)
|
||||
ident_map_size = min(ident_map_size, hsa_size);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* This function clears the BSS section of the decompressed Linux kernel and NOT the decompressor's.
|
||||
*/
|
||||
@@ -126,12 +177,27 @@ static void clear_bss_section(void)
|
||||
memset((void *)vmlinux.default_lma + vmlinux.image_size, 0, vmlinux.bss_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set vmalloc area size to an 8th of (potential) physical memory
|
||||
* size, unless size has been set by kernel command line parameter.
|
||||
*/
|
||||
static void setup_vmalloc_size(void)
|
||||
{
|
||||
unsigned long size;
|
||||
|
||||
if (vmalloc_size_set)
|
||||
return;
|
||||
size = round_up(ident_map_size / 8, _SEGMENT_SIZE);
|
||||
vmalloc_size = max(size, vmalloc_size);
|
||||
}
|
||||
|
||||
void startup_kernel(void)
|
||||
{
|
||||
unsigned long random_lma;
|
||||
unsigned long safe_addr;
|
||||
void *img;
|
||||
|
||||
setup_lpp();
|
||||
store_ipl_parmblock();
|
||||
safe_addr = mem_safe_offset();
|
||||
safe_addr = read_ipl_report(safe_addr);
|
||||
@@ -140,8 +206,8 @@ void startup_kernel(void)
|
||||
sclp_early_read_info();
|
||||
setup_boot_command_line();
|
||||
parse_boot_command_line();
|
||||
setup_memory_end();
|
||||
detect_memory();
|
||||
setup_ident_map_size(detect_memory());
|
||||
setup_vmalloc_size();
|
||||
|
||||
random_lma = __kaslr_offset = 0;
|
||||
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && kaslr_enabled) {
|
||||
|
||||
@@ -826,6 +826,7 @@ CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_BPF_KPROBE_OVERRIDE=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_DEBUG_USER_ASCE=y
|
||||
CONFIG_NOTIFIER_ERROR_INJECTION=m
|
||||
CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* s390 arch random implementation.
|
||||
*
|
||||
* Copyright IBM Corp. 2017, 2018
|
||||
* Copyright IBM Corp. 2017, 2020
|
||||
* Author(s): Harald Freudenberger
|
||||
*
|
||||
* The s390_arch_random_generate() function may be called from random.c
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
DEFINE_STATIC_KEY_FALSE(s390_arch_random_available);
|
||||
@@ -99,6 +100,113 @@ static void arch_rng_refill_buffer(struct work_struct *unused)
|
||||
queue_delayed_work(system_long_wq, &arch_rng_work, delay);
|
||||
}
|
||||
|
||||
/*
|
||||
* Here follows the implementation of s390_arch_get_random_long().
|
||||
*
|
||||
* The random longs to be pulled by arch_get_random_long() are
|
||||
* prepared in an 4K buffer which is filled from the NIST 800-90
|
||||
* compliant s390 drbg. By default the random long buffer is refilled
|
||||
* 256 times before the drbg itself needs a reseed. The reseed of the
|
||||
* drbg is done with 32 bytes fetched from the high quality (but slow)
|
||||
* trng which is assumed to deliver 100% entropy. So the 32 * 8 = 256
|
||||
* bits of entropy are spread over 256 * 4KB = 1MB serving 131072
|
||||
* arch_get_random_long() invocations before reseeded.
|
||||
*
|
||||
* How often the 4K random long buffer is refilled with the drbg
|
||||
* before the drbg is reseeded can be adjusted. There is a module
|
||||
* parameter 's390_arch_rnd_long_drbg_reseed' accessible via
|
||||
* /sys/module/arch_random/parameters/rndlong_drbg_reseed
|
||||
* or as kernel command line parameter
|
||||
* arch_random.rndlong_drbg_reseed=<value>
|
||||
* This parameter tells how often the drbg fills the 4K buffer before
|
||||
* it is re-seeded by fresh entropy from the trng.
|
||||
* A value of 16 results in reseeding the drbg at every 16 * 4 KB = 64
|
||||
* KB with 32 bytes of fresh entropy pulled from the trng. So a value
|
||||
* of 16 would result in 256 bits entropy per 64 KB.
|
||||
* A value of 256 results in 1MB of drbg output before a reseed of the
|
||||
* drbg is done. So this would spread the 256 bits of entropy among 1MB.
|
||||
* Setting this parameter to 0 forces the reseed to take place every
|
||||
* time the 4K buffer is depleted, so the entropy rises to 256 bits
|
||||
* entropy per 4K or 0.5 bit entropy per arch_get_random_long(). With
|
||||
* setting this parameter to negative values all this effort is
|
||||
* disabled, arch_get_random long() returns false and thus indicating
|
||||
* that the arch_get_random_long() feature is disabled at all.
|
||||
*/
|
||||
|
||||
static unsigned long rndlong_buf[512];
|
||||
static DEFINE_SPINLOCK(rndlong_lock);
|
||||
static int rndlong_buf_index;
|
||||
|
||||
static int rndlong_drbg_reseed = 256;
|
||||
module_param_named(rndlong_drbg_reseed, rndlong_drbg_reseed, int, 0600);
|
||||
MODULE_PARM_DESC(rndlong_drbg_reseed, "s390 arch_get_random_long() drbg reseed");
|
||||
|
||||
static inline void refill_rndlong_buf(void)
|
||||
{
|
||||
static u8 prng_ws[240];
|
||||
static int drbg_counter;
|
||||
|
||||
if (--drbg_counter < 0) {
|
||||
/* need to re-seed the drbg */
|
||||
u8 seed[32];
|
||||
|
||||
/* fetch seed from trng */
|
||||
cpacf_trng(NULL, 0, seed, sizeof(seed));
|
||||
/* seed drbg */
|
||||
memset(prng_ws, 0, sizeof(prng_ws));
|
||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
||||
&prng_ws, NULL, 0, seed, sizeof(seed));
|
||||
/* re-init counter for drbg */
|
||||
drbg_counter = rndlong_drbg_reseed;
|
||||
}
|
||||
|
||||
/* fill the arch_get_random_long buffer from drbg */
|
||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN, &prng_ws,
|
||||
(u8 *) rndlong_buf, sizeof(rndlong_buf),
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
bool s390_arch_get_random_long(unsigned long *v)
|
||||
{
|
||||
bool rc = false;
|
||||
unsigned long flags;
|
||||
|
||||
/* arch_get_random_long() disabled ? */
|
||||
if (rndlong_drbg_reseed < 0)
|
||||
return false;
|
||||
|
||||
/* try to lock the random long lock */
|
||||
if (!spin_trylock_irqsave(&rndlong_lock, flags))
|
||||
return false;
|
||||
|
||||
if (--rndlong_buf_index >= 0) {
|
||||
/* deliver next long value from the buffer */
|
||||
*v = rndlong_buf[rndlong_buf_index];
|
||||
rc = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* buffer is depleted and needs refill */
|
||||
if (in_interrupt()) {
|
||||
/* delay refill in interrupt context to next caller */
|
||||
rndlong_buf_index = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* refill random long buffer */
|
||||
refill_rndlong_buf();
|
||||
rndlong_buf_index = ARRAY_SIZE(rndlong_buf);
|
||||
|
||||
/* and provide one random long */
|
||||
*v = rndlong_buf[--rndlong_buf_index];
|
||||
rc = true;
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&rndlong_lock, flags);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(s390_arch_get_random_long);
|
||||
|
||||
static int __init s390_arch_random_init(void)
|
||||
{
|
||||
/* all the needed PRNO subfunctions available ? */
|
||||
|
||||
@@ -674,20 +674,6 @@ static const struct file_operations prng_tdes_fops = {
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static struct miscdevice prng_sha512_dev = {
|
||||
.name = "prandom",
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.mode = 0644,
|
||||
.fops = &prng_sha512_fops,
|
||||
};
|
||||
static struct miscdevice prng_tdes_dev = {
|
||||
.name = "prandom",
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.mode = 0644,
|
||||
.fops = &prng_tdes_fops,
|
||||
};
|
||||
|
||||
|
||||
/* chunksize attribute (ro) */
|
||||
static ssize_t prng_chunksize_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
@@ -801,18 +787,30 @@ static struct attribute *prng_sha512_dev_attrs[] = {
|
||||
&dev_attr_strength.attr,
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(prng_sha512_dev);
|
||||
|
||||
static struct attribute *prng_tdes_dev_attrs[] = {
|
||||
&dev_attr_chunksize.attr,
|
||||
&dev_attr_byte_counter.attr,
|
||||
&dev_attr_mode.attr,
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(prng_tdes_dev);
|
||||
|
||||
static struct attribute_group prng_sha512_dev_attr_group = {
|
||||
.attrs = prng_sha512_dev_attrs
|
||||
static struct miscdevice prng_sha512_dev = {
|
||||
.name = "prandom",
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.mode = 0644,
|
||||
.fops = &prng_sha512_fops,
|
||||
.groups = prng_sha512_dev_groups,
|
||||
};
|
||||
static struct attribute_group prng_tdes_dev_attr_group = {
|
||||
.attrs = prng_tdes_dev_attrs
|
||||
|
||||
static struct miscdevice prng_tdes_dev = {
|
||||
.name = "prandom",
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.mode = 0644,
|
||||
.fops = &prng_tdes_fops,
|
||||
.groups = prng_tdes_dev_groups,
|
||||
};
|
||||
|
||||
|
||||
@@ -867,13 +865,6 @@ static int __init prng_init(void)
|
||||
prng_sha512_deinstantiate();
|
||||
goto out;
|
||||
}
|
||||
ret = sysfs_create_group(&prng_sha512_dev.this_device->kobj,
|
||||
&prng_sha512_dev_attr_group);
|
||||
if (ret) {
|
||||
misc_deregister(&prng_sha512_dev);
|
||||
prng_sha512_deinstantiate();
|
||||
goto out;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@@ -898,14 +889,6 @@ static int __init prng_init(void)
|
||||
prng_tdes_deinstantiate();
|
||||
goto out;
|
||||
}
|
||||
ret = sysfs_create_group(&prng_tdes_dev.this_device->kobj,
|
||||
&prng_tdes_dev_attr_group);
|
||||
if (ret) {
|
||||
misc_deregister(&prng_tdes_dev);
|
||||
prng_tdes_deinstantiate();
|
||||
goto out;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
out:
|
||||
@@ -916,13 +899,9 @@ out:
|
||||
static void __exit prng_exit(void)
|
||||
{
|
||||
if (prng_mode == PRNG_MODE_SHA512) {
|
||||
sysfs_remove_group(&prng_sha512_dev.this_device->kobj,
|
||||
&prng_sha512_dev_attr_group);
|
||||
misc_deregister(&prng_sha512_dev);
|
||||
prng_sha512_deinstantiate();
|
||||
} else {
|
||||
sysfs_remove_group(&prng_tdes_dev.this_device->kobj,
|
||||
&prng_tdes_dev_attr_group);
|
||||
misc_deregister(&prng_tdes_dev);
|
||||
prng_tdes_deinstantiate();
|
||||
}
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
#define _CRYPTO_ARCH_S390_SHA_H
|
||||
|
||||
#include <linux/crypto.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <crypto/sha3.h>
|
||||
|
||||
/* must be big enough for the largest SHA variant */
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha1.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
#include "sha.h"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha2.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
#include "sha.h"
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/sha3.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user