forked from Minki/linux
overlayfs fixes for 5.19-rc7
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSQHSd0lITzzeNWNm3h3BK/laaZPAUCYs11GgAKCRDh3BK/laaZ PAD3APsHu08aHid5O/zPnD/90BNqAo3ruvu2WhI5wa8Dacd5SwEAgoSlH2Tx3iy9 4zWK4zZX98qAGyI+ij5aejc0TvONqAE= =4KjV -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCYtHI7gAKCRCRxhvAZXjc om98AP4mv9E1tosKU0J/Img5rcBnjMtpEinHTqiuwXsslBGK3AEAokeq3w/MDAGI ML1w4hqe1GCS5gi1UaXSnAFOqsP3LQY= =W/4m -----END PGP SIGNATURE----- Merge tag 'ovl-fixes-5.19-rc7' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs into fs.idmapped.overlay.acl Bring in Miklos' tree which contains the temporary fix for POSIX ACLs with overlayfs on top of idmapped layers. We will add a proper fix on top of it and then revert the temporary fix. Cc: Seth Forshee <sforshee@digitalocean.com> Cc: Miklos Szeredi <mszeredi@redhat.com> Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
This commit is contained in:
commit
45598fd4e2
4
.mailmap
4
.mailmap
@ -10,6 +10,8 @@
|
||||
# Please keep this list dictionary sorted.
|
||||
#
|
||||
Aaron Durbin <adurbin@google.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abel.vesa@nxp.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abelvesa@gmail.com>
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
||||
Adam Oldham <oldhamca@gmail.com>
|
||||
Adam Radford <aradford@gmail.com>
|
||||
@ -85,6 +87,7 @@ Christian Borntraeger <borntraeger@linux.ibm.com> <borntrae@de.ibm.com>
|
||||
Christian Brauner <brauner@kernel.org> <christian@brauner.io>
|
||||
Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
||||
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||
Christian Marangi <ansuelsmth@gmail.com>
|
||||
Christophe Ricard <christophe.ricard@gmail.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Colin Ian King <colin.king@intel.com> <colin.king@canonical.com>
|
||||
@ -165,6 +168,7 @@ Jan Glauber <jan.glauber@gmail.com> <jang@de.ibm.com>
|
||||
Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
|
||||
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||
|
@ -1,4 +1,4 @@
|
||||
What: /sys/bus/iio/devices/iio:deviceX/conversion_mode
|
||||
What: /sys/bus/iio/devices/iio:deviceX/in_conversion_mode
|
||||
KernelVersion: 4.2
|
||||
Contact: linux-iio@vger.kernel.org
|
||||
Description:
|
||||
|
@ -47,6 +47,5 @@ examples:
|
||||
clocks = <&clkcfg CLK_SPI0>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <54>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
...
|
||||
|
@ -110,7 +110,6 @@ examples:
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&qup_spi1_default>;
|
||||
interrupts = <GIC_SPI 602 IRQ_TYPE_LEVEL_HIGH>;
|
||||
spi-max-frequency = <50000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
@ -136,7 +136,8 @@ properties:
|
||||
Phandle of a companion.
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
@ -103,7 +103,8 @@ properties:
|
||||
Overrides the detected port count
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
@ -13,6 +13,12 @@ EDD Interfaces
|
||||
.. kernel-doc:: drivers/firmware/edd.c
|
||||
:internal:
|
||||
|
||||
Generic System Framebuffers Interface
|
||||
-------------------------------------
|
||||
|
||||
.. kernel-doc:: drivers/firmware/sysfb.c
|
||||
:export:
|
||||
|
||||
Intel Stratix10 SoC Service Layer
|
||||
---------------------------------
|
||||
Some features of the Intel Stratix10 SoC require a level of privilege
|
||||
|
@ -6,7 +6,7 @@ This document explains how GPIOs can be assigned to given devices and functions.
|
||||
|
||||
Note that it only applies to the new descriptor-based interface. For a
|
||||
description of the deprecated integer-based GPIO interface please refer to
|
||||
gpio-legacy.txt (actually, there is no real mapping possible with the old
|
||||
legacy.rst (actually, there is no real mapping possible with the old
|
||||
interface; you just fetch an integer from somewhere and request the
|
||||
corresponding GPIO).
|
||||
|
||||
|
@ -4,7 +4,7 @@ GPIO Descriptor Consumer Interface
|
||||
|
||||
This document describes the consumer interface of the GPIO framework. Note that
|
||||
it describes the new descriptor-based interface. For a description of the
|
||||
deprecated integer-based GPIO interface please refer to gpio-legacy.txt.
|
||||
deprecated integer-based GPIO interface please refer to legacy.rst.
|
||||
|
||||
|
||||
Guidelines for GPIOs consumers
|
||||
@ -78,7 +78,7 @@ whether the line is configured active high or active low (see
|
||||
|
||||
The two last flags are used for use cases where open drain is mandatory, such
|
||||
as I2C: if the line is not already configured as open drain in the mappings
|
||||
(see board.txt), then open drain will be enforced anyway and a warning will be
|
||||
(see board.rst), then open drain will be enforced anyway and a warning will be
|
||||
printed that the board configuration needs to be updated to match the use case.
|
||||
|
||||
Both functions return either a valid GPIO descriptor, or an error code checkable
|
||||
@ -270,7 +270,7 @@ driven.
|
||||
The same is applicable for open drain or open source output lines: those do not
|
||||
actively drive their output high (open drain) or low (open source), they just
|
||||
switch their output to a high impedance value. The consumer should not need to
|
||||
care. (For details read about open drain in driver.txt.)
|
||||
care. (For details read about open drain in driver.rst.)
|
||||
|
||||
With this, all the gpiod_set_(array)_value_xxx() functions interpret the
|
||||
parameter "value" as "asserted" ("1") or "de-asserted" ("0"). The physical line
|
||||
|
@ -14,12 +14,12 @@ Due to the history of GPIO interfaces in the kernel, there are two different
|
||||
ways to obtain and use GPIOs:
|
||||
|
||||
- The descriptor-based interface is the preferred way to manipulate GPIOs,
|
||||
and is described by all the files in this directory excepted gpio-legacy.txt.
|
||||
and is described by all the files in this directory excepted legacy.rst.
|
||||
- The legacy integer-based interface which is considered deprecated (but still
|
||||
usable for compatibility reasons) is documented in gpio-legacy.txt.
|
||||
usable for compatibility reasons) is documented in legacy.rst.
|
||||
|
||||
The remainder of this document applies to the new descriptor-based interface.
|
||||
gpio-legacy.txt contains the same information applied to the legacy
|
||||
legacy.rst contains the same information applied to the legacy
|
||||
integer-based interface.
|
||||
|
||||
|
||||
|
@ -19,13 +19,23 @@ The main Btrfs features include:
|
||||
* Subvolumes (separate internal filesystem roots)
|
||||
* Object level mirroring and striping
|
||||
* Checksums on data and metadata (multiple algorithms available)
|
||||
* Compression
|
||||
* Compression (multiple algorithms available)
|
||||
* Reflink, deduplication
|
||||
* Scrub (on-line checksum verification)
|
||||
* Hierarchical quota groups (subvolume and snapshot support)
|
||||
* Integrated multiple device support, with several raid algorithms
|
||||
* Offline filesystem check
|
||||
* Efficient incremental backup and FS mirroring
|
||||
* Efficient incremental backup and FS mirroring (send/receive)
|
||||
* Trim/discard
|
||||
* Online filesystem defragmentation
|
||||
* Swapfile support
|
||||
* Zoned mode
|
||||
* Read/write metadata verification
|
||||
* Online resize (shrink, grow)
|
||||
|
||||
For more information please refer to the wiki
|
||||
For more information please refer to the documentation site or wiki
|
||||
|
||||
https://btrfs.readthedocs.io
|
||||
|
||||
https://btrfs.wiki.kernel.org
|
||||
|
||||
|
@ -466,6 +466,10 @@ overlay filesystem and the value of st_ino for filesystem objects may not be
|
||||
persistent and could change even while the overlay filesystem is mounted, as
|
||||
summarized in the `Inode properties`_ table above.
|
||||
|
||||
4) "idmapped mounts"
|
||||
When the upper or lower layers are idmapped mounts overlayfs will be mounted
|
||||
without support for POSIX Access Control Lists (ACLs). This limitation will
|
||||
eventually be lifted.
|
||||
|
||||
Changes to underlying filesystems
|
||||
---------------------------------
|
||||
|
@ -129,18 +129,24 @@ yet. Bug reports are always welcome at the issue tracker below!
|
||||
* - arm64
|
||||
- Supported
|
||||
- ``LLVM=1``
|
||||
* - hexagon
|
||||
- Maintained
|
||||
- ``LLVM=1``
|
||||
* - mips
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
- ``LLVM=1``
|
||||
* - powerpc
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
* - riscv
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
- ``LLVM=1``
|
||||
* - s390
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
* - um (User Mode)
|
||||
- Maintained
|
||||
- ``LLVM=1``
|
||||
* - x86
|
||||
- Supported
|
||||
- ``LLVM=1``
|
||||
|
@ -120,7 +120,8 @@ Testing
|
||||
unpoison-pfn
|
||||
Software-unpoison page at PFN echoed into this file. This way
|
||||
a page can be reused again. This only works for Linux
|
||||
injected failures, not for real memory failures.
|
||||
injected failures, not for real memory failures. Once any hardware
|
||||
memory failure happens, this feature is disabled.
|
||||
|
||||
Note these injection interfaces are not stable and might change between
|
||||
kernel versions
|
||||
|
131
MAINTAINERS
131
MAINTAINERS
@ -427,6 +427,7 @@ ACPI VIOT DRIVER
|
||||
M: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/acpi/viot.c
|
||||
F: include/linux/acpi_viot.h
|
||||
@ -960,6 +961,7 @@ AMD IOMMU (AMD-VI)
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: drivers/iommu/amd/
|
||||
@ -2467,6 +2469,7 @@ ARM/NXP S32G ARCHITECTURE
|
||||
M: Chester Lin <clin@suse.com>
|
||||
R: Andreas Färber <afaerber@suse.de>
|
||||
R: Matthias Brugger <mbrugger@suse.com>
|
||||
R: NXP S32 Linux Team <s32@nxp.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm64/boot/dts/freescale/s32g*.dts*
|
||||
@ -3662,7 +3665,7 @@ BPF JIT for ARM
|
||||
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Odd Fixes
|
||||
F: arch/arm/net/
|
||||
|
||||
BPF JIT for ARM64
|
||||
@ -3686,14 +3689,15 @@ BPF JIT for NFP NICs
|
||||
M: Jakub Kicinski <kuba@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
S: Odd Fixes
|
||||
F: drivers/net/ethernet/netronome/nfp/bpf/
|
||||
|
||||
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
||||
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
||||
M: Michael Ellerman <mpe@ellerman.id.au>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: arch/powerpc/net/
|
||||
|
||||
BPF JIT for RISC-V (32-bit)
|
||||
@ -3719,7 +3723,7 @@ M: Heiko Carstens <hca@linux.ibm.com>
|
||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: arch/s390/net/
|
||||
X: arch/s390/net/pnet.c
|
||||
|
||||
@ -3727,14 +3731,14 @@ BPF JIT for SPARC (32-BIT AND 64-BIT)
|
||||
M: David S. Miller <davem@davemloft.net>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Odd Fixes
|
||||
F: arch/sparc/net/
|
||||
|
||||
BPF JIT for X86 32-BIT
|
||||
M: Wang YanQing <udknight@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Odd Fixes
|
||||
F: arch/x86/net/bpf_jit_comp32.c
|
||||
|
||||
BPF JIT for X86 64-BIT
|
||||
@ -3757,6 +3761,19 @@ F: include/linux/bpf_lsm.h
|
||||
F: kernel/bpf/bpf_lsm.c
|
||||
F: security/bpf/
|
||||
|
||||
BPF L7 FRAMEWORK
|
||||
M: John Fastabend <john.fastabend@gmail.com>
|
||||
M: Jakub Sitnicki <jakub@cloudflare.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/skmsg.h
|
||||
F: net/core/skmsg.c
|
||||
F: net/core/sock_map.c
|
||||
F: net/ipv4/tcp_bpf.c
|
||||
F: net/ipv4/udp_bpf.c
|
||||
F: net/unix/unix_bpf.c
|
||||
|
||||
BPFTOOL
|
||||
M: Quentin Monnet <quentin@isovalent.com>
|
||||
L: bpf@vger.kernel.org
|
||||
@ -3796,12 +3813,12 @@ N: bcmbca
|
||||
N: bcm[9]?47622
|
||||
|
||||
BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
|
||||
M: Nicolas Saenz Julienne <nsaenz@kernel.org>
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsaenz/linux-rpi.git
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: drivers/pci/controller/pcie-brcmstb.c
|
||||
F: drivers/staging/vc04_services
|
||||
@ -4959,6 +4976,7 @@ Q: http://patchwork.kernel.org/project/linux-clk/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
|
||||
F: Documentation/devicetree/bindings/clock/
|
||||
F: drivers/clk/
|
||||
F: include/dt-bindings/clock/
|
||||
F: include/linux/clk-pr*
|
||||
F: include/linux/clk/
|
||||
F: include/linux/of_clk.h
|
||||
@ -5962,6 +5980,7 @@ M: Christoph Hellwig <hch@lst.de>
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
R: Robin Murphy <robin.murphy@arm.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||
@ -5974,6 +5993,7 @@ F: kernel/dma/
|
||||
DMA MAPPING BENCHMARK
|
||||
M: Xiang Chen <chenxiang66@hisilicon.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
F: kernel/dma/map_benchmark.c
|
||||
F: tools/testing/selftests/dma/
|
||||
|
||||
@ -7558,6 +7578,7 @@ F: drivers/gpu/drm/exynos/exynos_dp*
|
||||
EXYNOS SYSMMU (IOMMU) driver
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/iommu/exynos-iommu.c
|
||||
|
||||
@ -8479,6 +8500,7 @@ F: Documentation/devicetree/bindings/gpio/
|
||||
F: Documentation/driver-api/gpio/
|
||||
F: drivers/gpio/
|
||||
F: include/asm-generic/gpio.h
|
||||
F: include/dt-bindings/gpio/
|
||||
F: include/linux/gpio.h
|
||||
F: include/linux/gpio/
|
||||
F: include/linux/of_gpio.h
|
||||
@ -9132,6 +9154,7 @@ F: drivers/media/platform/st/sti/hva
|
||||
|
||||
HWPOISON MEMORY FAILURE HANDLING
|
||||
M: Naoya Horiguchi <naoya.horiguchi@nec.com>
|
||||
R: Miaohe Lin <linmiaohe@huawei.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/hwpoison-inject.c
|
||||
@ -9977,6 +10000,7 @@ INTEL IOMMU (VT-d)
|
||||
M: David Woodhouse <dwmw2@infradead.org>
|
||||
M: Lu Baolu <baolu.lu@linux.intel.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: drivers/iommu/intel/
|
||||
@ -10356,6 +10380,7 @@ IOMMU DRIVERS
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
M: Will Deacon <will@kernel.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: Documentation/devicetree/bindings/iommu/
|
||||
@ -10832,6 +10857,7 @@ M: Marc Zyngier <maz@kernel.org>
|
||||
R: James Morse <james.morse@arm.com>
|
||||
R: Alexandru Elisei <alexandru.elisei@arm.com>
|
||||
R: Suzuki K Poulose <suzuki.poulose@arm.com>
|
||||
R: Oliver Upton <oliver.upton@linux.dev>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: kvmarm@lists.cs.columbia.edu (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
@ -10898,28 +10924,51 @@ F: tools/testing/selftests/kvm/*/s390x/
|
||||
F: tools/testing/selftests/kvm/s390x/
|
||||
|
||||
KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
|
||||
M: Sean Christopherson <seanjc@google.com>
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Sean Christopherson <seanjc@google.com>
|
||||
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
R: Wanpeng Li <wanpengli@tencent.com>
|
||||
R: Jim Mattson <jmattson@google.com>
|
||||
R: Joerg Roedel <joro@8bytes.org>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.linux-kvm.org
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/include/asm/kvm*
|
||||
F: arch/x86/include/asm/pvclock-abi.h
|
||||
F: arch/x86/include/asm/svm.h
|
||||
F: arch/x86/include/asm/vmx*.h
|
||||
F: arch/x86/include/uapi/asm/kvm*
|
||||
F: arch/x86/include/uapi/asm/svm.h
|
||||
F: arch/x86/include/uapi/asm/vmx.h
|
||||
F: arch/x86/kernel/kvm.c
|
||||
F: arch/x86/kernel/kvmclock.c
|
||||
F: arch/x86/kvm/
|
||||
F: arch/x86/kvm/*/
|
||||
|
||||
KVM PARAVIRT (KVM/paravirt)
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Wanpeng Li <wanpengli@tencent.com>
|
||||
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/kernel/kvm.c
|
||||
F: arch/x86/kernel/kvmclock.c
|
||||
F: arch/x86/include/asm/pvclock-abi.h
|
||||
F: include/linux/kvm_para.h
|
||||
F: include/uapi/linux/kvm_para.h
|
||||
F: include/uapi/asm-generic/kvm_para.h
|
||||
F: include/asm-generic/kvm_para.h
|
||||
F: arch/um/include/asm/kvm_para.h
|
||||
F: arch/x86/include/asm/kvm_para.h
|
||||
F: arch/x86/include/uapi/asm/kvm_para.h
|
||||
|
||||
KVM X86 HYPER-V (KVM/hyper-v)
|
||||
M: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
M: Sean Christopherson <seanjc@google.com>
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/kvm/hyperv.*
|
||||
F: arch/x86/kvm/kvm_onhyperv.*
|
||||
F: arch/x86/kvm/svm/hyperv.*
|
||||
F: arch/x86/kvm/svm/svm_onhyperv.*
|
||||
F: arch/x86/kvm/vmx/evmcs.*
|
||||
|
||||
KERNFS
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
M: Tejun Heo <tj@kernel.org>
|
||||
@ -11098,20 +11147,6 @@ S: Maintained
|
||||
F: include/net/l3mdev.h
|
||||
F: net/l3mdev
|
||||
|
||||
L7 BPF FRAMEWORK
|
||||
M: John Fastabend <john.fastabend@gmail.com>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Jakub Sitnicki <jakub@cloudflare.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/linux/skmsg.h
|
||||
F: net/core/skmsg.c
|
||||
F: net/core/sock_map.c
|
||||
F: net/ipv4/tcp_bpf.c
|
||||
F: net/ipv4/udp_bpf.c
|
||||
F: net/unix/unix_bpf.c
|
||||
|
||||
LANDLOCK SECURITY MODULE
|
||||
M: Mickaël Salaün <mic@digikod.net>
|
||||
L: linux-security-module@vger.kernel.org
|
||||
@ -11591,6 +11626,7 @@ F: drivers/gpu/drm/bridge/lontium-lt8912b.c
|
||||
LOONGARCH
|
||||
M: Huacai Chen <chenhuacai@kernel.org>
|
||||
R: WANG Xuerui <kernel@xen0n.name>
|
||||
L: loongarch@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
|
||||
F: arch/loongarch/
|
||||
@ -12504,6 +12540,7 @@ F: drivers/i2c/busses/i2c-mt65xx.c
|
||||
MEDIATEK IOMMU DRIVER
|
||||
M: Yong Wu <yong.wu@mediatek.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/iommu/mediatek*
|
||||
@ -12846,9 +12883,8 @@ M: Andrew Morton <akpm@linux-foundation.org>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
W: http://www.linux-mm.org
|
||||
T: quilt https://ozlabs.org/~akpm/mmotm/
|
||||
T: quilt https://ozlabs.org/~akpm/mmots/
|
||||
T: git git://github.com/hnaz/linux-mm.git
|
||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
|
||||
T: quilt git://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new
|
||||
F: include/linux/gfp.h
|
||||
F: include/linux/memory_hotplug.h
|
||||
F: include/linux/mm.h
|
||||
@ -12858,6 +12894,18 @@ F: include/linux/vmalloc.h
|
||||
F: mm/
|
||||
F: tools/testing/selftests/vm/
|
||||
|
||||
MEMORY HOT(UN)PLUG
|
||||
M: David Hildenbrand <david@redhat.com>
|
||||
M: Oscar Salvador <osalvador@suse.de>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/mm/memory-hotplug.rst
|
||||
F: Documentation/core-api/memory-hotplug.rst
|
||||
F: drivers/base/memory.c
|
||||
F: include/linux/memory_hotplug.h
|
||||
F: mm/memory_hotplug.c
|
||||
F: tools/testing/selftests/memory-hotplug/
|
||||
|
||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||
M: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
@ -13954,7 +14002,6 @@ F: net/ipv6/tcp*.c
|
||||
NETWORKING [TLS]
|
||||
M: Boris Pismenny <borisp@nvidia.com>
|
||||
M: John Fastabend <john.fastabend@gmail.com>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Jakub Kicinski <kuba@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -14263,7 +14310,7 @@ F: drivers/iio/gyro/fxas21002c_i2c.c
|
||||
F: drivers/iio/gyro/fxas21002c_spi.c
|
||||
|
||||
NXP i.MX CLOCK DRIVERS
|
||||
M: Abel Vesa <abel.vesa@nxp.com>
|
||||
M: Abel Vesa <abelvesa@kernel.org>
|
||||
L: linux-clk@vger.kernel.org
|
||||
L: linux-imx@nxp.com
|
||||
S: Maintained
|
||||
@ -14351,9 +14398,8 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
|
||||
F: sound/soc/codecs/tfa989x.c
|
||||
|
||||
NXP-NCI NFC DRIVER
|
||||
R: Charles Gorand <charles.gorand@effinnov.com>
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
||||
F: drivers/nfc/nxp-nci
|
||||
|
||||
@ -14871,6 +14917,7 @@ F: include/dt-bindings/
|
||||
|
||||
OPENCOMPUTE PTP CLOCK DRIVER
|
||||
M: Jonathan Lemon <jonathan.lemon@gmail.com>
|
||||
M: Vadim Fedorenko <vadfed@fb.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/ptp/ptp_ocp.c
|
||||
@ -16490,7 +16537,7 @@ F: Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml
|
||||
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
|
||||
QUALCOMM CRYPTO DRIVERS
|
||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -16545,6 +16592,7 @@ F: drivers/i2c/busses/i2c-qcom-cci.c
|
||||
QUALCOMM IOMMU
|
||||
M: Rob Clark <robdclark@gmail.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/iommu/arm/arm-smmu/qcom_iommu.c
|
||||
@ -16600,7 +16648,7 @@ F: include/linux/if_rmnet.h
|
||||
|
||||
QUALCOMM TSENS THERMAL DRIVER
|
||||
M: Amit Kucheria <amitk@kernel.org>
|
||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||
L: linux-pm@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -19170,6 +19218,7 @@ F: arch/x86/boot/video*
|
||||
SWIOTLB SUBSYSTEM
|
||||
M: Christoph Hellwig <hch@infradead.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||
@ -20714,6 +20763,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
|
||||
F: Documentation/devicetree/bindings/usb/
|
||||
F: Documentation/usb/
|
||||
F: drivers/usb/
|
||||
F: include/dt-bindings/usb/
|
||||
F: include/linux/usb.h
|
||||
F: include/linux/usb/
|
||||
|
||||
@ -21844,6 +21894,7 @@ M: Juergen Gross <jgross@suse.com>
|
||||
M: Stefano Stabellini <sstabellini@kernel.org>
|
||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
F: arch/x86/xen/*swiotlb*
|
||||
F: drivers/xen/*swiotlb*
|
||||
|
4
Makefile
4
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Superb Owl
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -1141,7 +1141,7 @@ KBUILD_MODULES := 1
|
||||
|
||||
autoksyms_recursive: descend modules.order
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
||||
"$(MAKE) -f $(srctree)/Makefile autoksyms_recursive"
|
||||
endif
|
||||
|
||||
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
||||
|
@ -1586,7 +1586,6 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
||||
aspeed-bmc-lenovo-hr630.dtb \
|
||||
aspeed-bmc-lenovo-hr855xg2.dtb \
|
||||
aspeed-bmc-microsoft-olympus.dtb \
|
||||
aspeed-bmc-nuvia-dc-scm.dtb \
|
||||
aspeed-bmc-opp-lanyang.dtb \
|
||||
aspeed-bmc-opp-mihawk.dtb \
|
||||
aspeed-bmc-opp-mowgli.dtb \
|
||||
@ -1599,6 +1598,7 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
||||
aspeed-bmc-opp-witherspoon.dtb \
|
||||
aspeed-bmc-opp-zaius.dtb \
|
||||
aspeed-bmc-portwell-neptune.dtb \
|
||||
aspeed-bmc-qcom-dc-scm-v1.dtb \
|
||||
aspeed-bmc-quanta-q71l.dtb \
|
||||
aspeed-bmc-quanta-s6q.dtb \
|
||||
aspeed-bmc-supermicro-x11spi.dtb \
|
||||
|
@ -6,8 +6,8 @@
|
||||
#include "aspeed-g6.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Nuvia DC-SCM BMC";
|
||||
compatible = "nuvia,dc-scm-bmc", "aspeed,ast2600";
|
||||
model = "Qualcomm DC-SCM V1 BMC";
|
||||
compatible = "qcom,dc-scm-v1-bmc", "aspeed,ast2600";
|
||||
|
||||
aliases {
|
||||
serial4 = &uart5;
|
@ -28,12 +28,12 @@
|
||||
&expgpio {
|
||||
gpio-line-names = "BT_ON",
|
||||
"WL_ON",
|
||||
"",
|
||||
"PWR_LED_OFF",
|
||||
"GLOBAL_RESET",
|
||||
"VDD_SD_IO_SEL",
|
||||
"CAM_GPIO",
|
||||
"GLOBAL_SHUTDOWN",
|
||||
"SD_PWR_ON",
|
||||
"SD_OC_N";
|
||||
"SHUTDOWN_REQUEST";
|
||||
};
|
||||
|
||||
&genet_mdio {
|
||||
|
@ -593,7 +593,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_atmel_conn>;
|
||||
reg = <0x4a>;
|
||||
reset-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; /* SODIMM 106 */
|
||||
reset-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; /* SODIMM 106 */
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
@ -762,7 +762,7 @@
|
||||
regulator-name = "vddpu";
|
||||
regulator-min-microvolt = <725000>;
|
||||
regulator-max-microvolt = <1450000>;
|
||||
regulator-enable-ramp-delay = <150>;
|
||||
regulator-enable-ramp-delay = <380>;
|
||||
anatop-reg-offset = <0x140>;
|
||||
anatop-vol-bit-shift = <9>;
|
||||
anatop-vol-bit-width = <5>;
|
||||
|
@ -120,6 +120,7 @@
|
||||
compatible = "usb-nop-xceiv";
|
||||
clocks = <&clks IMX7D_USB_HSIC_ROOT_CLK>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_hsic_phy>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
@ -1153,7 +1154,6 @@
|
||||
compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
|
||||
reg = <0x30b30000 0x200>;
|
||||
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&pgc_hsic_phy>;
|
||||
clocks = <&clks IMX7D_USB_CTRL_CLK>;
|
||||
fsl,usbphy = <&usbphynop3>;
|
||||
fsl,usbmisc = <&usbmisc3 0>;
|
||||
|
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
@ -0,0 +1,47 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
/*
|
||||
* Copyright (C) STMicroelectronics 2022 - All Rights Reserved
|
||||
* Author: Alexandre Torgue <alexandre.torgue@foss.st.com> for STMicroelectronics.
|
||||
*/
|
||||
|
||||
/ {
|
||||
firmware {
|
||||
optee: optee {
|
||||
compatible = "linaro,optee-tz";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
scmi: scmi {
|
||||
compatible = "linaro,scmi-optee";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
linaro,optee-channel-id = <0>;
|
||||
shmem = <&scmi_shm>;
|
||||
|
||||
scmi_clk: protocol@14 {
|
||||
reg = <0x14>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
scmi_reset: protocol@16 {
|
||||
reg = <0x16>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
scmi_sram: sram@2ffff000 {
|
||||
compatible = "mmio-sram";
|
||||
reg = <0x2ffff000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x2ffff000 0x1000>;
|
||||
|
||||
scmi_shm: scmi-sram@0 {
|
||||
compatible = "arm,scmi-shmem";
|
||||
reg = <0 0x80>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -115,33 +115,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
firmware {
|
||||
optee: optee {
|
||||
compatible = "linaro,optee-tz";
|
||||
method = "smc";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
scmi: scmi {
|
||||
compatible = "linaro,scmi-optee";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
linaro,optee-channel-id = <0>;
|
||||
shmem = <&scmi_shm>;
|
||||
status = "disabled";
|
||||
|
||||
scmi_clk: protocol@14 {
|
||||
reg = <0x14>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
scmi_reset: protocol@16 {
|
||||
reg = <0x16>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
@ -149,20 +122,6 @@
|
||||
interrupt-parent = <&intc>;
|
||||
ranges;
|
||||
|
||||
scmi_sram: sram@2ffff000 {
|
||||
compatible = "mmio-sram";
|
||||
reg = <0x2ffff000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x2ffff000 0x1000>;
|
||||
|
||||
scmi_shm: scmi-sram@0 {
|
||||
compatible = "arm,scmi-shmem";
|
||||
reg = <0 0x80>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
timers2: timer@40000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157a-dk1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board";
|
||||
@ -54,10 +55,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -76,11 +73,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-dk2.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board";
|
||||
@ -63,10 +64,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -85,11 +82,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-ed1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter";
|
||||
@ -59,10 +60,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -81,11 +78,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-ev1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother";
|
||||
@ -68,10 +69,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -90,11 +87,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -39,6 +39,7 @@ static int axxia_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
return -ENOENT;
|
||||
|
||||
syscon = of_iomap(syscon_np, 0);
|
||||
of_node_put(syscon_np);
|
||||
if (!syscon)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -372,6 +372,7 @@ static void __init cns3xxx_init(void)
|
||||
/* De-Asscer SATA Reset */
|
||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA));
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-sdhci");
|
||||
if (of_device_is_available(dn)) {
|
||||
@ -385,6 +386,7 @@ static void __init cns3xxx_init(void)
|
||||
cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO));
|
||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO));
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
pm_power_off = cns3xxx_power_off;
|
||||
|
||||
|
@ -149,6 +149,7 @@ static void exynos_map_pmu(void)
|
||||
np = of_find_matching_node(NULL, exynos_dt_pmu_match);
|
||||
if (np)
|
||||
pmu_base_addr = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
static void __init exynos_init_irq(void)
|
||||
|
@ -218,13 +218,13 @@ void __init spear_setup_of_timer(void)
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (!irq) {
|
||||
pr_err("%s: No irq passed for timer via DT\n", __func__);
|
||||
return;
|
||||
goto err_put_np;
|
||||
}
|
||||
|
||||
gpt_base = of_iomap(np, 0);
|
||||
if (!gpt_base) {
|
||||
pr_err("%s: of iomap failed\n", __func__);
|
||||
return;
|
||||
goto err_put_np;
|
||||
}
|
||||
|
||||
gpt_clk = clk_get_sys("gpt0", NULL);
|
||||
@ -239,6 +239,8 @@ void __init spear_setup_of_timer(void)
|
||||
goto err_prepare_enable_clk;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
spear_clockevent_init(irq);
|
||||
spear_clocksource_init();
|
||||
|
||||
@ -248,4 +250,6 @@ err_prepare_enable_clk:
|
||||
clk_put(gpt_clk);
|
||||
err_iomap:
|
||||
iounmap(gpt_base);
|
||||
err_put_np:
|
||||
of_node_put(np);
|
||||
}
|
||||
|
@ -280,8 +280,8 @@
|
||||
interrupts = <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART0_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART0_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART0_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART0_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <64>;
|
||||
status = "disabled";
|
||||
@ -293,8 +293,8 @@
|
||||
interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART1_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART1_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART1_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART1_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <256>;
|
||||
status = "disabled";
|
||||
@ -306,8 +306,8 @@
|
||||
interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART2_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART2_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART2_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART2_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <256>;
|
||||
status = "disabled";
|
||||
|
@ -79,7 +79,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
soc@0 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
@ -456,13 +456,11 @@
|
||||
clock-names = "clk_ahb", "clk_xin";
|
||||
mmc-ddr-1_8v;
|
||||
mmc-hs200-1_8v;
|
||||
mmc-hs400-1_8v;
|
||||
ti,trm-icp = <0x2>;
|
||||
ti,otap-del-sel-legacy = <0x0>;
|
||||
ti,otap-del-sel-mmc-hs = <0x0>;
|
||||
ti,otap-del-sel-ddr52 = <0x6>;
|
||||
ti,otap-del-sel-hs200 = <0x7>;
|
||||
ti,otap-del-sel-hs400 = <0x4>;
|
||||
};
|
||||
|
||||
sdhci1: mmc@fa00000 {
|
||||
|
@ -33,7 +33,7 @@
|
||||
ranges;
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
reg = <0x00 0x01800000 0x00 0x200000>, /* GICD */
|
||||
reg = <0x00 0x01800000 0x00 0x100000>, /* GICD */
|
||||
<0x00 0x01900000 0x00 0x100000>, /* GICR */
|
||||
<0x00 0x6f000000 0x00 0x2000>, /* GICC */
|
||||
<0x00 0x6f010000 0x00 0x1000>, /* GICH */
|
||||
|
@ -2112,11 +2112,11 @@ static int finalize_hyp_mode(void)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Exclude HYP BSS from kmemleak so that it doesn't get peeked
|
||||
* at, which would end badly once the section is inaccessible.
|
||||
* None of other sections should ever be introspected.
|
||||
* Exclude HYP sections from kmemleak so that they don't get peeked
|
||||
* at, which would end badly once inaccessible.
|
||||
*/
|
||||
kmemleak_free_part(__hyp_bss_start, __hyp_bss_end - __hyp_bss_start);
|
||||
kmemleak_free_part(__va(hyp_mem_base), hyp_mem_size);
|
||||
return pkvm_drop_host_privileges();
|
||||
}
|
||||
|
||||
|
@ -214,6 +214,19 @@ static pte_t get_clear_contig(struct mm_struct *mm,
|
||||
return orig_pte;
|
||||
}
|
||||
|
||||
static pte_t get_clear_contig_flush(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep,
|
||||
unsigned long pgsize,
|
||||
unsigned long ncontig)
|
||||
{
|
||||
pte_t orig_pte = get_clear_contig(mm, addr, ptep, pgsize, ncontig);
|
||||
struct vm_area_struct vma = TLB_FLUSH_VMA(mm, 0);
|
||||
|
||||
flush_tlb_range(&vma, addr, addr + (pgsize * ncontig));
|
||||
return orig_pte;
|
||||
}
|
||||
|
||||
/*
|
||||
* Changing some bits of contiguous entries requires us to follow a
|
||||
* Break-Before-Make approach, breaking the whole contiguous set
|
||||
@ -447,19 +460,20 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
int ncontig, i;
|
||||
size_t pgsize = 0;
|
||||
unsigned long pfn = pte_pfn(pte), dpfn;
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
pgprot_t hugeprot;
|
||||
pte_t orig_pte;
|
||||
|
||||
if (!pte_cont(pte))
|
||||
return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
||||
|
||||
ncontig = find_num_contig(vma->vm_mm, addr, ptep, &pgsize);
|
||||
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||
dpfn = pgsize >> PAGE_SHIFT;
|
||||
|
||||
if (!__cont_access_flags_changed(ptep, pte, ncontig))
|
||||
return 0;
|
||||
|
||||
orig_pte = get_clear_contig(vma->vm_mm, addr, ptep, pgsize, ncontig);
|
||||
orig_pte = get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||
|
||||
/* Make sure we don't lose the dirty or young state */
|
||||
if (pte_dirty(orig_pte))
|
||||
@ -470,7 +484,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
|
||||
hugeprot = pte_pgprot(pte);
|
||||
for (i = 0; i < ncontig; i++, ptep++, addr += pgsize, pfn += dpfn)
|
||||
set_pte_at(vma->vm_mm, addr, ptep, pfn_pte(pfn, hugeprot));
|
||||
set_pte_at(mm, addr, ptep, pfn_pte(pfn, hugeprot));
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -492,7 +506,7 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
||||
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||
dpfn = pgsize >> PAGE_SHIFT;
|
||||
|
||||
pte = get_clear_contig(mm, addr, ptep, pgsize, ncontig);
|
||||
pte = get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||
pte = pte_wrprotect(pte);
|
||||
|
||||
hugeprot = pte_pgprot(pte);
|
||||
@ -505,17 +519,15 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
||||
pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
size_t pgsize;
|
||||
int ncontig;
|
||||
pte_t orig_pte;
|
||||
|
||||
if (!pte_cont(READ_ONCE(*ptep)))
|
||||
return ptep_clear_flush(vma, addr, ptep);
|
||||
|
||||
ncontig = find_num_contig(vma->vm_mm, addr, ptep, &pgsize);
|
||||
orig_pte = get_clear_contig(vma->vm_mm, addr, ptep, pgsize, ncontig);
|
||||
flush_tlb_range(vma, addr, addr + pgsize * ncontig);
|
||||
return orig_pte;
|
||||
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||
return get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||
}
|
||||
|
||||
static int __init hugetlbpage_init(void)
|
||||
|
@ -12,10 +12,9 @@ static inline unsigned long exception_era(struct pt_regs *regs)
|
||||
return regs->csr_era;
|
||||
}
|
||||
|
||||
static inline int compute_return_era(struct pt_regs *regs)
|
||||
static inline void compute_return_era(struct pt_regs *regs)
|
||||
{
|
||||
regs->csr_era += 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_BRANCH_H */
|
||||
|
@ -426,6 +426,11 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
|
||||
/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
|
||||
@ -497,11 +502,6 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
|
||||
return pmd;
|
||||
}
|
||||
|
||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
||||
}
|
||||
|
||||
static inline struct page *pmd_page(pmd_t pmd)
|
||||
{
|
||||
if (pmd_trans_huge(pmd))
|
||||
|
@ -263,7 +263,7 @@ void cpu_probe(void)
|
||||
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0);
|
||||
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) >> 3) & 0x3;
|
||||
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) & CPUCFG2_FPVERS) >> 3;
|
||||
|
||||
c->fpu_csr0 = FPU_CSR_RN;
|
||||
c->fpu_mask = FPU_CSR_RSVD;
|
||||
|
@ -14,8 +14,6 @@
|
||||
|
||||
__REF
|
||||
|
||||
SYM_ENTRY(_stext, SYM_L_GLOBAL, SYM_A_NONE)
|
||||
|
||||
SYM_CODE_START(kernel_entry) # kernel entry point
|
||||
|
||||
/* Config direct window and set PG */
|
||||
|
@ -475,8 +475,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)
|
||||
|
||||
die_if_kernel("Reserved instruction in kernel code", regs);
|
||||
|
||||
if (unlikely(compute_return_era(regs) < 0))
|
||||
goto out;
|
||||
compute_return_era(regs);
|
||||
|
||||
if (unlikely(get_user(opcode, era) < 0)) {
|
||||
status = SIGSEGV;
|
||||
|
@ -37,6 +37,7 @@ SECTIONS
|
||||
HEAD_TEXT_SECTION
|
||||
|
||||
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
||||
_stext = .;
|
||||
.text : {
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
|
@ -281,15 +281,16 @@ void setup_tlb_handler(int cpu)
|
||||
if (pcpu_handlers[cpu])
|
||||
return;
|
||||
|
||||
page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, get_order(vec_sz));
|
||||
page = alloc_pages_node(cpu_to_node(cpu), GFP_ATOMIC, get_order(vec_sz));
|
||||
if (!page)
|
||||
return;
|
||||
|
||||
addr = page_address(page);
|
||||
pcpu_handlers[cpu] = virt_to_phys(addr);
|
||||
pcpu_handlers[cpu] = (unsigned long)addr;
|
||||
memcpy((void *)addr, (void *)eentry, vec_sz);
|
||||
local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_TLBRENTRY);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_EENTRY);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_MERRENTRY);
|
||||
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
|
||||
}
|
||||
#endif
|
||||
|
@ -111,8 +111,9 @@
|
||||
|
||||
clocks = <&cgu X1000_CLK_RTCLK>,
|
||||
<&cgu X1000_CLK_EXCLK>,
|
||||
<&cgu X1000_CLK_PCLK>;
|
||||
clock-names = "rtc", "ext", "pclk";
|
||||
<&cgu X1000_CLK_PCLK>,
|
||||
<&cgu X1000_CLK_TCU>;
|
||||
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
@ -104,8 +104,9 @@
|
||||
|
||||
clocks = <&cgu X1830_CLK_RTCLK>,
|
||||
<&cgu X1830_CLK_EXCLK>,
|
||||
<&cgu X1830_CLK_PCLK>;
|
||||
clock-names = "rtc", "ext", "pclk";
|
||||
<&cgu X1830_CLK_PCLK>,
|
||||
<&cgu X1830_CLK_TCU>;
|
||||
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
@ -44,6 +44,7 @@ static __init unsigned int ranchu_measure_hpt_freq(void)
|
||||
__func__);
|
||||
|
||||
rtc_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!rtc_base)
|
||||
panic("%s(): Failed to ioremap Goldfish RTC base!", __func__);
|
||||
|
||||
|
@ -208,6 +208,12 @@ void __init ltq_soc_init(void)
|
||||
of_address_to_resource(np_sysgpe, 0, &res_sys[2]))
|
||||
panic("Failed to get core resources");
|
||||
|
||||
of_node_put(np_status);
|
||||
of_node_put(np_ebu);
|
||||
of_node_put(np_sys1);
|
||||
of_node_put(np_syseth);
|
||||
of_node_put(np_sysgpe);
|
||||
|
||||
if ((request_mem_region(res_status.start, resource_size(&res_status),
|
||||
res_status.name) < 0) ||
|
||||
(request_mem_region(res_ebu.start, resource_size(&res_ebu),
|
||||
|
@ -408,6 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
||||
if (!ltq_eiu_membase)
|
||||
panic("Failed to remap eiu memory");
|
||||
}
|
||||
of_node_put(eiu_node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -441,6 +441,10 @@ void __init ltq_soc_init(void)
|
||||
of_address_to_resource(np_ebu, 0, &res_ebu))
|
||||
panic("Failed to get core resources");
|
||||
|
||||
of_node_put(np_pmu);
|
||||
of_node_put(np_cgu);
|
||||
of_node_put(np_ebu);
|
||||
|
||||
if (!request_mem_region(res_pmu.start, resource_size(&res_pmu),
|
||||
res_pmu.name) ||
|
||||
!request_mem_region(res_cgu.start, resource_size(&res_cgu),
|
||||
|
@ -214,6 +214,8 @@ static void update_gic_frequency_dt(void)
|
||||
|
||||
if (of_update_property(node, &gic_frequency_prop) < 0)
|
||||
pr_err("error updating gic frequency property\n");
|
||||
|
||||
of_node_put(node);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -98,13 +98,18 @@ static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup)
|
||||
np = of_find_compatible_node(NULL, NULL, lookup->compatible);
|
||||
if (np) {
|
||||
lookup->name = (char *)np->name;
|
||||
if (lookup->phys_addr)
|
||||
if (lookup->phys_addr) {
|
||||
of_node_put(np);
|
||||
continue;
|
||||
}
|
||||
if (!of_address_to_resource(np, 0, &res))
|
||||
lookup->phys_addr = res.start;
|
||||
of_node_put(np);
|
||||
}
|
||||
}
|
||||
|
||||
of_node_put(root);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,9 @@ static unsigned int pic32_xlate_core_timer_irq(void)
|
||||
goto default_map;
|
||||
|
||||
irq = irq_of_parse_and_map(node, 0);
|
||||
|
||||
of_node_put(node);
|
||||
|
||||
if (!irq)
|
||||
goto default_map;
|
||||
|
||||
|
@ -40,6 +40,8 @@ __iomem void *plat_of_remap_node(const char *node)
|
||||
if (of_address_to_resource(np, 0, &res))
|
||||
panic("Failed to get resource for %s", node);
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
if (!request_mem_region(res.start,
|
||||
resource_size(&res),
|
||||
res.name))
|
||||
|
@ -640,8 +640,6 @@ static int icu_get_irq(unsigned int irq)
|
||||
|
||||
printk(KERN_ERR "spurious ICU interrupt: %04x,%04x\n", pend1, pend2);
|
||||
|
||||
atomic_inc(&irq_err_count);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ config PARISC
|
||||
select ARCH_WANT_FRAME_POINTERS
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||
select ARCH_HAS_STRICT_MODULE_RWX
|
||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||
select ARCH_HAS_PTE_SPECIAL
|
||||
select ARCH_NO_SG_CHAIN
|
||||
|
@ -12,7 +12,7 @@ static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
|
||||
pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_FB_STI)
|
||||
#if defined(CONFIG_FB_STI)
|
||||
int fb_is_primary_device(struct fb_info *info);
|
||||
#else
|
||||
static inline int fb_is_primary_device(struct fb_info *info)
|
||||
|
@ -224,8 +224,13 @@ int main(void)
|
||||
BLANK();
|
||||
DEFINE(ASM_SIGFRAME_SIZE, PARISC_RT_SIGFRAME_SIZE);
|
||||
DEFINE(SIGFRAME_CONTEXT_REGS, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
||||
#ifdef CONFIG_64BIT
|
||||
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE32);
|
||||
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct compat_rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE32);
|
||||
#else
|
||||
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE);
|
||||
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
||||
#endif
|
||||
BLANK();
|
||||
DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base));
|
||||
DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride));
|
||||
|
@ -722,7 +722,10 @@ void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned lon
|
||||
return;
|
||||
|
||||
if (parisc_requires_coherency()) {
|
||||
flush_user_cache_page(vma, vmaddr);
|
||||
if (vma->vm_flags & VM_SHARED)
|
||||
flush_data_cache();
|
||||
else
|
||||
flush_user_cache_page(vma, vmaddr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -146,7 +146,7 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop)
|
||||
" depw %%r0,31,2,%4\n"
|
||||
"1: ldw 0(%%sr1,%4),%0\n"
|
||||
"2: ldw 4(%%sr1,%4),%3\n"
|
||||
" subi 32,%4,%2\n"
|
||||
" subi 32,%2,%2\n"
|
||||
" mtctl %2,11\n"
|
||||
" vshd %0,%3,%0\n"
|
||||
"3: \n"
|
||||
|
@ -102,7 +102,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[])
|
||||
* that happen. Want to keep this overhead low, but still provide
|
||||
* some information to the customer. All exits from this routine
|
||||
* need to restore Fpu_register[0]
|
||||
*/
|
||||
*/
|
||||
|
||||
bflags=(Fpu_register[0] & 0xf8000000);
|
||||
Fpu_register[0] &= 0x07ffffff;
|
||||
|
@ -358,6 +358,10 @@ config ARCH_SUSPEND_NONZERO_CPU
|
||||
def_bool y
|
||||
depends on PPC_POWERNV || PPC_PSERIES
|
||||
|
||||
config ARCH_HAS_ADD_PAGES
|
||||
def_bool y
|
||||
depends on ARCH_ENABLE_MEMORY_HOTPLUG
|
||||
|
||||
config PPC_DCR_NATIVE
|
||||
bool
|
||||
|
||||
|
9
arch/powerpc/include/asm/bpf_perf_event.h
Normal file
9
arch/powerpc/include/asm/bpf_perf_event.h
Normal file
@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_POWERPC_BPF_PERF_EVENT_H
|
||||
#define _ASM_POWERPC_BPF_PERF_EVENT_H
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
typedef struct user_pt_regs bpf_user_pt_regs_t;
|
||||
|
||||
#endif /* _ASM_POWERPC_BPF_PERF_EVENT_H */
|
@ -1,9 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__
|
||||
#define _UAPI__ASM_BPF_PERF_EVENT_H__
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
typedef struct user_pt_regs bpf_user_pt_regs_t;
|
||||
|
||||
#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
|
@ -1855,7 +1855,7 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
||||
tm_reclaim_current(0);
|
||||
#endif
|
||||
|
||||
memset(regs->gpr, 0, sizeof(regs->gpr));
|
||||
memset(®s->gpr[1], 0, sizeof(regs->gpr) - sizeof(regs->gpr[0]));
|
||||
regs->ctr = 0;
|
||||
regs->link = 0;
|
||||
regs->xer = 0;
|
||||
|
@ -2302,7 +2302,7 @@ static void __init prom_init_stdout(void)
|
||||
|
||||
static int __init prom_find_machine_type(void)
|
||||
{
|
||||
char compat[256];
|
||||
static char compat[256] __prombss;
|
||||
int len, i = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
phandle rtas;
|
||||
|
@ -13,7 +13,7 @@
|
||||
# If you really need to reference something from prom_init.o add
|
||||
# it to the list below:
|
||||
|
||||
grep "^CONFIG_KASAN=y$" .config >/dev/null
|
||||
grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
MEM_FUNCS="__memcpy __memset"
|
||||
|
@ -1071,7 +1071,7 @@ static struct rtas_filter rtas_filters[] __ro_after_init = {
|
||||
{ "get-time-of-day", -1, -1, -1, -1, -1 },
|
||||
{ "ibm,get-vpd", -1, 0, -1, 1, 2 },
|
||||
{ "ibm,lpar-perftools", -1, 2, 3, -1, -1 },
|
||||
{ "ibm,platform-dump", -1, 4, 5, -1, -1 },
|
||||
{ "ibm,platform-dump", -1, 4, 5, -1, -1 }, /* Special cased */
|
||||
{ "ibm,read-slot-reset-state", -1, -1, -1, -1, -1 },
|
||||
{ "ibm,scan-log-dump", -1, 0, 1, -1, -1 },
|
||||
{ "ibm,set-dynamic-indicator", -1, 2, -1, -1, -1 },
|
||||
@ -1120,6 +1120,15 @@ static bool block_rtas_call(int token, int nargs,
|
||||
size = 1;
|
||||
|
||||
end = base + size - 1;
|
||||
|
||||
/*
|
||||
* Special case for ibm,platform-dump - NULL buffer
|
||||
* address is used to indicate end of dump processing
|
||||
*/
|
||||
if (!strcmp(f->name, "ibm,platform-dump") &&
|
||||
base == 0)
|
||||
return false;
|
||||
|
||||
if (!in_rmo_buf(base, end))
|
||||
goto err;
|
||||
}
|
||||
|
@ -935,12 +935,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Print various info about the machine that has been gathered so far. */
|
||||
print_system_info();
|
||||
|
||||
/* Reserve large chunks of memory for use by CMA for KVM. */
|
||||
kvm_cma_reserve();
|
||||
|
||||
/* Reserve large chunks of memory for us by CMA for hugetlb */
|
||||
gigantic_hugetlb_cma_reserve();
|
||||
|
||||
klp_init_thread_info(&init_task);
|
||||
|
||||
setup_initial_init_mm(_stext, _etext, _edata, _end);
|
||||
@ -955,6 +949,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
initmem_init();
|
||||
|
||||
/*
|
||||
* Reserve large chunks of memory for use by CMA for KVM and hugetlb. These must
|
||||
* be called after initmem_init(), so that pageblock_order is initialised.
|
||||
*/
|
||||
kvm_cma_reserve();
|
||||
gigantic_hugetlb_cma_reserve();
|
||||
|
||||
early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
|
||||
|
||||
if (ppc_md.setup_arch)
|
||||
|
@ -105,6 +105,37 @@ void __ref arch_remove_linear_mapping(u64 start, u64 size)
|
||||
vm_unmap_aliases();
|
||||
}
|
||||
|
||||
/*
|
||||
* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need
|
||||
* updating.
|
||||
*/
|
||||
static void update_end_of_memory_vars(u64 start, u64 size)
|
||||
{
|
||||
unsigned long end_pfn = PFN_UP(start + size);
|
||||
|
||||
if (end_pfn > max_pfn) {
|
||||
max_pfn = end_pfn;
|
||||
max_low_pfn = end_pfn;
|
||||
high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
int __ref add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
|
||||
struct mhp_params *params)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __add_pages(nid, start_pfn, nr_pages, params);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* update max_pfn, max_low_pfn and high_memory */
|
||||
update_end_of_memory_vars(start_pfn << PAGE_SHIFT,
|
||||
nr_pages << PAGE_SHIFT);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int __ref arch_add_memory(int nid, u64 start, u64 size,
|
||||
struct mhp_params *params)
|
||||
{
|
||||
@ -115,7 +146,7 @@ int __ref arch_add_memory(int nid, u64 start, u64 size,
|
||||
rc = arch_create_linear_mapping(nid, start, size, params);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = __add_pages(nid, start_pfn, nr_pages, params);
|
||||
rc = add_pages(nid, start_pfn, nr_pages, params);
|
||||
if (rc)
|
||||
arch_remove_linear_mapping(start, size);
|
||||
return rc;
|
||||
|
@ -96,8 +96,8 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
|
||||
pgdp = pgd_offset_k(ea);
|
||||
p4dp = p4d_offset(pgdp, ea);
|
||||
if (p4d_none(*p4dp)) {
|
||||
pmdp = early_alloc_pgtable(PMD_TABLE_SIZE);
|
||||
p4d_populate(&init_mm, p4dp, pmdp);
|
||||
pudp = early_alloc_pgtable(PUD_TABLE_SIZE);
|
||||
p4d_populate(&init_mm, p4dp, pudp);
|
||||
}
|
||||
pudp = pud_offset(p4dp, ea);
|
||||
if (pud_none(*pudp)) {
|
||||
@ -106,7 +106,7 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
|
||||
}
|
||||
pmdp = pmd_offset(pudp, ea);
|
||||
if (!pmd_present(*pmdp)) {
|
||||
ptep = early_alloc_pgtable(PAGE_SIZE);
|
||||
ptep = early_alloc_pgtable(PTE_TABLE_SIZE);
|
||||
pmd_populate_kernel(&init_mm, pmdp, ptep);
|
||||
}
|
||||
ptep = pte_offset_kernel(pmdp, ea);
|
||||
|
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _MICROWATT_H
|
||||
#define _MICROWATT_H
|
||||
|
||||
void microwatt_rng_init(void);
|
||||
|
||||
#endif /* _MICROWATT_H */
|
@ -11,6 +11,7 @@
|
||||
#include <asm/archrandom.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/machdep.h>
|
||||
#include "microwatt.h"
|
||||
|
||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||
|
||||
@ -29,7 +30,7 @@ static int microwatt_get_random_darn(unsigned long *v)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
void __init microwatt_rng_init(void)
|
||||
{
|
||||
unsigned long val;
|
||||
int i;
|
||||
@ -37,12 +38,7 @@ static __init int rng_init(void)
|
||||
for (i = 0; i < 10; i++) {
|
||||
if (microwatt_get_random_darn(&val)) {
|
||||
ppc_md.get_random_seed = microwatt_get_random_darn;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
machine_subsys_initcall(, rng_init);
|
||||
|
@ -16,6 +16,8 @@
|
||||
#include <asm/xics.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "microwatt.h"
|
||||
|
||||
static void __init microwatt_init_IRQ(void)
|
||||
{
|
||||
xics_init();
|
||||
@ -32,10 +34,16 @@ static int __init microwatt_populate(void)
|
||||
}
|
||||
machine_arch_initcall(microwatt, microwatt_populate);
|
||||
|
||||
static void __init microwatt_setup_arch(void)
|
||||
{
|
||||
microwatt_rng_init();
|
||||
}
|
||||
|
||||
define_machine(microwatt) {
|
||||
.name = "microwatt",
|
||||
.probe = microwatt_probe,
|
||||
.init_IRQ = microwatt_init_IRQ,
|
||||
.setup_arch = microwatt_setup_arch,
|
||||
.progress = udbg_progress,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
};
|
||||
|
@ -42,4 +42,6 @@ ssize_t memcons_copy(struct memcons *mc, char *to, loff_t pos, size_t count);
|
||||
u32 __init memcons_get_size(struct memcons *mc);
|
||||
struct memcons *__init memcons_init(struct device_node *node, const char *mc_prop_name);
|
||||
|
||||
void pnv_rng_init(void);
|
||||
|
||||
#endif /* _POWERNV_H */
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/smp.h>
|
||||
#include "powernv.h"
|
||||
|
||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||
|
||||
@ -28,7 +29,6 @@ struct powernv_rng {
|
||||
|
||||
static DEFINE_PER_CPU(struct powernv_rng *, powernv_rng);
|
||||
|
||||
|
||||
int powernv_hwrng_present(void)
|
||||
{
|
||||
struct powernv_rng *rng;
|
||||
@ -98,9 +98,6 @@ static int __init initialise_darn(void)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -163,32 +160,55 @@ static __init int rng_create(struct device_node *dn)
|
||||
|
||||
rng_init_per_cpu(rng, dn);
|
||||
|
||||
pr_info_once("Registering arch random hook.\n");
|
||||
|
||||
ppc_md.get_random_seed = powernv_get_random_long;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
static int __init pnv_get_random_long_early(unsigned long *v)
|
||||
{
|
||||
struct device_node *dn;
|
||||
int rc;
|
||||
|
||||
if (!slab_is_available())
|
||||
return 0;
|
||||
|
||||
if (cmpxchg(&ppc_md.get_random_seed, pnv_get_random_long_early,
|
||||
NULL) != pnv_get_random_long_early)
|
||||
return 0;
|
||||
|
||||
for_each_compatible_node(dn, NULL, "ibm,power-rng") {
|
||||
rc = rng_create(dn);
|
||||
if (rc) {
|
||||
pr_err("Failed creating rng for %pOF (%d).\n",
|
||||
dn, rc);
|
||||
if (rng_create(dn))
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Create devices for hwrng driver */
|
||||
of_platform_device_create(dn, NULL, NULL);
|
||||
}
|
||||
|
||||
initialise_darn();
|
||||
if (!ppc_md.get_random_seed)
|
||||
return 0;
|
||||
return ppc_md.get_random_seed(v);
|
||||
}
|
||||
|
||||
void __init pnv_rng_init(void)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
||||
/* Prefer darn over the rest. */
|
||||
if (!initialise_darn())
|
||||
return;
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "ibm,power-rng");
|
||||
if (dn)
|
||||
ppc_md.get_random_seed = pnv_get_random_long_early;
|
||||
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
static int __init pnv_rng_late_init(void)
|
||||
{
|
||||
unsigned long v;
|
||||
/* In case it wasn't called during init for some other reason. */
|
||||
if (ppc_md.get_random_seed == pnv_get_random_long_early)
|
||||
pnv_get_random_long_early(&v);
|
||||
return 0;
|
||||
}
|
||||
machine_subsys_initcall(powernv, rng_init);
|
||||
machine_subsys_initcall(powernv, pnv_rng_late_init);
|
||||
|
@ -203,6 +203,8 @@ static void __init pnv_setup_arch(void)
|
||||
pnv_check_guarded_cores();
|
||||
|
||||
/* XXX PMCS */
|
||||
|
||||
pnv_rng_init();
|
||||
}
|
||||
|
||||
static void __init pnv_init(void)
|
||||
|
@ -122,4 +122,6 @@ void pseries_lpar_read_hblkrm_characteristics(void);
|
||||
static inline void pseries_lpar_read_hblkrm_characteristics(void) { }
|
||||
#endif
|
||||
|
||||
void pseries_rng_init(void);
|
||||
|
||||
#endif /* _PSERIES_PSERIES_H */
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <asm/archrandom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include "pseries.h"
|
||||
|
||||
|
||||
static int pseries_get_random_long(unsigned long *v)
|
||||
@ -24,19 +25,13 @@ static int pseries_get_random_long(unsigned long *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
void __init pseries_rng_init(void)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "ibm,random");
|
||||
if (!dn)
|
||||
return -ENODEV;
|
||||
|
||||
pr_info("Registering arch random hook.\n");
|
||||
|
||||
return;
|
||||
ppc_md.get_random_seed = pseries_get_random_long;
|
||||
|
||||
of_node_put(dn);
|
||||
return 0;
|
||||
}
|
||||
machine_subsys_initcall(pseries, rng_init);
|
||||
|
@ -839,6 +839,7 @@ static void __init pSeries_setup_arch(void)
|
||||
}
|
||||
|
||||
ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
|
||||
pseries_rng_init();
|
||||
}
|
||||
|
||||
static void pseries_panic(char *str)
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/delay.h>
|
||||
@ -57,7 +58,7 @@ static int __init xive_irq_bitmap_add(int base, int count)
|
||||
spin_lock_init(&xibm->lock);
|
||||
xibm->base = base;
|
||||
xibm->count = count;
|
||||
xibm->bitmap = kzalloc(xibm->count, GFP_KERNEL);
|
||||
xibm->bitmap = bitmap_zalloc(xibm->count, GFP_KERNEL);
|
||||
if (!xibm->bitmap) {
|
||||
kfree(xibm);
|
||||
return -ENOMEM;
|
||||
@ -75,7 +76,7 @@ static void xive_irq_bitmap_remove_all(void)
|
||||
|
||||
list_for_each_entry_safe(xibm, tmp, &xive_irq_bitmaps, list) {
|
||||
list_del(&xibm->list);
|
||||
kfree(xibm->bitmap);
|
||||
bitmap_free(xibm->bitmap);
|
||||
kfree(xibm);
|
||||
}
|
||||
}
|
||||
|
@ -75,20 +75,20 @@ asm volatile(ALTERNATIVE( \
|
||||
"nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop", \
|
||||
"li t3, %2\n\t" \
|
||||
"slli t3, t3, %4\n\t" \
|
||||
"li t3, %1\n\t" \
|
||||
"slli t3, t3, %3\n\t" \
|
||||
"and t3, %0, t3\n\t" \
|
||||
"bne t3, zero, 2f\n\t" \
|
||||
"li t3, %3\n\t" \
|
||||
"slli t3, t3, %4\n\t" \
|
||||
"li t3, %2\n\t" \
|
||||
"slli t3, t3, %3\n\t" \
|
||||
"or %0, %0, t3\n\t" \
|
||||
"2:", THEAD_VENDOR_ID, \
|
||||
ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
|
||||
: "+r"(_val) \
|
||||
: "0"(_val), \
|
||||
"I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
: "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
"I"(_PAGE_PMA_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
"I"(ALT_THEAD_PBMT_SHIFT))
|
||||
"I"(ALT_THEAD_PBMT_SHIFT) \
|
||||
: "t3")
|
||||
#else
|
||||
#define ALT_THEAD_PMA(_val)
|
||||
#endif
|
||||
|
@ -484,7 +484,6 @@ config KEXEC
|
||||
config KEXEC_FILE
|
||||
bool "kexec file based system call"
|
||||
select KEXEC_CORE
|
||||
select BUILD_BIN2C
|
||||
depends on CRYPTO
|
||||
depends on CRYPTO_SHA256
|
||||
depends on CRYPTO_SHA256_S390
|
||||
|
@ -4,232 +4,15 @@
|
||||
*
|
||||
* Copyright IBM Corp. 2017, 2020
|
||||
* Author(s): Harald Freudenberger
|
||||
*
|
||||
* The s390_arch_random_generate() function may be called from random.c
|
||||
* in interrupt context. So this implementation does the best to be very
|
||||
* fast. There is a buffer of random data which is asynchronously checked
|
||||
* and filled by a workqueue thread.
|
||||
* If there are enough bytes in the buffer the s390_arch_random_generate()
|
||||
* just delivers these bytes. Otherwise false is returned until the
|
||||
* worker thread refills the buffer.
|
||||
* The worker fills the rng buffer by pulling fresh entropy from the
|
||||
* high quality (but slow) true hardware random generator. This entropy
|
||||
* is then spread over the buffer with an pseudo random generator PRNG.
|
||||
* As the arch_get_random_seed_long() fetches 8 bytes and the calling
|
||||
* function add_interrupt_randomness() counts this as 1 bit entropy the
|
||||
* distribution needs to make sure there is in fact 1 bit entropy contained
|
||||
* in 8 bytes of the buffer. The current values pull 32 byte entropy
|
||||
* and scatter this into a 2048 byte buffer. So 8 byte in the buffer
|
||||
* will contain 1 bit of entropy.
|
||||
* The worker thread is rescheduled based on the charge level of the
|
||||
* buffer but at least with 500 ms delay to avoid too much CPU consumption.
|
||||
* So the max. amount of rng data delivered via arch_get_random_seed is
|
||||
* limited to 4k bytes per second.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/random.h>
|
||||
#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);
|
||||
|
||||
atomic64_t s390_arch_random_counter = ATOMIC64_INIT(0);
|
||||
EXPORT_SYMBOL(s390_arch_random_counter);
|
||||
|
||||
#define ARCH_REFILL_TICKS (HZ/2)
|
||||
#define ARCH_PRNG_SEED_SIZE 32
|
||||
#define ARCH_RNG_BUF_SIZE 2048
|
||||
|
||||
static DEFINE_SPINLOCK(arch_rng_lock);
|
||||
static u8 *arch_rng_buf;
|
||||
static unsigned int arch_rng_buf_idx;
|
||||
|
||||
static void arch_rng_refill_buffer(struct work_struct *);
|
||||
static DECLARE_DELAYED_WORK(arch_rng_work, arch_rng_refill_buffer);
|
||||
|
||||
bool s390_arch_random_generate(u8 *buf, unsigned int nbytes)
|
||||
{
|
||||
/* max hunk is ARCH_RNG_BUF_SIZE */
|
||||
if (nbytes > ARCH_RNG_BUF_SIZE)
|
||||
return false;
|
||||
|
||||
/* lock rng buffer */
|
||||
if (!spin_trylock(&arch_rng_lock))
|
||||
return false;
|
||||
|
||||
/* try to resolve the requested amount of bytes from the buffer */
|
||||
arch_rng_buf_idx -= nbytes;
|
||||
if (arch_rng_buf_idx < ARCH_RNG_BUF_SIZE) {
|
||||
memcpy(buf, arch_rng_buf + arch_rng_buf_idx, nbytes);
|
||||
atomic64_add(nbytes, &s390_arch_random_counter);
|
||||
spin_unlock(&arch_rng_lock);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* not enough bytes in rng buffer, refill is done asynchronously */
|
||||
spin_unlock(&arch_rng_lock);
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(s390_arch_random_generate);
|
||||
|
||||
static void arch_rng_refill_buffer(struct work_struct *unused)
|
||||
{
|
||||
unsigned int delay = ARCH_REFILL_TICKS;
|
||||
|
||||
spin_lock(&arch_rng_lock);
|
||||
if (arch_rng_buf_idx > ARCH_RNG_BUF_SIZE) {
|
||||
/* buffer is exhausted and needs refill */
|
||||
u8 seed[ARCH_PRNG_SEED_SIZE];
|
||||
u8 prng_wa[240];
|
||||
/* fetch ARCH_PRNG_SEED_SIZE bytes of entropy */
|
||||
cpacf_trng(NULL, 0, seed, sizeof(seed));
|
||||
/* blow this entropy up to ARCH_RNG_BUF_SIZE with PRNG */
|
||||
memset(prng_wa, 0, sizeof(prng_wa));
|
||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
||||
&prng_wa, NULL, 0, seed, sizeof(seed));
|
||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
||||
&prng_wa, arch_rng_buf, ARCH_RNG_BUF_SIZE, NULL, 0);
|
||||
arch_rng_buf_idx = ARCH_RNG_BUF_SIZE;
|
||||
}
|
||||
delay += (ARCH_REFILL_TICKS * arch_rng_buf_idx) / ARCH_RNG_BUF_SIZE;
|
||||
spin_unlock(&arch_rng_lock);
|
||||
|
||||
/* kick next check */
|
||||
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 ? */
|
||||
if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG) &&
|
||||
cpacf_query_func(CPACF_PRNO, CPACF_PRNO_SHA512_DRNG_GEN)) {
|
||||
|
||||
/* alloc arch random working buffer */
|
||||
arch_rng_buf = kmalloc(ARCH_RNG_BUF_SIZE, GFP_KERNEL);
|
||||
if (!arch_rng_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
/* kick worker queue job to fill the random buffer */
|
||||
queue_delayed_work(system_long_wq,
|
||||
&arch_rng_work, ARCH_REFILL_TICKS);
|
||||
|
||||
/* enable arch random to the outside world */
|
||||
static_branch_enable(&s390_arch_random_available);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(s390_arch_random_init);
|
||||
|
@ -15,17 +15,13 @@
|
||||
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/cpacf.h>
|
||||
|
||||
DECLARE_STATIC_KEY_FALSE(s390_arch_random_available);
|
||||
extern atomic64_t s390_arch_random_counter;
|
||||
|
||||
bool s390_arch_get_random_long(unsigned long *v);
|
||||
bool s390_arch_random_generate(u8 *buf, unsigned int nbytes);
|
||||
|
||||
static inline bool __must_check arch_get_random_long(unsigned long *v)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available))
|
||||
return s390_arch_get_random_long(v);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -37,7 +33,9 @@ static inline bool __must_check arch_get_random_int(unsigned int *v)
|
||||
static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available)) {
|
||||
return s390_arch_random_generate((u8 *)v, sizeof(*v));
|
||||
cpacf_trng(NULL, 0, (u8 *)v, sizeof(*v));
|
||||
atomic64_add(sizeof(*v), &s390_arch_random_counter);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -45,7 +43,9 @@ static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
|
||||
static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
|
||||
{
|
||||
if (static_branch_likely(&s390_arch_random_available)) {
|
||||
return s390_arch_random_generate((u8 *)v, sizeof(*v));
|
||||
cpacf_trng(NULL, 0, (u8 *)v, sizeof(*v));
|
||||
atomic64_add(sizeof(*v), &s390_arch_random_counter);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -133,9 +133,9 @@ struct slibe {
|
||||
* @sb_count: number of storage blocks
|
||||
* @sba: storage block element addresses
|
||||
* @dcount: size of storage block elements
|
||||
* @user0: user defineable value
|
||||
* @res4: reserved paramater
|
||||
* @user1: user defineable value
|
||||
* @user0: user definable value
|
||||
* @res4: reserved parameter
|
||||
* @user1: user definable value
|
||||
*/
|
||||
struct qaob {
|
||||
u64 res0[6];
|
||||
|
@ -219,6 +219,11 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
||||
unsigned long src;
|
||||
int rc;
|
||||
|
||||
if (!(iter_is_iovec(iter) || iov_iter_is_kvec(iter)))
|
||||
return -EINVAL;
|
||||
/* Multi-segment iterators are not supported */
|
||||
if (iter->nr_segs > 1)
|
||||
return -EINVAL;
|
||||
if (!csize)
|
||||
return 0;
|
||||
src = pfn_to_phys(pfn) + offset;
|
||||
@ -228,7 +233,10 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
||||
rc = copy_oldmem_user(iter->iov->iov_base, src, csize);
|
||||
else
|
||||
rc = copy_oldmem_kernel(iter->kvec->iov_base, src, csize);
|
||||
return rc;
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
iov_iter_advance(iter, csize);
|
||||
return csize;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -516,6 +516,26 @@ static int __hw_perf_event_init(struct perf_event *event, unsigned int type)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Events CPU_CYLCES and INSTRUCTIONS can be submitted with two different
|
||||
* attribute::type values:
|
||||
* - PERF_TYPE_HARDWARE:
|
||||
* - pmu->type:
|
||||
* Handle both type of invocations identical. They address the same hardware.
|
||||
* The result is different when event modifiers exclude_kernel and/or
|
||||
* exclude_user are also set.
|
||||
*/
|
||||
static int cpumf_pmu_event_type(struct perf_event *event)
|
||||
{
|
||||
u64 ev = event->attr.config;
|
||||
|
||||
if (cpumf_generic_events_basic[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||
cpumf_generic_events_basic[PERF_COUNT_HW_INSTRUCTIONS] == ev ||
|
||||
cpumf_generic_events_user[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||
cpumf_generic_events_user[PERF_COUNT_HW_INSTRUCTIONS] == ev)
|
||||
return PERF_TYPE_HARDWARE;
|
||||
return PERF_TYPE_RAW;
|
||||
}
|
||||
|
||||
static int cpumf_pmu_event_init(struct perf_event *event)
|
||||
{
|
||||
unsigned int type = event->attr.type;
|
||||
@ -525,7 +545,7 @@ static int cpumf_pmu_event_init(struct perf_event *event)
|
||||
err = __hw_perf_event_init(event, type);
|
||||
else if (event->pmu->type == type)
|
||||
/* Registered as unknown PMU */
|
||||
err = __hw_perf_event_init(event, PERF_TYPE_RAW);
|
||||
err = __hw_perf_event_init(event, cpumf_pmu_event_type(event));
|
||||
else
|
||||
return -ENOENT;
|
||||
|
||||
|
@ -193,8 +193,9 @@ static int paicrypt_event_init(struct perf_event *event)
|
||||
/* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */
|
||||
if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type)
|
||||
return -ENOENT;
|
||||
/* PAI crypto event must be valid */
|
||||
if (a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
||||
/* PAI crypto event must be in valid range */
|
||||
if (a->config < PAI_CRYPTO_BASE ||
|
||||
a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
||||
return -EINVAL;
|
||||
/* Allow only CPU wide operation, no process context for now. */
|
||||
if (event->hw.target || event->cpu == -1)
|
||||
@ -208,6 +209,12 @@ static int paicrypt_event_init(struct perf_event *event)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Event initialization sets last_tag to 0. When later on the events
|
||||
* are deleted and re-added, do not reset the event count value to zero.
|
||||
* Events are added, deleted and re-added when 2 or more events
|
||||
* are active at the same time.
|
||||
*/
|
||||
event->hw.last_tag = 0;
|
||||
cpump->event = event;
|
||||
event->destroy = paicrypt_event_destroy;
|
||||
|
||||
@ -242,9 +249,12 @@ static void paicrypt_start(struct perf_event *event, int flags)
|
||||
{
|
||||
u64 sum;
|
||||
|
||||
sum = paicrypt_getall(event); /* Get current value */
|
||||
local64_set(&event->hw.prev_count, sum);
|
||||
local64_set(&event->count, 0);
|
||||
if (!event->hw.last_tag) {
|
||||
event->hw.last_tag = 1;
|
||||
sum = paicrypt_getall(event); /* Get current value */
|
||||
local64_set(&event->count, 0);
|
||||
local64_set(&event->hw.prev_count, sum);
|
||||
}
|
||||
}
|
||||
|
||||
static int paicrypt_add(struct perf_event *event, int flags)
|
||||
|
@ -875,6 +875,11 @@ static void __init setup_randomness(void)
|
||||
if (stsi(vmms, 3, 2, 2) == 0 && vmms->count)
|
||||
add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
|
||||
memblock_free(vmms, PAGE_SIZE);
|
||||
|
||||
#ifdef CONFIG_ARCH_RANDOM
|
||||
if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG))
|
||||
static_branch_enable(&s390_arch_random_available);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -48,7 +48,6 @@ OBJCOPYFLAGS_purgatory.ro += --remove-section='.note.*'
|
||||
$(obj)/purgatory.ro: $(obj)/purgatory $(obj)/purgatory.chk FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/kexec-purgatory.o: $(obj)/kexec-purgatory.S $(obj)/purgatory.ro FORCE
|
||||
$(call if_changed_rule,as_o_S)
|
||||
$(obj)/kexec-purgatory.o: $(obj)/purgatory.ro
|
||||
|
||||
obj-$(CONFIG_ARCH_HAS_KEXEC_PURGATORY) += kexec-purgatory.o
|
||||
obj-y += kexec-purgatory.o
|
||||
|
@ -323,7 +323,7 @@ static inline u32 efi64_convert_status(efi_status_t status)
|
||||
#define __efi64_argmap_get_memory_space_descriptor(phys, desc) \
|
||||
(__efi64_split(phys), (desc))
|
||||
|
||||
#define __efi64_argmap_set_memory_space_descriptor(phys, size, flags) \
|
||||
#define __efi64_argmap_set_memory_space_attributes(phys, size, flags) \
|
||||
(__efi64_split(phys), __efi64_split(size), __efi64_split(flags))
|
||||
|
||||
/*
|
||||
|
@ -844,7 +844,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
||||
|
||||
/* If source buffer is not aligned then use an intermediate buffer */
|
||||
if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
|
||||
src_tpage = alloc_page(GFP_KERNEL);
|
||||
src_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||
if (!src_tpage)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -865,7 +865,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
||||
if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
|
||||
int dst_offset;
|
||||
|
||||
dst_tpage = alloc_page(GFP_KERNEL);
|
||||
dst_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||
if (!dst_tpage) {
|
||||
ret = -ENOMEM;
|
||||
goto e_free;
|
||||
@ -1665,19 +1665,24 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
||||
{
|
||||
struct kvm_sev_info *dst = &to_kvm_svm(dst_kvm)->sev_info;
|
||||
struct kvm_sev_info *src = &to_kvm_svm(src_kvm)->sev_info;
|
||||
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
||||
struct vcpu_svm *dst_svm, *src_svm;
|
||||
struct kvm_sev_info *mirror;
|
||||
unsigned long i;
|
||||
|
||||
dst->active = true;
|
||||
dst->asid = src->asid;
|
||||
dst->handle = src->handle;
|
||||
dst->pages_locked = src->pages_locked;
|
||||
dst->enc_context_owner = src->enc_context_owner;
|
||||
dst->es_active = src->es_active;
|
||||
|
||||
src->asid = 0;
|
||||
src->active = false;
|
||||
src->handle = 0;
|
||||
src->pages_locked = 0;
|
||||
src->enc_context_owner = NULL;
|
||||
src->es_active = false;
|
||||
|
||||
list_cut_before(&dst->regions_list, &src->regions_list, &src->regions_list);
|
||||
|
||||
@ -1704,27 +1709,22 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
||||
list_del(&src->mirror_entry);
|
||||
list_add_tail(&dst->mirror_entry, &owner_sev_info->mirror_vms);
|
||||
}
|
||||
}
|
||||
|
||||
static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
||||
{
|
||||
unsigned long i;
|
||||
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
||||
struct vcpu_svm *dst_svm, *src_svm;
|
||||
|
||||
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
||||
return -EINVAL;
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
if (!src_vcpu->arch.guest_state_protected)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
src_svm = to_svm(src_vcpu);
|
||||
dst_vcpu = kvm_get_vcpu(dst, i);
|
||||
kvm_for_each_vcpu(i, dst_vcpu, dst_kvm) {
|
||||
dst_svm = to_svm(dst_vcpu);
|
||||
|
||||
sev_init_vmcb(dst_svm);
|
||||
|
||||
if (!dst->es_active)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Note, the source is not required to have the same number of
|
||||
* vCPUs as the destination when migrating a vanilla SEV VM.
|
||||
*/
|
||||
src_vcpu = kvm_get_vcpu(dst_kvm, i);
|
||||
src_svm = to_svm(src_vcpu);
|
||||
|
||||
/*
|
||||
* Transfer VMSA and GHCB state to the destination. Nullify and
|
||||
* clear source fields as appropriate, the state now belongs to
|
||||
@ -1740,8 +1740,23 @@ static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
||||
src_svm->vmcb->control.vmsa_pa = INVALID_PAGE;
|
||||
src_vcpu->arch.guest_state_protected = false;
|
||||
}
|
||||
to_kvm_svm(src)->sev_info.es_active = false;
|
||||
to_kvm_svm(dst)->sev_info.es_active = true;
|
||||
}
|
||||
|
||||
static int sev_check_source_vcpus(struct kvm *dst, struct kvm *src)
|
||||
{
|
||||
struct kvm_vcpu *src_vcpu;
|
||||
unsigned long i;
|
||||
|
||||
if (!sev_es_guest(src))
|
||||
return 0;
|
||||
|
||||
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
||||
return -EINVAL;
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
if (!src_vcpu->arch.guest_state_protected)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1789,11 +1804,9 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd)
|
||||
if (ret)
|
||||
goto out_dst_vcpu;
|
||||
|
||||
if (sev_es_guest(source_kvm)) {
|
||||
ret = sev_es_migrate_from(kvm, source_kvm);
|
||||
if (ret)
|
||||
goto out_source_vcpu;
|
||||
}
|
||||
ret = sev_check_source_vcpus(kvm, source_kvm);
|
||||
if (ret)
|
||||
goto out_source_vcpu;
|
||||
|
||||
sev_migrate_from(kvm, source_kvm);
|
||||
kvm_vm_dead(source_kvm);
|
||||
@ -2914,7 +2927,7 @@ int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in)
|
||||
count, in);
|
||||
}
|
||||
|
||||
void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
static void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||
|
||||
@ -2967,6 +2980,15 @@ void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
}
|
||||
}
|
||||
|
||||
void sev_init_vmcb(struct vcpu_svm *svm)
|
||||
{
|
||||
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
||||
clr_exception_intercept(svm, UD_VECTOR);
|
||||
|
||||
if (sev_es_guest(svm->vcpu.kvm))
|
||||
sev_es_init_vmcb(svm);
|
||||
}
|
||||
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm)
|
||||
{
|
||||
/*
|
||||
|
@ -1212,15 +1212,8 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
|
||||
svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK;
|
||||
}
|
||||
|
||||
if (sev_guest(vcpu->kvm)) {
|
||||
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
||||
clr_exception_intercept(svm, UD_VECTOR);
|
||||
|
||||
if (sev_es_guest(vcpu->kvm)) {
|
||||
/* Perform SEV-ES specific VMCB updates */
|
||||
sev_es_init_vmcb(svm);
|
||||
}
|
||||
}
|
||||
if (sev_guest(vcpu->kvm))
|
||||
sev_init_vmcb(svm);
|
||||
|
||||
svm_hv_init_vmcb(vmcb);
|
||||
init_vmcb_after_set_cpuid(vcpu);
|
||||
|
@ -649,10 +649,10 @@ void __init sev_set_cpu_caps(void);
|
||||
void __init sev_hardware_setup(void);
|
||||
void sev_hardware_unsetup(void);
|
||||
int sev_cpu_init(struct svm_cpu_data *sd);
|
||||
void sev_init_vmcb(struct vcpu_svm *svm);
|
||||
void sev_free_vcpu(struct kvm_vcpu *vcpu);
|
||||
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
|
||||
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
|
||||
void sev_es_init_vmcb(struct vcpu_svm *svm);
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm);
|
||||
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
|
||||
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa);
|
||||
|
@ -1420,8 +1420,9 @@ st: if (is_imm8(insn->off))
|
||||
case BPF_JMP | BPF_CALL:
|
||||
func = (u8 *) __bpf_call_base + imm32;
|
||||
if (tail_call_reachable) {
|
||||
/* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */
|
||||
EMIT3_off32(0x48, 0x8B, 0x85,
|
||||
-(bpf_prog->aux->stack_depth + 8));
|
||||
-round_up(bpf_prog->aux->stack_depth, 8) - 8);
|
||||
if (!imm32 || emit_call(&prog, func, image + addrs[i - 1] + 7))
|
||||
return -EINVAL;
|
||||
} else {
|
||||
|
@ -2173,7 +2173,7 @@ ENDPROC(ret_from_kernel_thread)
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
|
||||
.bss
|
||||
.section .bss, "aw"
|
||||
.align 4
|
||||
.Lsaved_regs:
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
@ -154,6 +154,7 @@ static void __init calibrate_ccount(void)
|
||||
cpu = of_find_compatible_node(NULL, NULL, "cdns,xtensa-cpu");
|
||||
if (cpu) {
|
||||
clk = of_clk_get(cpu, 0);
|
||||
of_node_put(cpu);
|
||||
if (!IS_ERR(clk)) {
|
||||
ccount_freq = clk_get_rate(clk);
|
||||
return;
|
||||
|
@ -133,6 +133,7 @@ static int __init machine_setup(void)
|
||||
|
||||
if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc")))
|
||||
update_local_mac(eth);
|
||||
of_node_put(eth);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(machine_setup);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user