mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge 3.13-rc5 into usb-next
This resolves the merge issue with drivers/usb/host/ohci-at91.c Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
240
Documentation/module-signing.txt
Normal file
240
Documentation/module-signing.txt
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
==============================
|
||||||
|
KERNEL MODULE SIGNING FACILITY
|
||||||
|
==============================
|
||||||
|
|
||||||
|
CONTENTS
|
||||||
|
|
||||||
|
- Overview.
|
||||||
|
- Configuring module signing.
|
||||||
|
- Generating signing keys.
|
||||||
|
- Public keys in the kernel.
|
||||||
|
- Manually signing modules.
|
||||||
|
- Signed modules and stripping.
|
||||||
|
- Loading signed modules.
|
||||||
|
- Non-valid signatures and unsigned modules.
|
||||||
|
- Administering/protecting the private key.
|
||||||
|
|
||||||
|
|
||||||
|
========
|
||||||
|
OVERVIEW
|
||||||
|
========
|
||||||
|
|
||||||
|
The kernel module signing facility cryptographically signs modules during
|
||||||
|
installation and then checks the signature upon loading the module. This
|
||||||
|
allows increased kernel security by disallowing the loading of unsigned modules
|
||||||
|
or modules signed with an invalid key. Module signing increases security by
|
||||||
|
making it harder to load a malicious module into the kernel. The module
|
||||||
|
signature checking is done by the kernel so that it is not necessary to have
|
||||||
|
trusted userspace bits.
|
||||||
|
|
||||||
|
This facility uses X.509 ITU-T standard certificates to encode the public keys
|
||||||
|
involved. The signatures are not themselves encoded in any industrial standard
|
||||||
|
type. The facility currently only supports the RSA public key encryption
|
||||||
|
standard (though it is pluggable and permits others to be used). The possible
|
||||||
|
hash algorithms that can be used are SHA-1, SHA-224, SHA-256, SHA-384, and
|
||||||
|
SHA-512 (the algorithm is selected by data in the signature).
|
||||||
|
|
||||||
|
|
||||||
|
==========================
|
||||||
|
CONFIGURING MODULE SIGNING
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The module signing facility is enabled by going to the "Enable Loadable Module
|
||||||
|
Support" section of the kernel configuration and turning on
|
||||||
|
|
||||||
|
CONFIG_MODULE_SIG "Module signature verification"
|
||||||
|
|
||||||
|
This has a number of options available:
|
||||||
|
|
||||||
|
(1) "Require modules to be validly signed" (CONFIG_MODULE_SIG_FORCE)
|
||||||
|
|
||||||
|
This specifies how the kernel should deal with a module that has a
|
||||||
|
signature for which the key is not known or a module that is unsigned.
|
||||||
|
|
||||||
|
If this is off (ie. "permissive"), then modules for which the key is not
|
||||||
|
available and modules that are unsigned are permitted, but the kernel will
|
||||||
|
be marked as being tainted.
|
||||||
|
|
||||||
|
If this is on (ie. "restrictive"), only modules that have a valid
|
||||||
|
signature that can be verified by a public key in the kernel's possession
|
||||||
|
will be loaded. All other modules will generate an error.
|
||||||
|
|
||||||
|
Irrespective of the setting here, if the module has a signature block that
|
||||||
|
cannot be parsed, it will be rejected out of hand.
|
||||||
|
|
||||||
|
|
||||||
|
(2) "Automatically sign all modules" (CONFIG_MODULE_SIG_ALL)
|
||||||
|
|
||||||
|
If this is on then modules will be automatically signed during the
|
||||||
|
modules_install phase of a build. If this is off, then the modules must
|
||||||
|
be signed manually using:
|
||||||
|
|
||||||
|
scripts/sign-file
|
||||||
|
|
||||||
|
|
||||||
|
(3) "Which hash algorithm should modules be signed with?"
|
||||||
|
|
||||||
|
This presents a choice of which hash algorithm the installation phase will
|
||||||
|
sign the modules with:
|
||||||
|
|
||||||
|
CONFIG_SIG_SHA1 "Sign modules with SHA-1"
|
||||||
|
CONFIG_SIG_SHA224 "Sign modules with SHA-224"
|
||||||
|
CONFIG_SIG_SHA256 "Sign modules with SHA-256"
|
||||||
|
CONFIG_SIG_SHA384 "Sign modules with SHA-384"
|
||||||
|
CONFIG_SIG_SHA512 "Sign modules with SHA-512"
|
||||||
|
|
||||||
|
The algorithm selected here will also be built into the kernel (rather
|
||||||
|
than being a module) so that modules signed with that algorithm can have
|
||||||
|
their signatures checked without causing a dependency loop.
|
||||||
|
|
||||||
|
|
||||||
|
=======================
|
||||||
|
GENERATING SIGNING KEYS
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Cryptographic keypairs are required to generate and check signatures. A
|
||||||
|
private key is used to generate a signature and the corresponding public key is
|
||||||
|
used to check it. The private key is only needed during the build, after which
|
||||||
|
it can be deleted or stored securely. The public key gets built into the
|
||||||
|
kernel so that it can be used to check the signatures as the modules are
|
||||||
|
loaded.
|
||||||
|
|
||||||
|
Under normal conditions, the kernel build will automatically generate a new
|
||||||
|
keypair using openssl if one does not exist in the files:
|
||||||
|
|
||||||
|
signing_key.priv
|
||||||
|
signing_key.x509
|
||||||
|
|
||||||
|
during the building of vmlinux (the public part of the key needs to be built
|
||||||
|
into vmlinux) using parameters in the:
|
||||||
|
|
||||||
|
x509.genkey
|
||||||
|
|
||||||
|
file (which is also generated if it does not already exist).
|
||||||
|
|
||||||
|
It is strongly recommended that you provide your own x509.genkey file.
|
||||||
|
|
||||||
|
Most notably, in the x509.genkey file, the req_distinguished_name section
|
||||||
|
should be altered from the default:
|
||||||
|
|
||||||
|
[ req_distinguished_name ]
|
||||||
|
O = Magrathea
|
||||||
|
CN = Glacier signing key
|
||||||
|
emailAddress = slartibartfast@magrathea.h2g2
|
||||||
|
|
||||||
|
The generated RSA key size can also be set with:
|
||||||
|
|
||||||
|
[ req ]
|
||||||
|
default_bits = 4096
|
||||||
|
|
||||||
|
|
||||||
|
It is also possible to manually generate the key private/public files using the
|
||||||
|
x509.genkey key generation configuration file in the root node of the Linux
|
||||||
|
kernel sources tree and the openssl command. The following is an example to
|
||||||
|
generate the public/private key files:
|
||||||
|
|
||||||
|
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
|
||||||
|
-config x509.genkey -outform DER -out signing_key.x509 \
|
||||||
|
-keyout signing_key.priv
|
||||||
|
|
||||||
|
|
||||||
|
=========================
|
||||||
|
PUBLIC KEYS IN THE KERNEL
|
||||||
|
=========================
|
||||||
|
|
||||||
|
The kernel contains a ring of public keys that can be viewed by root. They're
|
||||||
|
in a keyring called ".system_keyring" that can be seen by:
|
||||||
|
|
||||||
|
[root@deneb ~]# cat /proc/keys
|
||||||
|
...
|
||||||
|
223c7853 I------ 1 perm 1f030000 0 0 keyring .system_keyring: 1
|
||||||
|
302d2d52 I------ 1 perm 1f010000 0 0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
|
||||||
|
...
|
||||||
|
|
||||||
|
Beyond the public key generated specifically for module signing, any file
|
||||||
|
placed in the kernel source root directory or the kernel build root directory
|
||||||
|
whose name is suffixed with ".x509" will be assumed to be an X.509 public key
|
||||||
|
and will be added to the keyring.
|
||||||
|
|
||||||
|
Further, the architecture code may take public keys from a hardware store and
|
||||||
|
add those in also (e.g. from the UEFI key database).
|
||||||
|
|
||||||
|
Finally, it is possible to add additional public keys by doing:
|
||||||
|
|
||||||
|
keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]
|
||||||
|
|
||||||
|
e.g.:
|
||||||
|
|
||||||
|
keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509
|
||||||
|
|
||||||
|
Note, however, that the kernel will only permit keys to be added to
|
||||||
|
.system_keyring _if_ the new key's X.509 wrapper is validly signed by a key
|
||||||
|
that is already resident in the .system_keyring at the time the key was added.
|
||||||
|
|
||||||
|
|
||||||
|
=========================
|
||||||
|
MANUALLY SIGNING MODULES
|
||||||
|
=========================
|
||||||
|
|
||||||
|
To manually sign a module, use the scripts/sign-file tool available in
|
||||||
|
the Linux kernel source tree. The script requires 4 arguments:
|
||||||
|
|
||||||
|
1. The hash algorithm (e.g., sha256)
|
||||||
|
2. The private key filename
|
||||||
|
3. The public key filename
|
||||||
|
4. The kernel module to be signed
|
||||||
|
|
||||||
|
The following is an example to sign a kernel module:
|
||||||
|
|
||||||
|
scripts/sign-file sha512 kernel-signkey.priv \
|
||||||
|
kernel-signkey.x509 module.ko
|
||||||
|
|
||||||
|
The hash algorithm used does not have to match the one configured, but if it
|
||||||
|
doesn't, you should make sure that hash algorithm is either built into the
|
||||||
|
kernel or can be loaded without requiring itself.
|
||||||
|
|
||||||
|
|
||||||
|
============================
|
||||||
|
SIGNED MODULES AND STRIPPING
|
||||||
|
============================
|
||||||
|
|
||||||
|
A signed module has a digital signature simply appended at the end. The string
|
||||||
|
"~Module signature appended~." at the end of the module's file confirms that a
|
||||||
|
signature is present but it does not confirm that the signature is valid!
|
||||||
|
|
||||||
|
Signed modules are BRITTLE as the signature is outside of the defined ELF
|
||||||
|
container. Thus they MAY NOT be stripped once the signature is computed and
|
||||||
|
attached. Note the entire module is the signed payload, including any and all
|
||||||
|
debug information present at the time of signing.
|
||||||
|
|
||||||
|
|
||||||
|
======================
|
||||||
|
LOADING SIGNED MODULES
|
||||||
|
======================
|
||||||
|
|
||||||
|
Modules are loaded with insmod, modprobe, init_module() or finit_module(),
|
||||||
|
exactly as for unsigned modules as no processing is done in userspace. The
|
||||||
|
signature checking is all done within the kernel.
|
||||||
|
|
||||||
|
|
||||||
|
=========================================
|
||||||
|
NON-VALID SIGNATURES AND UNSIGNED MODULES
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
If CONFIG_MODULE_SIG_FORCE is enabled or enforcemodulesig=1 is supplied on
|
||||||
|
the kernel command line, the kernel will only load validly signed modules
|
||||||
|
for which it has a public key. Otherwise, it will also load modules that are
|
||||||
|
unsigned. Any module for which the kernel has a key, but which proves to have
|
||||||
|
a signature mismatch will not be permitted to load.
|
||||||
|
|
||||||
|
Any module that has an unparseable signature will be rejected.
|
||||||
|
|
||||||
|
|
||||||
|
=========================================
|
||||||
|
ADMINISTERING/PROTECTING THE PRIVATE KEY
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
Since the private key is used to sign modules, viruses and malware could use
|
||||||
|
the private key to sign modules and compromise the operating system. The
|
||||||
|
private key must be either destroyed or moved to a secure location and not kept
|
||||||
|
in the root node of the kernel source tree.
|
||||||
@@ -16,8 +16,12 @@ ip_default_ttl - INTEGER
|
|||||||
Default: 64 (as recommended by RFC1700)
|
Default: 64 (as recommended by RFC1700)
|
||||||
|
|
||||||
ip_no_pmtu_disc - BOOLEAN
|
ip_no_pmtu_disc - BOOLEAN
|
||||||
Disable Path MTU Discovery.
|
Disable Path MTU Discovery. If enabled and a
|
||||||
default FALSE
|
fragmentation-required ICMP is received, the PMTU to this
|
||||||
|
destination will be set to min_pmtu (see below). You will need
|
||||||
|
to raise min_pmtu to the smallest interface MTU on your system
|
||||||
|
manually if you want to avoid locally generated fragments.
|
||||||
|
Default: FALSE
|
||||||
|
|
||||||
min_pmtu - INTEGER
|
min_pmtu - INTEGER
|
||||||
default 552 - minimum discovered Path MTU
|
default 552 - minimum discovered Path MTU
|
||||||
|
|||||||
27
MAINTAINERS
27
MAINTAINERS
@@ -1008,6 +1008,8 @@ M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
|||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-keystone/
|
F: arch/arm/mach-keystone/
|
||||||
|
F: drivers/clk/keystone/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone.git
|
||||||
|
|
||||||
ARM/LOGICPD PXA270 MACHINE SUPPORT
|
ARM/LOGICPD PXA270 MACHINE SUPPORT
|
||||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||||
@@ -3761,9 +3763,11 @@ F: include/uapi/linux/gigaset_dev.h
|
|||||||
|
|
||||||
GPIO SUBSYSTEM
|
GPIO SUBSYSTEM
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
S: Maintained
|
M: Alexandre Courbot <gnurou@gmail.com>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
F: Documentation/gpio.txt
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/gpio/
|
||||||
F: drivers/gpio/
|
F: drivers/gpio/
|
||||||
F: include/linux/gpio*
|
F: include/linux/gpio*
|
||||||
F: include/asm-generic/gpio.h
|
F: include/asm-generic/gpio.h
|
||||||
@@ -3831,6 +3835,12 @@ T: git git://linuxtv.org/media_tree.git
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/media/usb/gspca/
|
F: drivers/media/usb/gspca/
|
||||||
|
|
||||||
|
GUID PARTITION TABLE (GPT)
|
||||||
|
M: Davidlohr Bueso <davidlohr@hp.com>
|
||||||
|
L: linux-efi@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: block/partitions/efi.*
|
||||||
|
|
||||||
STK1160 USB VIDEO CAPTURE DRIVER
|
STK1160 USB VIDEO CAPTURE DRIVER
|
||||||
M: Ezequiel Garcia <elezegarcia@gmail.com>
|
M: Ezequiel Garcia <elezegarcia@gmail.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
@@ -5911,12 +5921,21 @@ M: Steffen Klassert <steffen.klassert@secunet.com>
|
|||||||
M: Herbert Xu <herbert@gondor.apana.org.au>
|
M: Herbert Xu <herbert@gondor.apana.org.au>
|
||||||
M: "David S. Miller" <davem@davemloft.net>
|
M: "David S. Miller" <davem@davemloft.net>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/xfrm/
|
F: net/xfrm/
|
||||||
F: net/key/
|
F: net/key/
|
||||||
F: net/ipv4/xfrm*
|
F: net/ipv4/xfrm*
|
||||||
|
F: net/ipv4/esp4.c
|
||||||
|
F: net/ipv4/ah4.c
|
||||||
|
F: net/ipv4/ipcomp.c
|
||||||
|
F: net/ipv4/ip_vti.c
|
||||||
F: net/ipv6/xfrm*
|
F: net/ipv6/xfrm*
|
||||||
|
F: net/ipv6/esp6.c
|
||||||
|
F: net/ipv6/ah6.c
|
||||||
|
F: net/ipv6/ipcomp6.c
|
||||||
|
F: net/ipv6/ip6_vti.c
|
||||||
F: include/uapi/linux/xfrm.h
|
F: include/uapi/linux/xfrm.h
|
||||||
F: include/net/xfrm.h
|
F: include/net/xfrm.h
|
||||||
|
|
||||||
@@ -9571,7 +9590,7 @@ F: drivers/xen/*swiotlb*
|
|||||||
|
|
||||||
XFS FILESYSTEM
|
XFS FILESYSTEM
|
||||||
P: Silicon Graphics Inc
|
P: Silicon Graphics Inc
|
||||||
M: Dave Chinner <dchinner@fromorbit.com>
|
M: Dave Chinner <david@fromorbit.com>
|
||||||
M: Ben Myers <bpm@sgi.com>
|
M: Ben Myers <bpm@sgi.com>
|
||||||
M: xfs@oss.sgi.com
|
M: xfs@oss.sgi.com
|
||||||
L: xfs@oss.sgi.com
|
L: xfs@oss.sgi.com
|
||||||
|
|||||||
24
Makefile
24
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 13
|
PATCHLEVEL = 13
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc4
|
EXTRAVERSION = -rc5
|
||||||
NAME = One Giant Leap for Frogkind
|
NAME = One Giant Leap for Frogkind
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@@ -732,19 +732,15 @@ export mod_strip_cmd
|
|||||||
# Select initial ramdisk compression format, default is gzip(1).
|
# Select initial ramdisk compression format, default is gzip(1).
|
||||||
# This shall be used by the dracut(8) tool while creating an initramfs image.
|
# This shall be used by the dracut(8) tool while creating an initramfs image.
|
||||||
#
|
#
|
||||||
INITRD_COMPRESS=gzip
|
INITRD_COMPRESS-y := gzip
|
||||||
ifeq ($(CONFIG_RD_BZIP2), y)
|
INITRD_COMPRESS-$(CONFIG_RD_BZIP2) := bzip2
|
||||||
INITRD_COMPRESS=bzip2
|
INITRD_COMPRESS-$(CONFIG_RD_LZMA) := lzma
|
||||||
else ifeq ($(CONFIG_RD_LZMA), y)
|
INITRD_COMPRESS-$(CONFIG_RD_XZ) := xz
|
||||||
INITRD_COMPRESS=lzma
|
INITRD_COMPRESS-$(CONFIG_RD_LZO) := lzo
|
||||||
else ifeq ($(CONFIG_RD_XZ), y)
|
INITRD_COMPRESS-$(CONFIG_RD_LZ4) := lz4
|
||||||
INITRD_COMPRESS=xz
|
# do not export INITRD_COMPRESS, since we didn't actually
|
||||||
else ifeq ($(CONFIG_RD_LZO), y)
|
# choose a sane default compression above.
|
||||||
INITRD_COMPRESS=lzo
|
# export INITRD_COMPRESS := $(INITRD_COMPRESS-y)
|
||||||
else ifeq ($(CONFIG_RD_LZ4), y)
|
|
||||||
INITRD_COMPRESS=lz4
|
|
||||||
endif
|
|
||||||
export INITRD_COMPRESS
|
|
||||||
|
|
||||||
ifdef CONFIG_MODULE_SIG_ALL
|
ifdef CONFIG_MODULE_SIG_ALL
|
||||||
MODSECKEY = ./signing_key.priv
|
MODSECKEY = ./signing_key.priv
|
||||||
|
|||||||
@@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
/******** no-legacy-syscalls-ABI *******/
|
/******** no-legacy-syscalls-ABI *******/
|
||||||
|
|
||||||
#ifndef _UAPI_ASM_ARC_UNISTD_H
|
/*
|
||||||
|
* Non-typical guard macro to enable inclusion twice in ARCH sys.c
|
||||||
|
* That is how the Generic syscall wrapper generator works
|
||||||
|
*/
|
||||||
|
#if !defined(_UAPI_ASM_ARC_UNISTD_H) || defined(__SYSCALL)
|
||||||
#define _UAPI_ASM_ARC_UNISTD_H
|
#define _UAPI_ASM_ARC_UNISTD_H
|
||||||
|
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
@@ -36,4 +40,6 @@ __SYSCALL(__NR_arc_gettls, sys_arc_gettls)
|
|||||||
#define __NR_sysfs (__NR_arch_specific_syscall + 3)
|
#define __NR_sysfs (__NR_arch_specific_syscall + 3)
|
||||||
__SYSCALL(__NR_sysfs, sys_sysfs)
|
__SYSCALL(__NR_sysfs, sys_sysfs)
|
||||||
|
|
||||||
|
#undef __SYSCALL
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -87,9 +87,9 @@
|
|||||||
interrupts = <1 9 0xf04>;
|
interrupts = <1 9 0xf04>;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio@ffc40000 {
|
gpio0: gpio@e6050000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc40000 0 0x2c>;
|
reg = <0 0xe6050000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 4 0x4>;
|
interrupts = <0 4 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
@@ -99,9 +99,9 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio1: gpio@ffc41000 {
|
gpio1: gpio@e6051000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc41000 0 0x2c>;
|
reg = <0 0xe6051000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 5 0x4>;
|
interrupts = <0 5 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
@@ -111,9 +111,9 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio2: gpio@ffc42000 {
|
gpio2: gpio@e6052000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc42000 0 0x2c>;
|
reg = <0 0xe6052000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 6 0x4>;
|
interrupts = <0 6 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
@@ -123,9 +123,9 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio3: gpio@ffc43000 {
|
gpio3: gpio@e6053000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc43000 0 0x2c>;
|
reg = <0 0xe6053000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 7 0x4>;
|
interrupts = <0 7 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
@@ -135,9 +135,9 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio4: gpio@ffc44000 {
|
gpio4: gpio@e6054000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc44000 0 0x2c>;
|
reg = <0 0xe6054000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 8 0x4>;
|
interrupts = <0 8 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
@@ -147,9 +147,9 @@
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio5: gpio@ffc45000 {
|
gpio5: gpio@e6055000 {
|
||||||
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
|
||||||
reg = <0 0xffc45000 0 0x2c>;
|
reg = <0 0xe6055000 0 0x50>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
interrupts = <0 9 0x4>;
|
interrupts = <0 9 0x4>;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|||||||
@@ -101,13 +101,51 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initconst = {
|
|||||||
{ "dss_hdmi", "omapdss_hdmi", -1 },
|
{ "dss_hdmi", "omapdss_hdmi", -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
|
||||||
|
{
|
||||||
|
u32 enable_mask, enable_shift;
|
||||||
|
u32 pipd_mask, pipd_shift;
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
if (dsi_id == 0) {
|
||||||
|
enable_mask = OMAP4_DSI1_LANEENABLE_MASK;
|
||||||
|
enable_shift = OMAP4_DSI1_LANEENABLE_SHIFT;
|
||||||
|
pipd_mask = OMAP4_DSI1_PIPD_MASK;
|
||||||
|
pipd_shift = OMAP4_DSI1_PIPD_SHIFT;
|
||||||
|
} else if (dsi_id == 1) {
|
||||||
|
enable_mask = OMAP4_DSI2_LANEENABLE_MASK;
|
||||||
|
enable_shift = OMAP4_DSI2_LANEENABLE_SHIFT;
|
||||||
|
pipd_mask = OMAP4_DSI2_PIPD_MASK;
|
||||||
|
pipd_shift = OMAP4_DSI2_PIPD_SHIFT;
|
||||||
|
} else {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
reg = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY);
|
||||||
|
|
||||||
|
reg &= ~enable_mask;
|
||||||
|
reg &= ~pipd_mask;
|
||||||
|
|
||||||
|
reg |= (lanes << enable_shift) & enable_mask;
|
||||||
|
reg |= (lanes << pipd_shift) & pipd_mask;
|
||||||
|
|
||||||
|
omap4_ctrl_pad_writel(reg, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)
|
static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)
|
||||||
{
|
{
|
||||||
|
if (cpu_is_omap44xx())
|
||||||
|
return omap4_dsi_mux_pads(dsi_id, lane_mask);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask)
|
static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask)
|
||||||
{
|
{
|
||||||
|
if (cpu_is_omap44xx())
|
||||||
|
omap4_dsi_mux_pads(dsi_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int omap_dss_set_min_bus_tput(struct device *dev, unsigned long tput)
|
static int omap_dss_set_min_bus_tput(struct device *dev, unsigned long tput)
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk-provider.h>
|
|
||||||
#include <linux/irqchip.h>
|
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
@@ -48,15 +46,9 @@ static void __init s3c64xx_dt_map_io(void)
|
|||||||
panic("SoC is not S3C64xx!");
|
panic("SoC is not S3C64xx!");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init s3c64xx_dt_init_irq(void)
|
|
||||||
{
|
|
||||||
of_clk_init(NULL);
|
|
||||||
samsung_wdt_reset_of_init();
|
|
||||||
irqchip_init();
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init s3c64xx_dt_init_machine(void)
|
static void __init s3c64xx_dt_init_machine(void)
|
||||||
{
|
{
|
||||||
|
samsung_wdt_reset_of_init();
|
||||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +71,6 @@ DT_MACHINE_START(S3C6400_DT, "Samsung S3C64xx (Flattened Device Tree)")
|
|||||||
/* Maintainer: Tomasz Figa <tomasz.figa@gmail.com> */
|
/* Maintainer: Tomasz Figa <tomasz.figa@gmail.com> */
|
||||||
.dt_compat = s3c64xx_dt_compat,
|
.dt_compat = s3c64xx_dt_compat,
|
||||||
.map_io = s3c64xx_dt_map_io,
|
.map_io = s3c64xx_dt_map_io,
|
||||||
.init_irq = s3c64xx_dt_init_irq,
|
|
||||||
.init_machine = s3c64xx_dt_init_machine,
|
.init_machine = s3c64xx_dt_init_machine,
|
||||||
.restart = s3c64xx_dt_restart,
|
.restart = s3c64xx_dt_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|||||||
@@ -245,7 +245,9 @@ static void __init lager_init(void)
|
|||||||
{
|
{
|
||||||
lager_add_standard_devices();
|
lager_add_standard_devices();
|
||||||
|
|
||||||
phy_register_fixup_for_id("r8a7790-ether-ff:01", lager_ksz8041_fixup);
|
if (IS_ENABLED(CONFIG_PHYLIB))
|
||||||
|
phy_register_fixup_for_id("r8a7790-ether-ff:01",
|
||||||
|
lager_ksz8041_fixup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char * const lager_boards_compat_dt[] __initconst = {
|
static const char * const lager_boards_compat_dt[] __initconst = {
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ static int remap_pte_fn(pte_t *ptep, pgtable_t token, unsigned long addr,
|
|||||||
struct remap_data *info = data;
|
struct remap_data *info = data;
|
||||||
struct page *page = info->pages[info->index++];
|
struct page *page = info->pages[info->index++];
|
||||||
unsigned long pfn = page_to_pfn(page);
|
unsigned long pfn = page_to_pfn(page);
|
||||||
pte_t pte = pfn_pte(pfn, info->prot);
|
pte_t pte = pte_mkspecial(pfn_pte(pfn, info->prot));
|
||||||
|
|
||||||
if (map_foreign_page(pfn, info->fgmfn, info->domid))
|
if (map_foreign_page(pfn, info->fgmfn, info->domid))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
@@ -224,10 +224,10 @@ static int __init xen_guest_init(void)
|
|||||||
}
|
}
|
||||||
if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res))
|
if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res))
|
||||||
return 0;
|
return 0;
|
||||||
xen_hvm_resume_frames = res.start >> PAGE_SHIFT;
|
xen_hvm_resume_frames = res.start;
|
||||||
xen_events_irq = irq_of_parse_and_map(node, 0);
|
xen_events_irq = irq_of_parse_and_map(node, 0);
|
||||||
pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n",
|
pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n",
|
||||||
version, xen_events_irq, xen_hvm_resume_frames);
|
version, xen_events_irq, (xen_hvm_resume_frames >> PAGE_SHIFT));
|
||||||
xen_domain_type = XEN_HVM_DOMAIN;
|
xen_domain_type = XEN_HVM_DOMAIN;
|
||||||
|
|
||||||
xen_setup_features();
|
xen_setup_features();
|
||||||
|
|||||||
@@ -23,25 +23,21 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
|
|||||||
unsigned long offset, size_t size, enum dma_data_direction dir,
|
unsigned long offset, size_t size, enum dma_data_direction dir,
|
||||||
struct dma_attrs *attrs)
|
struct dma_attrs *attrs)
|
||||||
{
|
{
|
||||||
__generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
||||||
size_t size, enum dma_data_direction dir,
|
size_t size, enum dma_data_direction dir,
|
||||||
struct dma_attrs *attrs)
|
struct dma_attrs *attrs)
|
||||||
{
|
{
|
||||||
__generic_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
||||||
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
__generic_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void xen_dma_sync_single_for_device(struct device *hwdev,
|
static inline void xen_dma_sync_single_for_device(struct device *hwdev,
|
||||||
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
{
|
{
|
||||||
__generic_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir);
|
|
||||||
}
|
}
|
||||||
#endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */
|
#endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */
|
||||||
|
|||||||
@@ -214,31 +214,29 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type,
|
|||||||
{
|
{
|
||||||
int err, len, type, disabled = !ctrl.enabled;
|
int err, len, type, disabled = !ctrl.enabled;
|
||||||
|
|
||||||
if (disabled) {
|
attr->disabled = disabled;
|
||||||
len = 0;
|
if (disabled)
|
||||||
type = HW_BREAKPOINT_EMPTY;
|
return 0;
|
||||||
} else {
|
|
||||||
err = arch_bp_generic_fields(ctrl, &len, &type);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
switch (note_type) {
|
err = arch_bp_generic_fields(ctrl, &len, &type);
|
||||||
case NT_ARM_HW_BREAK:
|
if (err)
|
||||||
if ((type & HW_BREAKPOINT_X) != type)
|
return err;
|
||||||
return -EINVAL;
|
|
||||||
break;
|
switch (note_type) {
|
||||||
case NT_ARM_HW_WATCH:
|
case NT_ARM_HW_BREAK:
|
||||||
if ((type & HW_BREAKPOINT_RW) != type)
|
if ((type & HW_BREAKPOINT_X) != type)
|
||||||
return -EINVAL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
break;
|
||||||
|
case NT_ARM_HW_WATCH:
|
||||||
|
if ((type & HW_BREAKPOINT_RW) != type)
|
||||||
|
return -EINVAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
attr->bp_len = len;
|
attr->bp_len = len;
|
||||||
attr->bp_type = type;
|
attr->bp_type = type;
|
||||||
attr->disabled = disabled;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,10 @@ extern void kvmppc_load_up_vsx(void);
|
|||||||
extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst);
|
extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst);
|
||||||
extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst);
|
extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst);
|
||||||
extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd);
|
extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd);
|
||||||
|
extern void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
|
||||||
|
struct kvm_vcpu *vcpu);
|
||||||
|
extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
|
||||||
|
struct kvmppc_book3s_shadow_vcpu *svcpu);
|
||||||
|
|
||||||
static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
|
static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ struct kvmppc_host_state {
|
|||||||
ulong vmhandler;
|
ulong vmhandler;
|
||||||
ulong scratch0;
|
ulong scratch0;
|
||||||
ulong scratch1;
|
ulong scratch1;
|
||||||
|
ulong scratch2;
|
||||||
u8 in_guest;
|
u8 in_guest;
|
||||||
u8 restore_hid5;
|
u8 restore_hid5;
|
||||||
u8 napping;
|
u8 napping;
|
||||||
@@ -106,6 +107,7 @@ struct kvmppc_host_state {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct kvmppc_book3s_shadow_vcpu {
|
struct kvmppc_book3s_shadow_vcpu {
|
||||||
|
bool in_use;
|
||||||
ulong gpr[14];
|
ulong gpr[14];
|
||||||
u32 cr;
|
u32 cr;
|
||||||
u32 xer;
|
u32 xer;
|
||||||
|
|||||||
@@ -720,13 +720,13 @@ int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe,
|
|||||||
int64_t opal_pci_poll(uint64_t phb_id);
|
int64_t opal_pci_poll(uint64_t phb_id);
|
||||||
int64_t opal_return_cpu(void);
|
int64_t opal_return_cpu(void);
|
||||||
|
|
||||||
int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, uint64_t *val);
|
int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val);
|
||||||
int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val);
|
int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val);
|
||||||
|
|
||||||
int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
|
int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
|
||||||
uint32_t addr, uint32_t data, uint32_t sz);
|
uint32_t addr, uint32_t data, uint32_t sz);
|
||||||
int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type,
|
int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type,
|
||||||
uint32_t addr, uint32_t *data, uint32_t sz);
|
uint32_t addr, __be32 *data, uint32_t sz);
|
||||||
int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result);
|
int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result);
|
||||||
int64_t opal_manage_flash(uint8_t op);
|
int64_t opal_manage_flash(uint8_t op);
|
||||||
int64_t opal_update_flash(uint64_t blk_list);
|
int64_t opal_update_flash(uint64_t blk_list);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ extern void giveup_vsx(struct task_struct *);
|
|||||||
extern void enable_kernel_spe(void);
|
extern void enable_kernel_spe(void);
|
||||||
extern void giveup_spe(struct task_struct *);
|
extern void giveup_spe(struct task_struct *);
|
||||||
extern void load_up_spe(struct task_struct *);
|
extern void load_up_spe(struct task_struct *);
|
||||||
extern void switch_booke_debug_regs(struct thread_struct *new_thread);
|
extern void switch_booke_debug_regs(struct debug_reg *new_debug);
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
extern void discard_lazy_cpu_state(void);
|
extern void discard_lazy_cpu_state(void);
|
||||||
|
|||||||
@@ -576,6 +576,7 @@ int main(void)
|
|||||||
HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler);
|
HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler);
|
||||||
HSTATE_FIELD(HSTATE_SCRATCH0, scratch0);
|
HSTATE_FIELD(HSTATE_SCRATCH0, scratch0);
|
||||||
HSTATE_FIELD(HSTATE_SCRATCH1, scratch1);
|
HSTATE_FIELD(HSTATE_SCRATCH1, scratch1);
|
||||||
|
HSTATE_FIELD(HSTATE_SCRATCH2, scratch2);
|
||||||
HSTATE_FIELD(HSTATE_IN_GUEST, in_guest);
|
HSTATE_FIELD(HSTATE_IN_GUEST, in_guest);
|
||||||
HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5);
|
HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5);
|
||||||
HSTATE_FIELD(HSTATE_NAPPING, napping);
|
HSTATE_FIELD(HSTATE_NAPPING, napping);
|
||||||
|
|||||||
@@ -124,15 +124,15 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
|||||||
void crash_free_reserved_phys_range(unsigned long begin, unsigned long end)
|
void crash_free_reserved_phys_range(unsigned long begin, unsigned long end)
|
||||||
{
|
{
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
const u32 *basep, *sizep;
|
const __be32 *basep, *sizep;
|
||||||
unsigned int rtas_start = 0, rtas_end = 0;
|
unsigned int rtas_start = 0, rtas_end = 0;
|
||||||
|
|
||||||
basep = of_get_property(rtas.dev, "linux,rtas-base", NULL);
|
basep = of_get_property(rtas.dev, "linux,rtas-base", NULL);
|
||||||
sizep = of_get_property(rtas.dev, "rtas-size", NULL);
|
sizep = of_get_property(rtas.dev, "rtas-size", NULL);
|
||||||
|
|
||||||
if (basep && sizep) {
|
if (basep && sizep) {
|
||||||
rtas_start = *basep;
|
rtas_start = be32_to_cpup(basep);
|
||||||
rtas_end = *basep + *sizep;
|
rtas_end = rtas_start + be32_to_cpup(sizep);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (addr = begin; addr < end; addr += PAGE_SIZE) {
|
for (addr = begin; addr < end; addr += PAGE_SIZE) {
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ static void set_debug_reg_defaults(struct thread_struct *thread)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prime_debug_regs(struct thread_struct *thread)
|
static void prime_debug_regs(struct debug_reg *debug)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We could have inherited MSR_DE from userspace, since
|
* We could have inherited MSR_DE from userspace, since
|
||||||
@@ -348,22 +348,22 @@ static void prime_debug_regs(struct thread_struct *thread)
|
|||||||
*/
|
*/
|
||||||
mtmsr(mfmsr() & ~MSR_DE);
|
mtmsr(mfmsr() & ~MSR_DE);
|
||||||
|
|
||||||
mtspr(SPRN_IAC1, thread->debug.iac1);
|
mtspr(SPRN_IAC1, debug->iac1);
|
||||||
mtspr(SPRN_IAC2, thread->debug.iac2);
|
mtspr(SPRN_IAC2, debug->iac2);
|
||||||
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
|
#if CONFIG_PPC_ADV_DEBUG_IACS > 2
|
||||||
mtspr(SPRN_IAC3, thread->debug.iac3);
|
mtspr(SPRN_IAC3, debug->iac3);
|
||||||
mtspr(SPRN_IAC4, thread->debug.iac4);
|
mtspr(SPRN_IAC4, debug->iac4);
|
||||||
#endif
|
#endif
|
||||||
mtspr(SPRN_DAC1, thread->debug.dac1);
|
mtspr(SPRN_DAC1, debug->dac1);
|
||||||
mtspr(SPRN_DAC2, thread->debug.dac2);
|
mtspr(SPRN_DAC2, debug->dac2);
|
||||||
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
|
#if CONFIG_PPC_ADV_DEBUG_DVCS > 0
|
||||||
mtspr(SPRN_DVC1, thread->debug.dvc1);
|
mtspr(SPRN_DVC1, debug->dvc1);
|
||||||
mtspr(SPRN_DVC2, thread->debug.dvc2);
|
mtspr(SPRN_DVC2, debug->dvc2);
|
||||||
#endif
|
#endif
|
||||||
mtspr(SPRN_DBCR0, thread->debug.dbcr0);
|
mtspr(SPRN_DBCR0, debug->dbcr0);
|
||||||
mtspr(SPRN_DBCR1, thread->debug.dbcr1);
|
mtspr(SPRN_DBCR1, debug->dbcr1);
|
||||||
#ifdef CONFIG_BOOKE
|
#ifdef CONFIG_BOOKE
|
||||||
mtspr(SPRN_DBCR2, thread->debug.dbcr2);
|
mtspr(SPRN_DBCR2, debug->dbcr2);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -371,11 +371,11 @@ static void prime_debug_regs(struct thread_struct *thread)
|
|||||||
* debug registers, set the debug registers from the values
|
* debug registers, set the debug registers from the values
|
||||||
* stored in the new thread.
|
* stored in the new thread.
|
||||||
*/
|
*/
|
||||||
void switch_booke_debug_regs(struct thread_struct *new_thread)
|
void switch_booke_debug_regs(struct debug_reg *new_debug)
|
||||||
{
|
{
|
||||||
if ((current->thread.debug.dbcr0 & DBCR0_IDM)
|
if ((current->thread.debug.dbcr0 & DBCR0_IDM)
|
||||||
|| (new_thread->debug.dbcr0 & DBCR0_IDM))
|
|| (new_debug->dbcr0 & DBCR0_IDM))
|
||||||
prime_debug_regs(new_thread);
|
prime_debug_regs(new_debug);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(switch_booke_debug_regs);
|
EXPORT_SYMBOL_GPL(switch_booke_debug_regs);
|
||||||
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
|
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
|
||||||
@@ -683,7 +683,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
|||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
||||||
switch_booke_debug_regs(&new->thread);
|
switch_booke_debug_regs(&new->thread.debug);
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would
|
* For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would
|
||||||
|
|||||||
@@ -1555,7 +1555,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
|||||||
|
|
||||||
flush_fp_to_thread(child);
|
flush_fp_to_thread(child);
|
||||||
if (fpidx < (PT_FPSCR - PT_FPR0))
|
if (fpidx < (PT_FPSCR - PT_FPR0))
|
||||||
memcpy(&tmp, &child->thread.fp_state.fpr,
|
memcpy(&tmp, &child->thread.TS_FPR(fpidx),
|
||||||
sizeof(long));
|
sizeof(long));
|
||||||
else
|
else
|
||||||
tmp = child->thread.fp_state.fpscr;
|
tmp = child->thread.fp_state.fpscr;
|
||||||
@@ -1588,7 +1588,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
|||||||
|
|
||||||
flush_fp_to_thread(child);
|
flush_fp_to_thread(child);
|
||||||
if (fpidx < (PT_FPSCR - PT_FPR0))
|
if (fpidx < (PT_FPSCR - PT_FPR0))
|
||||||
memcpy(&child->thread.fp_state.fpr, &data,
|
memcpy(&child->thread.TS_FPR(fpidx), &data,
|
||||||
sizeof(long));
|
sizeof(long));
|
||||||
else
|
else
|
||||||
child->thread.fp_state.fpscr = data;
|
child->thread.fp_state.fpscr = data;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user