Merge branch 'master' into for-4.9
This commit is contained in:
commit
2536524a91
2
.mailmap
2
.mailmap
|
@ -158,6 +158,8 @@ Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
||||||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com>
|
Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com>
|
||||||
Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com>
|
Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com>
|
||||||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com>
|
Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com>
|
||||||
|
Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@virtuozzo.com>
|
||||||
|
Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@parallels.com>
|
||||||
Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
||||||
Yusuke Goda <goda.yusuke@renesas.com>
|
Yusuke Goda <goda.yusuke@renesas.com>
|
||||||
Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Note: This documents additional properties of any device beyond what
|
# Note: This documents additional properties of any device beyond what
|
||||||
# is documented in Documentation/sysfs-rules.txt
|
# is documented in Documentation/sysfs-rules.txt
|
||||||
|
|
||||||
What: /sys/devices/*/of_path
|
What: /sys/devices/*/of_node
|
||||||
Date: February 2015
|
Date: February 2015
|
||||||
Contact: Device Tree mailing list <devicetree@vger.kernel.org>
|
Contact: Device Tree mailing list <devicetree@vger.kernel.org>
|
||||||
Description:
|
Description:
|
||||||
|
|
|
@ -94,14 +94,11 @@ has a requirements for a minimum number of vectors the driver can pass a
|
||||||
min_vecs argument set to this limit, and the PCI core will return -ENOSPC
|
min_vecs argument set to this limit, and the PCI core will return -ENOSPC
|
||||||
if it can't meet the minimum number of vectors.
|
if it can't meet the minimum number of vectors.
|
||||||
|
|
||||||
The flags argument should normally be set to 0, but can be used to pass the
|
The flags argument is used to specify which type of interrupt can be used
|
||||||
PCI_IRQ_NOMSI and PCI_IRQ_NOMSIX flag in case a device claims to support
|
by the device and the driver (PCI_IRQ_LEGACY, PCI_IRQ_MSI, PCI_IRQ_MSIX).
|
||||||
MSI or MSI-X, but the support is broken, or to pass PCI_IRQ_NOLEGACY in
|
A convenient short-hand (PCI_IRQ_ALL_TYPES) is also available to ask for
|
||||||
case the device does not support legacy interrupt lines.
|
any possible kind of interrupt. If the PCI_IRQ_AFFINITY flag is set,
|
||||||
|
pci_alloc_irq_vectors() will spread the interrupts around the available CPUs.
|
||||||
By default this function will spread the interrupts around the available
|
|
||||||
CPUs, but this feature can be disabled by passing the PCI_IRQ_NOAFFINITY
|
|
||||||
flag.
|
|
||||||
|
|
||||||
To get the Linux IRQ numbers passed to request_irq() and free_irq() and the
|
To get the Linux IRQ numbers passed to request_irq() and free_irq() and the
|
||||||
vectors, use the following function:
|
vectors, use the following function:
|
||||||
|
@ -131,7 +128,7 @@ larger than the number supported by the device it will automatically be
|
||||||
capped to the supported limit, so there is no need to query the number of
|
capped to the supported limit, so there is no need to query the number of
|
||||||
vectors supported beforehand:
|
vectors supported beforehand:
|
||||||
|
|
||||||
nvec = pci_alloc_irq_vectors(pdev, 1, nvec, 0);
|
nvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_ALL_TYPES)
|
||||||
if (nvec < 0)
|
if (nvec < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
@ -140,7 +137,7 @@ interrupts it can request a particular number of interrupts by passing that
|
||||||
number to pci_alloc_irq_vectors() function as both 'min_vecs' and
|
number to pci_alloc_irq_vectors() function as both 'min_vecs' and
|
||||||
'max_vecs' parameters:
|
'max_vecs' parameters:
|
||||||
|
|
||||||
ret = pci_alloc_irq_vectors(pdev, nvec, nvec, 0);
|
ret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_ALL_TYPES);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
@ -148,15 +145,14 @@ The most notorious example of the request type described above is enabling
|
||||||
the single MSI mode for a device. It could be done by passing two 1s as
|
the single MSI mode for a device. It could be done by passing two 1s as
|
||||||
'min_vecs' and 'max_vecs':
|
'min_vecs' and 'max_vecs':
|
||||||
|
|
||||||
ret = pci_alloc_irq_vectors(pdev, 1, 1, 0);
|
ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
Some devices might not support using legacy line interrupts, in which case
|
Some devices might not support using legacy line interrupts, in which case
|
||||||
the PCI_IRQ_NOLEGACY flag can be used to fail the request if the platform
|
the driver can specify that only MSI or MSI-X is acceptable:
|
||||||
can't provide MSI or MSI-X interrupts:
|
|
||||||
|
|
||||||
nvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_NOLEGACY);
|
nvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_MSI | PCI_IRQ_MSIX);
|
||||||
if (nvec < 0)
|
if (nvec < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,6 @@ initialization with a pointer to a structure describing the driver
|
||||||
|
|
||||||
The ID table is an array of struct pci_device_id entries ending with an
|
The ID table is an array of struct pci_device_id entries ending with an
|
||||||
all-zero entry. Definitions with static const are generally preferred.
|
all-zero entry. Definitions with static const are generally preferred.
|
||||||
Use of the deprecated macro DEFINE_PCI_DEVICE_TABLE should be avoided.
|
|
||||||
|
|
||||||
Each entry consists of:
|
Each entry consists of:
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ stable kernels.
|
||||||
| ARM | Cortex-A57 | #832075 | ARM64_ERRATUM_832075 |
|
| ARM | Cortex-A57 | #832075 | ARM64_ERRATUM_832075 |
|
||||||
| ARM | Cortex-A57 | #852523 | N/A |
|
| ARM | Cortex-A57 | #852523 | N/A |
|
||||||
| ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 |
|
| ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 |
|
||||||
|
| ARM | Cortex-A72 | #853709 | N/A |
|
||||||
| ARM | MMU-500 | #841119,#826419 | N/A |
|
| ARM | MMU-500 | #841119,#826419 | N/A |
|
||||||
| | | | |
|
| | | | |
|
||||||
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
|
||||||
|
|
|
@ -14,6 +14,12 @@ add_random (RW)
|
||||||
This file allows to turn off the disk entropy contribution. Default
|
This file allows to turn off the disk entropy contribution. Default
|
||||||
value of this file is '1'(on).
|
value of this file is '1'(on).
|
||||||
|
|
||||||
|
dax (RO)
|
||||||
|
--------
|
||||||
|
This file indicates whether the device supports Direct Access (DAX),
|
||||||
|
used by CPU-addressable storage to bypass the pagecache. It shows '1'
|
||||||
|
if true, '0' if not.
|
||||||
|
|
||||||
discard_granularity (RO)
|
discard_granularity (RO)
|
||||||
-----------------------
|
-----------------------
|
||||||
This shows the size of internal allocation of the device in bytes, if
|
This shows the size of internal allocation of the device in bytes, if
|
||||||
|
@ -46,6 +52,12 @@ hw_sector_size (RO)
|
||||||
-------------------
|
-------------------
|
||||||
This is the hardware sector size of the device, in bytes.
|
This is the hardware sector size of the device, in bytes.
|
||||||
|
|
||||||
|
io_poll (RW)
|
||||||
|
------------
|
||||||
|
When read, this file shows the total number of block IO polls and how
|
||||||
|
many returned success. Writing '0' to this file will disable polling
|
||||||
|
for this device. Writing any non-zero value will enable this feature.
|
||||||
|
|
||||||
iostats (RW)
|
iostats (RW)
|
||||||
-------------
|
-------------
|
||||||
This file is used to control (on/off) the iostats accounting of the
|
This file is used to control (on/off) the iostats accounting of the
|
||||||
|
@ -151,5 +163,11 @@ device state. This means that it might not be safe to toggle the
|
||||||
setting from "write back" to "write through", since that will also
|
setting from "write back" to "write through", since that will also
|
||||||
eliminate cache flushes issued by the kernel.
|
eliminate cache flushes issued by the kernel.
|
||||||
|
|
||||||
|
write_same_max_bytes (RO)
|
||||||
|
-------------------------
|
||||||
|
This is the number of bytes the device can write in a single write-same
|
||||||
|
command. A value of '0' means write-same is not supported by this
|
||||||
|
device.
|
||||||
|
|
||||||
|
|
||||||
Jens Axboe <jens.axboe@oracle.com>, February 2009
|
Jens Axboe <jens.axboe@oracle.com>, February 2009
|
||||||
|
|
|
@ -131,7 +131,7 @@ pygments_style = 'sphinx'
|
||||||
todo_include_todos = False
|
todo_include_todos = False
|
||||||
|
|
||||||
primary_domain = 'C'
|
primary_domain = 'C'
|
||||||
highlight_language = 'C'
|
highlight_language = 'guess'
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
# -- Options for HTML output ----------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,11 @@ Required properties:
|
||||||
- vref-supply: The regulator supply ADC reference voltage.
|
- vref-supply: The regulator supply ADC reference voltage.
|
||||||
- #io-channel-cells: Should be 1, see ../iio-bindings.txt
|
- #io-channel-cells: Should be 1, see ../iio-bindings.txt
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- resets: Must contain an entry for each entry in reset-names if need support
|
||||||
|
this option. See ../reset/reset.txt for details.
|
||||||
|
- reset-names: Must include the name "saradc-apb".
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
saradc: saradc@2006c000 {
|
saradc: saradc@2006c000 {
|
||||||
compatible = "rockchip,saradc";
|
compatible = "rockchip,saradc";
|
||||||
|
@ -23,6 +28,8 @@ Example:
|
||||||
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||||
clock-names = "saradc", "apb_pclk";
|
clock-names = "saradc", "apb_pclk";
|
||||||
|
resets = <&cru SRST_SARADC>;
|
||||||
|
reset-names = "saradc-apb";
|
||||||
#io-channel-cells = <1>;
|
#io-channel-cells = <1>;
|
||||||
vref-supply = <&vcc18>;
|
vref-supply = <&vcc18>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,9 +42,6 @@ Optional properties:
|
||||||
- auto-flow-control: one way to enable automatic flow control support. The
|
- auto-flow-control: one way to enable automatic flow control support. The
|
||||||
driver is allowed to detect support for the capability even without this
|
driver is allowed to detect support for the capability even without this
|
||||||
property.
|
property.
|
||||||
- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD
|
|
||||||
line respectively. It will use specified GPIO instead of the peripheral
|
|
||||||
function pin for the UART feature. If unsure, don't specify this property.
|
|
||||||
|
|
||||||
Note:
|
Note:
|
||||||
* fsl,ns16550:
|
* fsl,ns16550:
|
||||||
|
@ -66,19 +63,3 @@ Example:
|
||||||
interrupts = <10>;
|
interrupts = <10>;
|
||||||
reg-shift = <2>;
|
reg-shift = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
Example for OMAP UART using GPIO-based modem control signals:
|
|
||||||
|
|
||||||
uart4: serial@49042000 {
|
|
||||||
compatible = "ti,omap3-uart";
|
|
||||||
reg = <0x49042000 0x400>;
|
|
||||||
interrupts = <80>;
|
|
||||||
ti,hwmods = "uart4";
|
|
||||||
clock-frequency = <48000000>;
|
|
||||||
cts-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
|
|
||||||
rts-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>;
|
|
||||||
dtr-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
|
|
||||||
dsr-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
|
|
||||||
dcd-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
|
|
||||||
rng-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
|
|
||||||
};
|
|
||||||
|
|
|
@ -8,8 +8,6 @@ Required properties:
|
||||||
- interrupts: Interrupt number for McPDM
|
- interrupts: Interrupt number for McPDM
|
||||||
- interrupt-parent: The parent interrupt controller
|
- interrupt-parent: The parent interrupt controller
|
||||||
- ti,hwmods: Name of the hwmod associated to the McPDM
|
- ti,hwmods: Name of the hwmod associated to the McPDM
|
||||||
- clocks: phandle for the pdmclk provider, likely <&twl6040>
|
|
||||||
- clock-names: Must be "pdmclk"
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -21,11 +19,3 @@ mcpdm: mcpdm@40132000 {
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
ti,hwmods = "mcpdm";
|
ti,hwmods = "mcpdm";
|
||||||
};
|
};
|
||||||
|
|
||||||
In board DTS file the pdmclk needs to be added:
|
|
||||||
|
|
||||||
&mcpdm {
|
|
||||||
clocks = <&twl6040>;
|
|
||||||
clock-names = "pdmclk";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ For more examples of cooling devices, refer to the example sections below.
|
||||||
Required properties:
|
Required properties:
|
||||||
- #cooling-cells: Used to provide cooling device specific information
|
- #cooling-cells: Used to provide cooling device specific information
|
||||||
Type: unsigned while referring to it. Must be at least 2, in order
|
Type: unsigned while referring to it. Must be at least 2, in order
|
||||||
Size: one cell to specify minimum and maximum cooling state used
|
Size: one cell to specify minimum and maximum cooling state used
|
||||||
in the reference. The first cell is the minimum
|
in the reference. The first cell is the minimum
|
||||||
cooling state requested and the second cell is
|
cooling state requested and the second cell is
|
||||||
the maximum cooling state requested in the reference.
|
the maximum cooling state requested in the reference.
|
||||||
|
@ -119,7 +119,7 @@ Required properties:
|
||||||
Optional property:
|
Optional property:
|
||||||
- contribution: The cooling contribution to the thermal zone of the
|
- contribution: The cooling contribution to the thermal zone of the
|
||||||
Type: unsigned referred cooling device at the referred trip point.
|
Type: unsigned referred cooling device at the referred trip point.
|
||||||
Size: one cell The contribution is a ratio of the sum
|
Size: one cell The contribution is a ratio of the sum
|
||||||
of all cooling contributions within a thermal zone.
|
of all cooling contributions within a thermal zone.
|
||||||
|
|
||||||
Note: Using the THERMAL_NO_LIMIT (-1UL) constant in the cooling-device phandle
|
Note: Using the THERMAL_NO_LIMIT (-1UL) constant in the cooling-device phandle
|
||||||
|
@ -145,7 +145,7 @@ Required properties:
|
||||||
Size: one cell
|
Size: one cell
|
||||||
|
|
||||||
- thermal-sensors: A list of thermal sensor phandles and sensor specifier
|
- thermal-sensors: A list of thermal sensor phandles and sensor specifier
|
||||||
Type: list of used while monitoring the thermal zone.
|
Type: list of used while monitoring the thermal zone.
|
||||||
phandles + sensor
|
phandles + sensor
|
||||||
specifier
|
specifier
|
||||||
|
|
||||||
|
@ -473,7 +473,7 @@ thermal-zones {
|
||||||
<&adc>; /* pcb north */
|
<&adc>; /* pcb north */
|
||||||
|
|
||||||
/* hotspot = 100 * bandgap - 120 * adc + 484 */
|
/* hotspot = 100 * bandgap - 120 * adc + 484 */
|
||||||
coefficients = <100 -120 484>;
|
coefficients = <100 -120 484>;
|
||||||
|
|
||||||
trips {
|
trips {
|
||||||
...
|
...
|
||||||
|
@ -502,7 +502,7 @@ from the ADC sensor. The binding would be then:
|
||||||
thermal-sensors = <&adc>;
|
thermal-sensors = <&adc>;
|
||||||
|
|
||||||
/* hotspot = 1 * adc + 6000 */
|
/* hotspot = 1 * adc + 6000 */
|
||||||
coefficients = <1 6000>;
|
coefficients = <1 6000>;
|
||||||
|
|
||||||
(d) - Board thermal
|
(d) - Board thermal
|
||||||
|
|
||||||
|
|
|
@ -183,12 +183,10 @@ The copy_up operation essentially creates a new, identical file and
|
||||||
moves it over to the old name. The new file may be on a different
|
moves it over to the old name. The new file may be on a different
|
||||||
filesystem, so both st_dev and st_ino of the file may change.
|
filesystem, so both st_dev and st_ino of the file may change.
|
||||||
|
|
||||||
Any open files referring to this inode will access the old data and
|
Any open files referring to this inode will access the old data.
|
||||||
metadata. Similarly any file locks obtained before copy_up will not
|
|
||||||
apply to the copied up file.
|
|
||||||
|
|
||||||
On a file opened with O_RDONLY fchmod(2), fchown(2), futimesat(2) and
|
Any file locks (and leases) obtained before copy_up will not apply
|
||||||
fsetxattr(2) will fail with EROFS.
|
to the copied up file.
|
||||||
|
|
||||||
If a file with multiple hard links is copied up, then this will
|
If a file with multiple hard links is copied up, then this will
|
||||||
"break" the link. Changes will not be propagated to other names
|
"break" the link. Changes will not be propagated to other names
|
||||||
|
|
|
@ -19,5 +19,5 @@ enhancements. It can monitor up to 4 voltages, 16 temperatures and
|
||||||
implemented in this driver.
|
implemented in this driver.
|
||||||
|
|
||||||
Specification of the chip can be found here:
|
Specification of the chip can be found here:
|
||||||
ftp:///pub/Mainboard-OEM-Sales/Services/Software&Tools/Linux_SystemMonitoring&Watchdog&GPIO/BMC-Teutates_Specification_V1.21.pdf
|
ftp://ftp.ts.fujitsu.com/pub/Mainboard-OEM-Sales/Services/Software&Tools/Linux_SystemMonitoring&Watchdog&GPIO/BMC-Teutates_Specification_V1.21.pdf
|
||||||
ftp:///pub/Mainboard-OEM-Sales/Services/Software&Tools/Linux_SystemMonitoring&Watchdog&GPIO/Fujitsu_mainboards-1-Sensors_HowTo-en-US.pdf
|
ftp://ftp.ts.fujitsu.com/pub/Mainboard-OEM-Sales/Services/Software&Tools/Linux_SystemMonitoring&Watchdog&GPIO/Fujitsu_mainboards-1-Sensors_HowTo-en-US.pdf
|
||||||
|
|
|
@ -366,8 +366,6 @@ Domain`_ references.
|
||||||
Cross-referencing from reStructuredText
|
Cross-referencing from reStructuredText
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. highlight:: none
|
|
||||||
|
|
||||||
To cross-reference the functions and types defined in the kernel-doc comments
|
To cross-reference the functions and types defined in the kernel-doc comments
|
||||||
from reStructuredText documents, please use the `Sphinx C Domain`_
|
from reStructuredText documents, please use the `Sphinx C Domain`_
|
||||||
references. For example::
|
references. For example::
|
||||||
|
@ -390,8 +388,6 @@ For further details, please refer to the `Sphinx C Domain`_ documentation.
|
||||||
Function documentation
|
Function documentation
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
.. highlight:: c
|
|
||||||
|
|
||||||
The general format of a function and function-like macro kernel-doc comment is::
|
The general format of a function and function-like macro kernel-doc comment is::
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -572,8 +568,6 @@ DocBook XML [DEPRECATED]
|
||||||
Converting DocBook to Sphinx
|
Converting DocBook to Sphinx
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
.. highlight:: none
|
|
||||||
|
|
||||||
Over time, we expect all of the documents under ``Documentation/DocBook`` to be
|
Over time, we expect all of the documents under ``Documentation/DocBook`` to be
|
||||||
converted to Sphinx and reStructuredText. For most DocBook XML documents, a good
|
converted to Sphinx and reStructuredText. For most DocBook XML documents, a good
|
||||||
enough solution is to use the simple ``Documentation/sphinx/tmplcvt`` script,
|
enough solution is to use the simple ``Documentation/sphinx/tmplcvt`` script,
|
||||||
|
|
|
@ -3032,6 +3032,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
PAGE_SIZE is used as alignment.
|
PAGE_SIZE is used as alignment.
|
||||||
PCI-PCI bridge can be specified, if resource
|
PCI-PCI bridge can be specified, if resource
|
||||||
windows need to be expanded.
|
windows need to be expanded.
|
||||||
|
To specify the alignment for several
|
||||||
|
instances of a device, the PCI vendor,
|
||||||
|
device, subvendor, and subdevice may be
|
||||||
|
specified, e.g., 4096@pci:8086:9c22:103c:198f
|
||||||
ecrc= Enable/disable PCIe ECRC (transaction layer
|
ecrc= Enable/disable PCIe ECRC (transaction layer
|
||||||
end-to-end CRC checking).
|
end-to-end CRC checking).
|
||||||
bios: Use BIOS/firmware settings. This is the
|
bios: Use BIOS/firmware settings. This is the
|
||||||
|
|
|
@ -587,26 +587,6 @@ of DSA, would be the its port-based VLAN, used by the associated bridge device.
|
||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
The platform device problem
|
|
||||||
---------------------------
|
|
||||||
DSA is currently implemented as a platform device driver which is far from ideal
|
|
||||||
as was discussed in this thread:
|
|
||||||
|
|
||||||
http://permalink.gmane.org/gmane.linux.network/329848
|
|
||||||
|
|
||||||
This basically prevents the device driver model to be properly used and applied,
|
|
||||||
and support non-MDIO, non-MMIO Ethernet connected switches.
|
|
||||||
|
|
||||||
Another problem with the platform device driver approach is that it prevents the
|
|
||||||
use of a modular switch drivers build due to a circular dependency, illustrated
|
|
||||||
here:
|
|
||||||
|
|
||||||
http://comments.gmane.org/gmane.linux.network/345803
|
|
||||||
|
|
||||||
Attempts of reworking this has been done here:
|
|
||||||
|
|
||||||
https://lwn.net/Articles/643149/
|
|
||||||
|
|
||||||
Making SWITCHDEV and DSA converge towards an unified codebase
|
Making SWITCHDEV and DSA converge towards an unified codebase
|
||||||
-------------------------------------------------------------
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -790,13 +790,12 @@ The kernel interface functions are as follows:
|
||||||
Data messages can have their contents extracted with the usual bunch of
|
Data messages can have their contents extracted with the usual bunch of
|
||||||
socket buffer manipulation functions. A data message can be determined to
|
socket buffer manipulation functions. A data message can be determined to
|
||||||
be the last one in a sequence with rxrpc_kernel_is_data_last(). When a
|
be the last one in a sequence with rxrpc_kernel_is_data_last(). When a
|
||||||
data message has been used up, rxrpc_kernel_data_delivered() should be
|
data message has been used up, rxrpc_kernel_data_consumed() should be
|
||||||
called on it..
|
called on it.
|
||||||
|
|
||||||
Non-data messages should be handled to rxrpc_kernel_free_skb() to dispose
|
Messages should be handled to rxrpc_kernel_free_skb() to dispose of. It
|
||||||
of. It is possible to get extra refs on all types of message for later
|
is possible to get extra refs on all types of message for later freeing,
|
||||||
freeing, but this may pin the state of a call until the message is finally
|
but this may pin the state of a call until the message is finally freed.
|
||||||
freed.
|
|
||||||
|
|
||||||
(*) Accept an incoming call.
|
(*) Accept an incoming call.
|
||||||
|
|
||||||
|
@ -821,12 +820,14 @@ The kernel interface functions are as follows:
|
||||||
Other errors may be returned if the call had been aborted (-ECONNABORTED)
|
Other errors may be returned if the call had been aborted (-ECONNABORTED)
|
||||||
or had timed out (-ETIME).
|
or had timed out (-ETIME).
|
||||||
|
|
||||||
(*) Record the delivery of a data message and free it.
|
(*) Record the delivery of a data message.
|
||||||
|
|
||||||
void rxrpc_kernel_data_delivered(struct sk_buff *skb);
|
void rxrpc_kernel_data_consumed(struct rxrpc_call *call,
|
||||||
|
struct sk_buff *skb);
|
||||||
|
|
||||||
This is used to record a data message as having been delivered and to
|
This is used to record a data message as having been consumed and to
|
||||||
update the ACK state for the call. The socket buffer will be freed.
|
update the ACK state for the call. The message must still be passed to
|
||||||
|
rxrpc_kernel_free_skb() for disposal by the caller.
|
||||||
|
|
||||||
(*) Free a message.
|
(*) Free a message.
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,32 @@ load n/2 modules more and try again.
|
||||||
Again, if you find the offending module(s), it(they) must be unloaded every time
|
Again, if you find the offending module(s), it(they) must be unloaded every time
|
||||||
before hibernation, and please report the problem with it(them).
|
before hibernation, and please report the problem with it(them).
|
||||||
|
|
||||||
c) Advanced debugging
|
c) Using the "test_resume" hibernation option
|
||||||
|
|
||||||
|
/sys/power/disk generally tells the kernel what to do after creating a
|
||||||
|
hibernation image. One of the available options is "test_resume" which
|
||||||
|
causes the just created image to be used for immediate restoration. Namely,
|
||||||
|
after doing:
|
||||||
|
|
||||||
|
# echo test_resume > /sys/power/disk
|
||||||
|
# echo disk > /sys/power/state
|
||||||
|
|
||||||
|
a hibernation image will be created and a resume from it will be triggered
|
||||||
|
immediately without involving the platform firmware in any way.
|
||||||
|
|
||||||
|
That test can be used to check if failures to resume from hibernation are
|
||||||
|
related to bad interactions with the platform firmware. That is, if the above
|
||||||
|
works every time, but resume from actual hibernation does not work or is
|
||||||
|
unreliable, the platform firmware may be responsible for the failures.
|
||||||
|
|
||||||
|
On architectures and platforms that support using different kernels to restore
|
||||||
|
hibernation images (that is, the kernel used to read the image from storage and
|
||||||
|
load it into memory is different from the one included in the image) or support
|
||||||
|
kernel address space randomization, it also can be used to check if failures
|
||||||
|
to resume may be related to the differences between the restore and image
|
||||||
|
kernels.
|
||||||
|
|
||||||
|
d) Advanced debugging
|
||||||
|
|
||||||
In case that hibernation does not work on your system even in the minimal
|
In case that hibernation does not work on your system even in the minimal
|
||||||
configuration and compiling more drivers as modules is not practical or some
|
configuration and compiling more drivers as modules is not practical or some
|
||||||
|
|
|
@ -1,75 +1,76 @@
|
||||||
Power Management Interface
|
Power Management Interface for System Sleep
|
||||||
|
|
||||||
|
Copyright (c) 2016 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
|
|
||||||
The power management subsystem provides a unified sysfs interface to
|
The power management subsystem provides userspace with a unified sysfs interface
|
||||||
userspace, regardless of what architecture or platform one is
|
for system sleep regardless of the underlying system architecture or platform.
|
||||||
running. The interface exists in /sys/power/ directory (assuming sysfs
|
The interface is located in the /sys/power/ directory (assuming that sysfs is
|
||||||
is mounted at /sys).
|
mounted at /sys).
|
||||||
|
|
||||||
/sys/power/state controls system power state. Reading from this file
|
/sys/power/state is the system sleep state control file.
|
||||||
returns what states are supported, which is hard-coded to 'freeze',
|
|
||||||
'standby' (Power-On Suspend), 'mem' (Suspend-to-RAM), and 'disk'
|
|
||||||
(Suspend-to-Disk).
|
|
||||||
|
|
||||||
Writing to this file one of those strings causes the system to
|
Reading from it returns a list of supported sleep states, encoded as:
|
||||||
transition into that state. Please see the file
|
|
||||||
Documentation/power/states.txt for a description of each of those
|
|
||||||
states.
|
|
||||||
|
|
||||||
|
'freeze' (Suspend-to-Idle)
|
||||||
|
'standby' (Power-On Suspend)
|
||||||
|
'mem' (Suspend-to-RAM)
|
||||||
|
'disk' (Suspend-to-Disk)
|
||||||
|
|
||||||
/sys/power/disk controls the operating mode of the suspend-to-disk
|
Suspend-to-Idle is always supported. Suspend-to-Disk is always supported
|
||||||
mechanism. Suspend-to-disk can be handled in several ways. We have a
|
too as long the kernel has been configured to support hibernation at all
|
||||||
few options for putting the system to sleep - using the platform driver
|
(ie. CONFIG_HIBERNATION is set in the kernel configuration file). Support
|
||||||
(e.g. ACPI or other suspend_ops), powering off the system or rebooting the
|
for Suspend-to-RAM and Power-On Suspend depends on the capabilities of the
|
||||||
system (for testing).
|
platform.
|
||||||
|
|
||||||
Additionally, /sys/power/disk can be used to turn on one of the two testing
|
If one of the strings listed in /sys/power/state is written to it, the system
|
||||||
modes of the suspend-to-disk mechanism: 'testproc' or 'test'. If the
|
will attempt to transition into the corresponding sleep state. Refer to
|
||||||
suspend-to-disk mechanism is in the 'testproc' mode, writing 'disk' to
|
Documentation/power/states.txt for a description of each of those states.
|
||||||
/sys/power/state will cause the kernel to disable nonboot CPUs and freeze
|
|
||||||
tasks, wait for 5 seconds, unfreeze tasks and enable nonboot CPUs. If it is
|
|
||||||
in the 'test' mode, writing 'disk' to /sys/power/state will cause the kernel
|
|
||||||
to disable nonboot CPUs and freeze tasks, shrink memory, suspend devices, wait
|
|
||||||
for 5 seconds, resume devices, unfreeze tasks and enable nonboot CPUs. Then,
|
|
||||||
we are able to look in the log messages and work out, for example, which code
|
|
||||||
is being slow and which device drivers are misbehaving.
|
|
||||||
|
|
||||||
Reading from this file will display all supported modes and the currently
|
/sys/power/disk controls the operating mode of hibernation (Suspend-to-Disk).
|
||||||
selected one in brackets, for example
|
Specifically, it tells the kernel what to do after creating a hibernation image.
|
||||||
|
|
||||||
[shutdown] reboot test testproc
|
Reading from it returns a list of supported options encoded as:
|
||||||
|
|
||||||
Writing to this file will accept one of
|
'platform' (put the system into sleep using a platform-provided method)
|
||||||
|
'shutdown' (shut the system down)
|
||||||
|
'reboot' (reboot the system)
|
||||||
|
'suspend' (trigger a Suspend-to-RAM transition)
|
||||||
|
'test_resume' (resume-after-hibernation test mode)
|
||||||
|
|
||||||
'platform' (only if the platform supports it)
|
The currently selected option is printed in square brackets.
|
||||||
'shutdown'
|
|
||||||
'reboot'
|
|
||||||
'testproc'
|
|
||||||
'test'
|
|
||||||
|
|
||||||
/sys/power/image_size controls the size of the image created by
|
The 'platform' option is only available if the platform provides a special
|
||||||
the suspend-to-disk mechanism. It can be written a string
|
mechanism to put the system to sleep after creating a hibernation image (ACPI
|
||||||
representing a non-negative integer that will be used as an upper
|
does that, for example). The 'suspend' option is available if Suspend-to-RAM
|
||||||
limit of the image size, in bytes. The suspend-to-disk mechanism will
|
is supported. Refer to Documentation/power/basic_pm_debugging.txt for the
|
||||||
do its best to ensure the image size will not exceed that number. However,
|
description of the 'test_resume' option.
|
||||||
if this turns out to be impossible, it will try to suspend anyway using the
|
|
||||||
smallest image possible. In particular, if "0" is written to this file, the
|
|
||||||
suspend image will be as small as possible.
|
|
||||||
|
|
||||||
Reading from this file will display the current image size limit, which
|
To select an option, write the string representing it to /sys/power/disk.
|
||||||
is set to 2/5 of available RAM by default.
|
|
||||||
|
|
||||||
/sys/power/pm_trace controls the code which saves the last PM event point in
|
/sys/power/image_size controls the size of hibernation images.
|
||||||
the RTC across reboots, so that you can debug a machine that just hangs
|
|
||||||
during suspend (or more commonly, during resume). Namely, the RTC is only
|
|
||||||
used to save the last PM event point if this file contains '1'. Initially it
|
|
||||||
contains '0' which may be changed to '1' by writing a string representing a
|
|
||||||
nonzero integer into it.
|
|
||||||
|
|
||||||
To use this debugging feature you should attempt to suspend the machine, then
|
It can be written a string representing a non-negative integer that will be
|
||||||
reboot it and run
|
used as a best-effort upper limit of the image size, in bytes. The hibernation
|
||||||
|
core will do its best to ensure that the image size will not exceed that number.
|
||||||
|
However, if that turns out to be impossible to achieve, a hibernation image will
|
||||||
|
still be created and its size will be as small as possible. In particular,
|
||||||
|
writing '0' to this file will enforce hibernation images to be as small as
|
||||||
|
possible.
|
||||||
|
|
||||||
dmesg -s 1000000 | grep 'hash matches'
|
Reading from this file returns the current image size limit, which is set to
|
||||||
|
around 2/5 of available RAM by default.
|
||||||
|
|
||||||
CAUTION: Using it will cause your machine's real-time (CMOS) clock to be
|
/sys/power/pm_trace controls the PM trace mechanism saving the last suspend
|
||||||
set to a random invalid time after a resume.
|
or resume event point in the RTC across reboots.
|
||||||
|
|
||||||
|
It helps to debug hard lockups or reboots due to device driver failures that
|
||||||
|
occur during system suspend or resume (which is more common) more effectively.
|
||||||
|
|
||||||
|
If /sys/power/pm_trace contains '1', the fingerprint of each suspend/resume
|
||||||
|
event point in turn will be stored in the RTC memory (overwriting the actual
|
||||||
|
RTC information), so it will survive a system crash if one occurs right after
|
||||||
|
storing it and it can be used later to identify the driver that caused the crash
|
||||||
|
to happen (see Documentation/power/s2ram.txt for more information).
|
||||||
|
|
||||||
|
Initially it contains '0' which may be changed to '1' by writing a string
|
||||||
|
representing a nonzero integer into it.
|
||||||
|
|
|
@ -167,6 +167,8 @@ signal will be rolled back anyway.
|
||||||
For signals taken in non-TM or suspended mode, we use the
|
For signals taken in non-TM or suspended mode, we use the
|
||||||
normal/non-checkpointed stack pointer.
|
normal/non-checkpointed stack pointer.
|
||||||
|
|
||||||
|
Any transaction initiated inside a sighandler and suspended on return
|
||||||
|
from the sighandler to the kernel will get reclaimed and discarded.
|
||||||
|
|
||||||
Failure cause codes used by kernel
|
Failure cause codes used by kernel
|
||||||
==================================
|
==================================
|
||||||
|
|
|
@ -80,6 +80,10 @@ functionality of their platform when planning to use this driver:
|
||||||
|
|
||||||
III. Module parameters
|
III. Module parameters
|
||||||
|
|
||||||
|
- 'dma_timeout' - DMA transfer completion timeout (in msec, default value 3000).
|
||||||
|
This parameter set a maximum completion wait time for SYNC mode DMA
|
||||||
|
transfer requests and for RIO_WAIT_FOR_ASYNC ioctl requests.
|
||||||
|
|
||||||
- 'dbg_level' - This parameter allows to control amount of debug information
|
- 'dbg_level' - This parameter allows to control amount of debug information
|
||||||
generated by this device driver. This parameter is formed by set of
|
generated by this device driver. This parameter is formed by set of
|
||||||
bit masks that correspond to the specific functional blocks.
|
bit masks that correspond to the specific functional blocks.
|
||||||
|
|
|
@ -42,11 +42,12 @@
|
||||||
caption a.headerlink { opacity: 0; }
|
caption a.headerlink { opacity: 0; }
|
||||||
caption a.headerlink:hover { opacity: 1; }
|
caption a.headerlink:hover { opacity: 1; }
|
||||||
|
|
||||||
/* inline literal: drop the borderbox and red color */
|
/* inline literal: drop the borderbox, padding and red color */
|
||||||
|
|
||||||
code, .rst-content tt, .rst-content code {
|
code, .rst-content tt, .rst-content code {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
border: none;
|
border: none;
|
||||||
|
padding: unset;
|
||||||
background: inherit;
|
background: inherit;
|
||||||
font-size: 85%;
|
font-size: 85%;
|
||||||
}
|
}
|
||||||
|
|
29
MAINTAINERS
29
MAINTAINERS
|
@ -798,6 +798,7 @@ M: Laura Abbott <labbott@redhat.com>
|
||||||
M: Sumit Semwal <sumit.semwal@linaro.org>
|
M: Sumit Semwal <sumit.semwal@linaro.org>
|
||||||
L: devel@driverdev.osuosl.org
|
L: devel@driverdev.osuosl.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: Documentation/devicetree/bindings/staging/ion/
|
||||||
F: drivers/staging/android/ion
|
F: drivers/staging/android/ion
|
||||||
F: drivers/staging/android/uapi/ion.h
|
F: drivers/staging/android/uapi/ion.h
|
||||||
F: drivers/staging/android/uapi/ion_test.h
|
F: drivers/staging/android/uapi/ion_test.h
|
||||||
|
@ -881,6 +882,15 @@ S: Supported
|
||||||
F: drivers/gpu/drm/arc/
|
F: drivers/gpu/drm/arc/
|
||||||
F: Documentation/devicetree/bindings/display/snps,arcpgu.txt
|
F: Documentation/devicetree/bindings/display/snps,arcpgu.txt
|
||||||
|
|
||||||
|
ARM ARCHITECTED TIMER DRIVER
|
||||||
|
M: Mark Rutland <mark.rutland@arm.com>
|
||||||
|
M: Marc Zyngier <marc.zyngier@arm.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/include/asm/arch_timer.h
|
||||||
|
F: arch/arm64/include/asm/arch_timer.h
|
||||||
|
F: drivers/clocksource/arm_arch_timer.c
|
||||||
|
|
||||||
ARM HDLCD DRM DRIVER
|
ARM HDLCD DRM DRIVER
|
||||||
M: Liviu Dudau <liviu.dudau@arm.com>
|
M: Liviu Dudau <liviu.dudau@arm.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -1004,6 +1014,7 @@ N: meson
|
||||||
ARM/Annapurna Labs ALPINE ARCHITECTURE
|
ARM/Annapurna Labs ALPINE ARCHITECTURE
|
||||||
M: Tsahee Zidenberg <tsahee@annapurnalabs.com>
|
M: Tsahee Zidenberg <tsahee@annapurnalabs.com>
|
||||||
M: Antoine Tenart <antoine.tenart@free-electrons.com>
|
M: Antoine Tenart <antoine.tenart@free-electrons.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-alpine/
|
F: arch/arm/mach-alpine/
|
||||||
F: arch/arm/boot/dts/alpine*
|
F: arch/arm/boot/dts/alpine*
|
||||||
|
@ -3237,7 +3248,7 @@ F: kernel/cpuset.c
|
||||||
CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
|
CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
|
||||||
M: Johannes Weiner <hannes@cmpxchg.org>
|
M: Johannes Weiner <hannes@cmpxchg.org>
|
||||||
M: Michal Hocko <mhocko@kernel.org>
|
M: Michal Hocko <mhocko@kernel.org>
|
||||||
M: Vladimir Davydov <vdavydov@virtuozzo.com>
|
M: Vladimir Davydov <vdavydov.dev@gmail.com>
|
||||||
L: cgroups@vger.kernel.org
|
L: cgroups@vger.kernel.org
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4524,6 +4535,12 @@ L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/edac/sb_edac.c
|
F: drivers/edac/sb_edac.c
|
||||||
|
|
||||||
|
EDAC-SKYLAKE
|
||||||
|
M: Tony Luck <tony.luck@intel.com>
|
||||||
|
L: linux-edac@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/edac/skx_edac.c
|
||||||
|
|
||||||
EDAC-XGENE
|
EDAC-XGENE
|
||||||
APPLIED MICRO (APM) X-GENE SOC EDAC
|
APPLIED MICRO (APM) X-GENE SOC EDAC
|
||||||
M: Loc Ho <lho@apm.com>
|
M: Loc Ho <lho@apm.com>
|
||||||
|
@ -7654,7 +7671,7 @@ L: linux-rdma@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://github.com/SoftRoCE/rxe-dev/wiki/rxe-dev:-Home
|
W: https://github.com/SoftRoCE/rxe-dev/wiki/rxe-dev:-Home
|
||||||
Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
||||||
F: drivers/infiniband/hw/rxe/
|
F: drivers/infiniband/sw/rxe/
|
||||||
F: include/uapi/rdma/rdma_user_rxe.h
|
F: include/uapi/rdma/rdma_user_rxe.h
|
||||||
|
|
||||||
MEMBARRIER SUPPORT
|
MEMBARRIER SUPPORT
|
||||||
|
@ -11216,12 +11233,8 @@ S: Odd Fixes
|
||||||
F: drivers/staging/vt665?/
|
F: drivers/staging/vt665?/
|
||||||
|
|
||||||
STAGING - WILC1000 WIFI DRIVER
|
STAGING - WILC1000 WIFI DRIVER
|
||||||
M: Johnny Kim <johnny.kim@atmel.com>
|
M: Aditya Shankar <aditya.shankar@microchip.com>
|
||||||
M: Austin Shin <austin.shin@atmel.com>
|
M: Ganesh Krishna <ganesh.krishna@microchip.com>
|
||||||
M: Chris Park <chris.park@atmel.com>
|
|
||||||
M: Tony Cho <tony.cho@atmel.com>
|
|
||||||
M: Glen Lee <glen.lee@atmel.com>
|
|
||||||
M: Leo Kim <leo.kim@atmel.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/staging/wilc1000/
|
F: drivers/staging/wilc1000/
|
||||||
|
|
9
Makefile
9
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 8
|
PATCHLEVEL = 8
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc5
|
||||||
NAME = Psychotic Stoned Sheep
|
NAME = Psychotic Stoned Sheep
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -635,13 +635,6 @@ endif
|
||||||
# Tell gcc to never replace conditional load with a non-conditional one
|
# Tell gcc to never replace conditional load with a non-conditional one
|
||||||
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
||||||
|
|
||||||
PHONY += gcc-plugins
|
|
||||||
gcc-plugins: scripts_basic
|
|
||||||
ifdef CONFIG_GCC_PLUGINS
|
|
||||||
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
|
||||||
endif
|
|
||||||
@:
|
|
||||||
|
|
||||||
include scripts/Makefile.gcc-plugins
|
include scripts/Makefile.gcc-plugins
|
||||||
|
|
||||||
ifdef CONFIG_READABLE_ASM
|
ifdef CONFIG_READABLE_ASM
|
||||||
|
|
|
@ -461,6 +461,15 @@ config CC_STACKPROTECTOR_STRONG
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config HAVE_ARCH_WITHIN_STACK_FRAMES
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
An architecture should select this if it can walk the kernel stack
|
||||||
|
frames to determine if an object is part of either the arguments
|
||||||
|
or local variables (i.e. that it excludes saved return addresses,
|
||||||
|
and similar) by implementing an inline arch_within_stack_frames(),
|
||||||
|
which is used by CONFIG_HARDENED_USERCOPY.
|
||||||
|
|
||||||
config HAVE_CONTEXT_TRACKING
|
config HAVE_CONTEXT_TRACKING
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -142,7 +142,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_CURR_IN_REG
|
#ifdef CONFIG_ARC_CURR_IN_REG
|
||||||
; Retrieve orig r25 and save it with rest of callee_regs
|
; Retrieve orig r25 and save it with rest of callee_regs
|
||||||
ld.as r12, [r12, PT_user_r25]
|
ld r12, [r12, PT_user_r25]
|
||||||
PUSH r12
|
PUSH r12
|
||||||
#else
|
#else
|
||||||
PUSH r25
|
PUSH r25
|
||||||
|
@ -198,7 +198,7 @@
|
||||||
|
|
||||||
; SP is back to start of pt_regs
|
; SP is back to start of pt_regs
|
||||||
#ifdef CONFIG_ARC_CURR_IN_REG
|
#ifdef CONFIG_ARC_CURR_IN_REG
|
||||||
st.as r12, [sp, PT_user_r25]
|
st r12, [sp, PT_user_r25]
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
|
@ -188,10 +188,10 @@ static inline int arch_irqs_disabled(void)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro IRQ_ENABLE scratch
|
.macro IRQ_ENABLE scratch
|
||||||
|
TRACE_ASM_IRQ_ENABLE
|
||||||
lr \scratch, [status32]
|
lr \scratch, [status32]
|
||||||
or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
|
or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
|
||||||
flag \scratch
|
flag \scratch
|
||||||
TRACE_ASM_IRQ_ENABLE
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
|
@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
|
||||||
|
|
||||||
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||||
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
||||||
#define pfn_pte(pfn, prot) (__pte(((pte_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
|
#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
|
||||||
|
|
||||||
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
||||||
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
||||||
|
|
|
@ -13,8 +13,15 @@
|
||||||
|
|
||||||
/* Machine specific ELF Hdr flags */
|
/* Machine specific ELF Hdr flags */
|
||||||
#define EF_ARC_OSABI_MSK 0x00000f00
|
#define EF_ARC_OSABI_MSK 0x00000f00
|
||||||
#define EF_ARC_OSABI_ORIG 0x00000000 /* MUST be zero for back-compat */
|
|
||||||
#define EF_ARC_OSABI_CURRENT 0x00000300 /* v3 (no legacy syscalls) */
|
#define EF_ARC_OSABI_V3 0x00000300 /* v3 (no legacy syscalls) */
|
||||||
|
#define EF_ARC_OSABI_V4 0x00000400 /* v4 (64bit data any reg align) */
|
||||||
|
|
||||||
|
#if __GNUC__ < 6
|
||||||
|
#define EF_ARC_OSABI_CURRENT EF_ARC_OSABI_V3
|
||||||
|
#else
|
||||||
|
#define EF_ARC_OSABI_CURRENT EF_ARC_OSABI_V4
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef unsigned long elf_greg_t;
|
typedef unsigned long elf_greg_t;
|
||||||
typedef unsigned long elf_fpregset_t;
|
typedef unsigned long elf_fpregset_t;
|
||||||
|
|
|
@ -28,6 +28,7 @@ extern void __muldf3(void);
|
||||||
extern void __divdf3(void);
|
extern void __divdf3(void);
|
||||||
extern void __floatunsidf(void);
|
extern void __floatunsidf(void);
|
||||||
extern void __floatunsisf(void);
|
extern void __floatunsisf(void);
|
||||||
|
extern void __udivdi3(void);
|
||||||
|
|
||||||
EXPORT_SYMBOL(__ashldi3);
|
EXPORT_SYMBOL(__ashldi3);
|
||||||
EXPORT_SYMBOL(__ashrdi3);
|
EXPORT_SYMBOL(__ashrdi3);
|
||||||
|
@ -45,6 +46,7 @@ EXPORT_SYMBOL(__muldf3);
|
||||||
EXPORT_SYMBOL(__divdf3);
|
EXPORT_SYMBOL(__divdf3);
|
||||||
EXPORT_SYMBOL(__floatunsidf);
|
EXPORT_SYMBOL(__floatunsidf);
|
||||||
EXPORT_SYMBOL(__floatunsisf);
|
EXPORT_SYMBOL(__floatunsisf);
|
||||||
|
EXPORT_SYMBOL(__udivdi3);
|
||||||
|
|
||||||
/* ARC optimised assembler routines */
|
/* ARC optimised assembler routines */
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
|
|
|
@ -199,7 +199,7 @@ int elf_check_arch(const struct elf32_hdr *x)
|
||||||
}
|
}
|
||||||
|
|
||||||
eflags = x->e_flags;
|
eflags = x->e_flags;
|
||||||
if ((eflags & EF_ARC_OSABI_MSK) < EF_ARC_OSABI_CURRENT) {
|
if ((eflags & EF_ARC_OSABI_MSK) != EF_ARC_OSABI_CURRENT) {
|
||||||
pr_err("ABI mismatch - you need newer toolchain\n");
|
pr_err("ABI mismatch - you need newer toolchain\n");
|
||||||
force_sigsegv(SIGSEGV, current);
|
force_sigsegv(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -291,8 +291,10 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
cpu->dccm.base_addr, TO_KB(cpu->dccm.sz),
|
cpu->dccm.base_addr, TO_KB(cpu->dccm.sz),
|
||||||
cpu->iccm.base_addr, TO_KB(cpu->iccm.sz));
|
cpu->iccm.base_addr, TO_KB(cpu->iccm.sz));
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n, "OS ABI [v%d]\t: %s\n",
|
||||||
"OS ABI [v3]\t: no-legacy-syscalls\n");
|
EF_ARC_OSABI_CURRENT >> 8,
|
||||||
|
EF_ARC_OSABI_CURRENT == EF_ARC_OSABI_V3 ?
|
||||||
|
"no-legacy-syscalls" : "64-bit data any register aligned");
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -921,6 +921,15 @@ void arc_cache_init(void)
|
||||||
|
|
||||||
printk(arc_cache_mumbojumbo(0, str, sizeof(str)));
|
printk(arc_cache_mumbojumbo(0, str, sizeof(str)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only master CPU needs to execute rest of function:
|
||||||
|
* - Assume SMP so all cores will have same cache config so
|
||||||
|
* any geomtry checks will be same for all
|
||||||
|
* - IOC setup / dma callbacks only need to be setup once
|
||||||
|
*/
|
||||||
|
if (cpu)
|
||||||
|
return;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) {
|
if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) {
|
||||||
struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache;
|
struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache;
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,7 @@ void *kmap(struct page *page)
|
||||||
|
|
||||||
return kmap_high(page);
|
return kmap_high(page);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(kmap);
|
||||||
|
|
||||||
void *kmap_atomic(struct page *page)
|
void *kmap_atomic(struct page *page)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,6 +35,7 @@ config ARM
|
||||||
select HARDIRQS_SW_RESEND
|
select HARDIRQS_SW_RESEND
|
||||||
select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
|
select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
|
||||||
select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
|
select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
|
||||||
|
select HAVE_ARCH_HARDENED_USERCOPY
|
||||||
select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU
|
select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU
|
||||||
select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU
|
select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU
|
||||||
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
||||||
|
|
|
@ -260,12 +260,14 @@ machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
|
||||||
platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y)))
|
platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y)))
|
||||||
|
|
||||||
ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y)
|
ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y)
|
||||||
|
ifneq ($(CONFIG_ARM_SINGLE_ARMV7M),y)
|
||||||
ifeq ($(KBUILD_SRC),)
|
ifeq ($(KBUILD_SRC),)
|
||||||
KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs))
|
KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs))
|
||||||
else
|
else
|
||||||
KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs))
|
KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
export TEXT_OFFSET GZFLAGS MMUEXT
|
export TEXT_OFFSET GZFLAGS MMUEXT
|
||||||
|
|
||||||
|
|
|
@ -70,13 +70,12 @@
|
||||||
* associativity as these may be erroneously set
|
* associativity as these may be erroneously set
|
||||||
* up by boot loader(s).
|
* up by boot loader(s).
|
||||||
*/
|
*/
|
||||||
cache-size = <1048576>; // 1MB
|
cache-size = <131072>; // 128KB
|
||||||
cache-sets = <4096>;
|
cache-sets = <512>;
|
||||||
cache-line-size = <32>;
|
cache-line-size = <32>;
|
||||||
arm,parity-disable;
|
arm,parity-disable;
|
||||||
arm,tag-latency = <1>;
|
arm,tag-latency = <1 1 1>;
|
||||||
arm,data-latency = <1 1>;
|
arm,data-latency = <1 1 1>;
|
||||||
arm,dirty-latency = <1>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
scu: scu@1f000000 {
|
scu: scu@1f000000 {
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
syscon {
|
syscon {
|
||||||
compatible = "arm,integrator-ap-syscon";
|
compatible = "arm,integrator-ap-syscon", "syscon";
|
||||||
reg = <0x11000000 0x100>;
|
reg = <0x11000000 0x100>;
|
||||||
interrupt-parent = <&pic>;
|
interrupt-parent = <&pic>;
|
||||||
/* These are the logical module IRQs */
|
/* These are the logical module IRQs */
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
syscon {
|
syscon {
|
||||||
compatible = "arm,integrator-cp-syscon";
|
compatible = "arm,integrator-cp-syscon", "syscon";
|
||||||
reg = <0xcb000000 0x100>;
|
reg = <0xcb000000 0x100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -70,14 +70,6 @@
|
||||||
cpu_on = <0x84000003>;
|
cpu_on = <0x84000003>;
|
||||||
};
|
};
|
||||||
|
|
||||||
psci {
|
|
||||||
compatible = "arm,psci";
|
|
||||||
method = "smc";
|
|
||||||
cpu_suspend = <0x84000001>;
|
|
||||||
cpu_off = <0x84000002>;
|
|
||||||
cpu_on = <0x84000003>;
|
|
||||||
};
|
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -197,6 +197,8 @@
|
||||||
clock-names = "saradc", "apb_pclk";
|
clock-names = "saradc", "apb_pclk";
|
||||||
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
#io-channel-cells = <1>;
|
#io-channel-cells = <1>;
|
||||||
|
resets = <&cru SRST_SARADC>;
|
||||||
|
reset-names = "saradc-apb";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -279,6 +279,8 @@
|
||||||
#io-channel-cells = <1>;
|
#io-channel-cells = <1>;
|
||||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||||
clock-names = "saradc", "apb_pclk";
|
clock-names = "saradc", "apb_pclk";
|
||||||
|
resets = <&cru SRST_SARADC>;
|
||||||
|
reset-names = "saradc-apb";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -399,6 +399,8 @@
|
||||||
#io-channel-cells = <1>;
|
#io-channel-cells = <1>;
|
||||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||||
clock-names = "saradc", "apb_pclk";
|
clock-names = "saradc", "apb_pclk";
|
||||||
|
resets = <&cru SRST_SARADC>;
|
||||||
|
reset-names = "saradc-apb";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1382,7 +1382,7 @@
|
||||||
* Pin 41: BR_UART1_TXD
|
* Pin 41: BR_UART1_TXD
|
||||||
* Pin 44: BR_UART1_RXD
|
* Pin 44: BR_UART1_RXD
|
||||||
*/
|
*/
|
||||||
serial@70006000 {
|
serial@0,70006000 {
|
||||||
compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart";
|
compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -1394,7 +1394,7 @@
|
||||||
* Pin 71: UART2_CTS_L
|
* Pin 71: UART2_CTS_L
|
||||||
* Pin 74: UART2_RTS_L
|
* Pin 74: UART2_RTS_L
|
||||||
*/
|
*/
|
||||||
serial@70006040 {
|
serial@0,70006040 {
|
||||||
compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart";
|
compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -58,7 +58,7 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
CONFIG_FIRMWARE_MEMMAP=y
|
CONFIG_FIRMWARE_MEMMAP=y
|
||||||
CONFIG_FANOTIFY=y
|
CONFIG_FANOTIFY=y
|
||||||
CONFIG_PRINTK_TIME=1
|
CONFIG_PRINTK_TIME=y
|
||||||
CONFIG_DYNAMIC_DEBUG=y
|
CONFIG_DYNAMIC_DEBUG=y
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_PAGE_POISONING=y
|
CONFIG_PAGE_POISONING=y
|
||||||
|
|
|
@ -59,7 +59,7 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
CONFIG_FIRMWARE_MEMMAP=y
|
CONFIG_FIRMWARE_MEMMAP=y
|
||||||
CONFIG_FANOTIFY=y
|
CONFIG_FANOTIFY=y
|
||||||
CONFIG_PRINTK_TIME=1
|
CONFIG_PRINTK_TIME=y
|
||||||
CONFIG_DYNAMIC_DEBUG=y
|
CONFIG_DYNAMIC_DEBUG=y
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_PAGE_POISONING=y
|
CONFIG_PAGE_POISONING=y
|
||||||
|
|
|
@ -480,7 +480,10 @@ arm_copy_from_user(void *to, const void __user *from, unsigned long n);
|
||||||
static inline unsigned long __must_check
|
static inline unsigned long __must_check
|
||||||
__copy_from_user(void *to, const void __user *from, unsigned long n)
|
__copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
unsigned int __ua_flags;
|
||||||
|
|
||||||
|
check_object_size(to, n, false);
|
||||||
|
__ua_flags = uaccess_save_and_enable();
|
||||||
n = arm_copy_from_user(to, from, n);
|
n = arm_copy_from_user(to, from, n);
|
||||||
uaccess_restore(__ua_flags);
|
uaccess_restore(__ua_flags);
|
||||||
return n;
|
return n;
|
||||||
|
@ -495,11 +498,15 @@ static inline unsigned long __must_check
|
||||||
__copy_to_user(void __user *to, const void *from, unsigned long n)
|
__copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_UACCESS_WITH_MEMCPY
|
#ifndef CONFIG_UACCESS_WITH_MEMCPY
|
||||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
unsigned int __ua_flags;
|
||||||
|
|
||||||
|
check_object_size(from, n, true);
|
||||||
|
__ua_flags = uaccess_save_and_enable();
|
||||||
n = arm_copy_to_user(to, from, n);
|
n = arm_copy_to_user(to, from, n);
|
||||||
uaccess_restore(__ua_flags);
|
uaccess_restore(__ua_flags);
|
||||||
return n;
|
return n;
|
||||||
#else
|
#else
|
||||||
|
check_object_size(from, n, true);
|
||||||
return arm_copy_to_user(to, from, n);
|
return arm_copy_to_user(to, from, n);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,6 +295,7 @@ __und_svc_fault:
|
||||||
bl __und_fault
|
bl __und_fault
|
||||||
|
|
||||||
__und_svc_finish:
|
__und_svc_finish:
|
||||||
|
get_thread_info tsk
|
||||||
ldr r5, [sp, #S_PSR] @ Get SVC cpsr
|
ldr r5, [sp, #S_PSR] @ Get SVC cpsr
|
||||||
svc_exit r5 @ return from exception
|
svc_exit r5 @ return from exception
|
||||||
UNWIND(.fnend )
|
UNWIND(.fnend )
|
||||||
|
|
|
@ -279,8 +279,12 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
|
||||||
mm_segment_t fs;
|
mm_segment_t fs;
|
||||||
long ret, err, i;
|
long ret, err, i;
|
||||||
|
|
||||||
if (maxevents <= 0 || maxevents > (INT_MAX/sizeof(struct epoll_event)))
|
if (maxevents <= 0 ||
|
||||||
|
maxevents > (INT_MAX/sizeof(*kbuf)) ||
|
||||||
|
maxevents > (INT_MAX/sizeof(*events)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (!access_ok(VERIFY_WRITE, events, sizeof(*events) * maxevents))
|
||||||
|
return -EFAULT;
|
||||||
kbuf = kmalloc(sizeof(*kbuf) * maxevents, GFP_KERNEL);
|
kbuf = kmalloc(sizeof(*kbuf) * maxevents, GFP_KERNEL);
|
||||||
if (!kbuf)
|
if (!kbuf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -317,6 +321,8 @@ asmlinkage long sys_oabi_semtimedop(int semid,
|
||||||
|
|
||||||
if (nsops < 1 || nsops > SEMOPM)
|
if (nsops < 1 || nsops > SEMOPM)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (!access_ok(VERIFY_READ, tsops, sizeof(*tsops) * nsops))
|
||||||
|
return -EFAULT;
|
||||||
sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL);
|
sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL);
|
||||||
if (!sops)
|
if (!sops)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -1009,9 +1009,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
|
|
||||||
switch (ioctl) {
|
switch (ioctl) {
|
||||||
case KVM_CREATE_IRQCHIP: {
|
case KVM_CREATE_IRQCHIP: {
|
||||||
|
int ret;
|
||||||
if (!vgic_present)
|
if (!vgic_present)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2);
|
mutex_lock(&kvm->lock);
|
||||||
|
ret = kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2);
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
case KVM_ARM_SET_DEVICE_ADDR: {
|
case KVM_ARM_SET_DEVICE_ADDR: {
|
||||||
struct kvm_arm_device_addr dev_addr;
|
struct kvm_arm_device_addr dev_addr;
|
||||||
|
|
|
@ -1309,7 +1309,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||||
smp_rmb();
|
smp_rmb();
|
||||||
|
|
||||||
pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable);
|
pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable);
|
||||||
if (is_error_pfn(pfn))
|
if (is_error_noslot_pfn(pfn))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (kvm_is_device_pfn(pfn)) {
|
if (kvm_is_device_pfn(pfn)) {
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
menuconfig ARCH_CLPS711X
|
menuconfig ARCH_CLPS711X
|
||||||
bool "Cirrus Logic EP721x/EP731x-based"
|
bool "Cirrus Logic EP721x/EP731x-based"
|
||||||
depends on ARCH_MULTI_V4T
|
depends on ARCH_MULTI_V4T
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
|
||||||
select AUTO_ZRELADDR
|
select AUTO_ZRELADDR
|
||||||
select CLKSRC_OF
|
select CLKSRC_OF
|
||||||
select CLPS711X_TIMER
|
select CLPS711X_TIMER
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
select CPU_ARM720T
|
select CPU_ARM720T
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select GPIOLIB
|
||||||
select MFD_SYSCON
|
select MFD_SYSCON
|
||||||
select OF_IRQ
|
select OF_IRQ
|
||||||
select USE_OF
|
select USE_OF
|
||||||
|
|
|
@ -271,6 +271,12 @@ static int __init imx_gpc_init(struct device_node *node,
|
||||||
for (i = 0; i < IMR_NUM; i++)
|
for (i = 0; i < IMR_NUM; i++)
|
||||||
writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4);
|
writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear the OF_POPULATED flag set in of_irq_init so that
|
||||||
|
* later the GPC power domain driver will not be skipped.
|
||||||
|
*/
|
||||||
|
of_node_clear_flag(node, OF_POPULATED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
IRQCHIP_DECLARE(imx_gpc, "fsl,imx6q-gpc", imx_gpc_init);
|
IRQCHIP_DECLARE(imx_gpc, "fsl,imx6q-gpc", imx_gpc_init);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
|
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/plat-orion/include
|
||||||
-I$(srctree)/arch/arm/plat-orion/include
|
|
||||||
|
|
||||||
AFLAGS_coherency_ll.o := -Wa,-march=armv7-a
|
AFLAGS_coherency_ll.o := -Wa,-march=armv7-a
|
||||||
CFLAGS_pmsu.o := -march=armv7-a
|
CFLAGS_pmsu.o := -march=armv7-a
|
||||||
|
|
|
@ -11,11 +11,13 @@ if ARCH_OXNAS
|
||||||
|
|
||||||
config MACH_OX810SE
|
config MACH_OX810SE
|
||||||
bool "Support OX810SE Based Products"
|
bool "Support OX810SE Based Products"
|
||||||
|
select ARCH_HAS_RESET_CONTROLLER
|
||||||
select COMMON_CLK_OXNAS
|
select COMMON_CLK_OXNAS
|
||||||
select CPU_ARM926T
|
select CPU_ARM926T
|
||||||
select MFD_SYSCON
|
select MFD_SYSCON
|
||||||
select OXNAS_RPS_TIMER
|
select OXNAS_RPS_TIMER
|
||||||
select PINCTRL_OXNAS
|
select PINCTRL_OXNAS
|
||||||
|
select RESET_CONTROLLER
|
||||||
select RESET_OXNAS
|
select RESET_OXNAS
|
||||||
select VERSATILE_FPGA_IRQ
|
select VERSATILE_FPGA_IRQ
|
||||||
help
|
help
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h> /* symbol_get ; symbol_put */
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
|
|
|
@ -83,7 +83,8 @@ static struct resource smc91x_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct smc91x_platdata smc91x_platdata = {
|
static struct smc91x_platdata smc91x_platdata = {
|
||||||
.flags = SMC91X_USE_32BIT | SMC91X_USE_DMA | SMC91X_NOWAIT,
|
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||||
|
SMC91X_USE_DMA | SMC91X_NOWAIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device smc91x_device = {
|
static struct platform_device smc91x_device = {
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h> /* symbol_get ; symbol_put */
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
|
|
|
@ -120,7 +120,8 @@ static struct resource smc91x_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct smc91x_platdata xcep_smc91x_info = {
|
static struct smc91x_platdata xcep_smc91x_info = {
|
||||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
|
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||||
|
SMC91X_NOWAIT | SMC91X_USE_DMA,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device smc91x_device = {
|
static struct platform_device smc91x_device = {
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
#
|
#
|
||||||
# Makefile for the linux kernel.
|
# Makefile for the linux kernel.
|
||||||
#
|
#
|
||||||
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
|
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/plat-versatile/include
|
||||||
-I$(srctree)/arch/arm/plat-versatile/include
|
|
||||||
|
|
||||||
obj-y := core.o
|
obj-y := core.o
|
||||||
obj-$(CONFIG_REALVIEW_DT) += realview-dt.o
|
obj-$(CONFIG_REALVIEW_DT) += realview-dt.o
|
||||||
|
|
|
@ -93,7 +93,8 @@ static struct smsc911x_platform_config smsc911x_config = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct smc91x_platdata smc91x_platdata = {
|
static struct smc91x_platdata smc91x_platdata = {
|
||||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||||
|
SMC91X_NOWAIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device realview_eth_device = {
|
static struct platform_device realview_eth_device = {
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#
|
#
|
||||||
# Licensed under GPLv2
|
# Licensed under GPLv2
|
||||||
|
|
||||||
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/$(src)/include -I$(srctree)/arch/arm/plat-samsung/include
|
ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/arch/arm/plat-samsung/include
|
||||||
|
|
||||||
# Core
|
# Core
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ static struct resource smc91x_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct smc91x_platdata smc91x_platdata = {
|
static struct smc91x_platdata smc91x_platdata = {
|
||||||
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
.flags = SMC91X_USE_16BIT | SMC91X_USE_8BIT | SMC91X_NOWAIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device smc91x_device = {
|
static struct platform_device smc91x_device = {
|
||||||
|
|
|
@ -40,5 +40,8 @@ bool shmobile_smp_cpu_can_disable(unsigned int cpu)
|
||||||
bool __init shmobile_smp_init_fallback_ops(void)
|
bool __init shmobile_smp_init_fallback_ops(void)
|
||||||
{
|
{
|
||||||
/* fallback on PSCI/smp_ops if no other DT based method is detected */
|
/* fallback on PSCI/smp_ops if no other DT based method is detected */
|
||||||
|
if (!IS_ENABLED(CONFIG_SMP))
|
||||||
|
return false;
|
||||||
|
|
||||||
return platform_can_secondary_boot() ? true : false;
|
return platform_can_secondary_boot() ? true : false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -728,7 +728,8 @@ static void *__init late_alloc(unsigned long sz)
|
||||||
{
|
{
|
||||||
void *ptr = (void *)__get_free_pages(PGALLOC_GFP, get_order(sz));
|
void *ptr = (void *)__get_free_pages(PGALLOC_GFP, get_order(sz));
|
||||||
|
|
||||||
BUG_ON(!ptr);
|
if (!ptr || !pgtable_page_ctor(virt_to_page(ptr)))
|
||||||
|
BUG();
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1155,10 +1156,19 @@ void __init sanity_check_meminfo(void)
|
||||||
{
|
{
|
||||||
phys_addr_t memblock_limit = 0;
|
phys_addr_t memblock_limit = 0;
|
||||||
int highmem = 0;
|
int highmem = 0;
|
||||||
phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
|
u64 vmalloc_limit;
|
||||||
struct memblock_region *reg;
|
struct memblock_region *reg;
|
||||||
bool should_use_highmem = false;
|
bool should_use_highmem = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Let's use our own (unoptimized) equivalent of __pa() that is
|
||||||
|
* not affected by wrap-arounds when sizeof(phys_addr_t) == 4.
|
||||||
|
* The result is used as the upper bound on physical memory address
|
||||||
|
* and may itself be outside the valid range for which phys_addr_t
|
||||||
|
* and therefore __pa() is defined.
|
||||||
|
*/
|
||||||
|
vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET;
|
||||||
|
|
||||||
for_each_memblock(memory, reg) {
|
for_each_memblock(memory, reg) {
|
||||||
phys_addr_t block_start = reg->base;
|
phys_addr_t block_start = reg->base;
|
||||||
phys_addr_t block_end = reg->base + reg->size;
|
phys_addr_t block_end = reg->base + reg->size;
|
||||||
|
@ -1183,10 +1193,11 @@ void __init sanity_check_meminfo(void)
|
||||||
if (reg->size > size_limit) {
|
if (reg->size > size_limit) {
|
||||||
phys_addr_t overlap_size = reg->size - size_limit;
|
phys_addr_t overlap_size = reg->size - size_limit;
|
||||||
|
|
||||||
pr_notice("Truncating RAM at %pa-%pa to -%pa",
|
pr_notice("Truncating RAM at %pa-%pa",
|
||||||
&block_start, &block_end, &vmalloc_limit);
|
&block_start, &block_end);
|
||||||
memblock_remove(vmalloc_limit, overlap_size);
|
|
||||||
block_end = vmalloc_limit;
|
block_end = vmalloc_limit;
|
||||||
|
pr_cont(" to -%pa", &block_end);
|
||||||
|
memblock_remove(vmalloc_limit, overlap_size);
|
||||||
should_use_highmem = true;
|
should_use_highmem = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
|
||||||
static struct vcpu_info __percpu *xen_vcpu_info;
|
static struct vcpu_info __percpu *xen_vcpu_info;
|
||||||
|
|
||||||
/* Linux <-> Xen vCPU id mapping */
|
/* Linux <-> Xen vCPU id mapping */
|
||||||
DEFINE_PER_CPU(int, xen_vcpu_id) = -1;
|
DEFINE_PER_CPU(uint32_t, xen_vcpu_id);
|
||||||
EXPORT_PER_CPU_SYMBOL(xen_vcpu_id);
|
EXPORT_PER_CPU_SYMBOL(xen_vcpu_id);
|
||||||
|
|
||||||
/* These are unused until we support booting "pre-ballooned" */
|
/* These are unused until we support booting "pre-ballooned" */
|
||||||
|
|
|
@ -54,6 +54,7 @@ config ARM64
|
||||||
select HAVE_ALIGNED_STRUCT_PAGE if SLUB
|
select HAVE_ALIGNED_STRUCT_PAGE if SLUB
|
||||||
select HAVE_ARCH_AUDITSYSCALL
|
select HAVE_ARCH_AUDITSYSCALL
|
||||||
select HAVE_ARCH_BITREVERSE
|
select HAVE_ARCH_BITREVERSE
|
||||||
|
select HAVE_ARCH_HARDENED_USERCOPY
|
||||||
select HAVE_ARCH_HUGE_VMAP
|
select HAVE_ARCH_HUGE_VMAP
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_KASAN if SPARSEMEM_VMEMMAP && !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
select HAVE_ARCH_KASAN if SPARSEMEM_VMEMMAP && !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
||||||
|
|
|
@ -8,7 +8,7 @@ config ARCH_SUNXI
|
||||||
|
|
||||||
config ARCH_ALPINE
|
config ARCH_ALPINE
|
||||||
bool "Annapurna Labs Alpine platform"
|
bool "Annapurna Labs Alpine platform"
|
||||||
select ALPINE_MSI
|
select ALPINE_MSI if PCI
|
||||||
help
|
help
|
||||||
This enables support for the Annapurna Labs Alpine
|
This enables support for the Annapurna Labs Alpine
|
||||||
Soc family.
|
Soc family.
|
||||||
|
@ -66,7 +66,7 @@ config ARCH_LG1K
|
||||||
config ARCH_HISI
|
config ARCH_HISI
|
||||||
bool "Hisilicon SoC Family"
|
bool "Hisilicon SoC Family"
|
||||||
select ARM_TIMER_SP804
|
select ARM_TIMER_SP804
|
||||||
select HISILICON_IRQ_MBIGEN
|
select HISILICON_IRQ_MBIGEN if PCI
|
||||||
help
|
help
|
||||||
This enables support for Hisilicon ARMv8 SoC family
|
This enables support for Hisilicon ARMv8 SoC family
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "exynos7.dtsi"
|
#include "exynos7.dtsi"
|
||||||
#include <dt-bindings/interrupt-controller/irq.h>
|
#include <dt-bindings/interrupt-controller/irq.h>
|
||||||
|
#include <dt-bindings/clock/samsung,s2mps11.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Samsung Exynos7 Espresso board based on EXYNOS7";
|
model = "Samsung Exynos7 Espresso board based on EXYNOS7";
|
||||||
|
@ -43,6 +44,8 @@
|
||||||
|
|
||||||
&rtc {
|
&rtc {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
clocks = <&clock_ccore PCLK_RTC>, <&s2mps15_osc S2MPS11_CLK_AP>;
|
||||||
|
clock-names = "rtc", "rtc_src";
|
||||||
};
|
};
|
||||||
|
|
||||||
&watchdog {
|
&watchdog {
|
||||||
|
|
|
@ -270,6 +270,8 @@
|
||||||
#io-channel-cells = <1>;
|
#io-channel-cells = <1>;
|
||||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||||
clock-names = "saradc", "apb_pclk";
|
clock-names = "saradc", "apb_pclk";
|
||||||
|
resets = <&cru SRST_SARADC>;
|
||||||
|
reset-names = "saradc-apb";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
|
@ -15,10 +14,14 @@ CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_MEMCG=y
|
CONFIG_MEMCG=y
|
||||||
CONFIG_MEMCG_SWAP=y
|
CONFIG_MEMCG_SWAP=y
|
||||||
|
CONFIG_BLK_CGROUP=y
|
||||||
|
CONFIG_CGROUP_PIDS=y
|
||||||
CONFIG_CGROUP_HUGETLB=y
|
CONFIG_CGROUP_HUGETLB=y
|
||||||
# CONFIG_UTS_NS is not set
|
CONFIG_CPUSETS=y
|
||||||
# CONFIG_IPC_NS is not set
|
CONFIG_CGROUP_DEVICE=y
|
||||||
# CONFIG_NET_NS is not set
|
CONFIG_CGROUP_CPUACCT=y
|
||||||
|
CONFIG_CGROUP_PERF=y
|
||||||
|
CONFIG_USER_NS=y
|
||||||
CONFIG_SCHED_AUTOGROUP=y
|
CONFIG_SCHED_AUTOGROUP=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
|
@ -71,6 +74,7 @@ CONFIG_PREEMPT=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
CONFIG_CMA=y
|
CONFIG_CMA=y
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_XEN=y
|
CONFIG_XEN=y
|
||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
|
@ -84,10 +88,37 @@ CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
CONFIG_IP_PNP_DHCP=y
|
CONFIG_IP_PNP_DHCP=y
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
CONFIG_IP_PNP_BOOTP=y
|
||||||
# CONFIG_IPV6 is not set
|
CONFIG_IPV6=m
|
||||||
|
CONFIG_NETFILTER=y
|
||||||
|
CONFIG_NF_CONNTRACK=m
|
||||||
|
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||||
|
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
|
||||||
|
CONFIG_NF_CONNTRACK_IPV4=m
|
||||||
|
CONFIG_IP_NF_IPTABLES=m
|
||||||
|
CONFIG_IP_NF_FILTER=m
|
||||||
|
CONFIG_IP_NF_TARGET_REJECT=m
|
||||||
|
CONFIG_IP_NF_NAT=m
|
||||||
|
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||||
|
CONFIG_IP_NF_MANGLE=m
|
||||||
|
CONFIG_NF_CONNTRACK_IPV6=m
|
||||||
|
CONFIG_IP6_NF_IPTABLES=m
|
||||||
|
CONFIG_IP6_NF_FILTER=m
|
||||||
|
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||||
|
CONFIG_IP6_NF_MANGLE=m
|
||||||
|
CONFIG_IP6_NF_NAT=m
|
||||||
|
CONFIG_IP6_NF_TARGET_MASQUERADE=m
|
||||||
|
CONFIG_BRIDGE=m
|
||||||
|
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||||
|
CONFIG_VLAN_8021Q=m
|
||||||
|
CONFIG_VLAN_8021Q_GVRP=y
|
||||||
|
CONFIG_VLAN_8021Q_MVRP=y
|
||||||
CONFIG_BPF_JIT=y
|
CONFIG_BPF_JIT=y
|
||||||
CONFIG_CFG80211=m
|
CONFIG_CFG80211=m
|
||||||
CONFIG_MAC80211=m
|
CONFIG_MAC80211=m
|
||||||
|
@ -103,6 +134,7 @@ CONFIG_MTD=y
|
||||||
CONFIG_MTD_M25P80=y
|
CONFIG_MTD_M25P80=y
|
||||||
CONFIG_MTD_SPI_NOR=y
|
CONFIG_MTD_SPI_NOR=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_NBD=m
|
||||||
CONFIG_VIRTIO_BLK=y
|
CONFIG_VIRTIO_BLK=y
|
||||||
CONFIG_SRAM=y
|
CONFIG_SRAM=y
|
||||||
# CONFIG_SCSI_PROC_FS is not set
|
# CONFIG_SCSI_PROC_FS is not set
|
||||||
|
@ -120,7 +152,10 @@ CONFIG_SATA_SIL24=y
|
||||||
CONFIG_PATA_PLATFORM=y
|
CONFIG_PATA_PLATFORM=y
|
||||||
CONFIG_PATA_OF_PLATFORM=y
|
CONFIG_PATA_OF_PLATFORM=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
|
CONFIG_MACVLAN=m
|
||||||
|
CONFIG_MACVTAP=m
|
||||||
CONFIG_TUN=y
|
CONFIG_TUN=y
|
||||||
|
CONFIG_VETH=m
|
||||||
CONFIG_VIRTIO_NET=y
|
CONFIG_VIRTIO_NET=y
|
||||||
CONFIG_AMD_XGBE=y
|
CONFIG_AMD_XGBE=y
|
||||||
CONFIG_NET_XGENE=y
|
CONFIG_NET_XGENE=y
|
||||||
|
@ -350,12 +385,16 @@ CONFIG_EXYNOS_ADC=y
|
||||||
CONFIG_PWM_SAMSUNG=y
|
CONFIG_PWM_SAMSUNG=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
|
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||||
|
CONFIG_BTRFS_FS=m
|
||||||
|
CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||||
CONFIG_FANOTIFY=y
|
CONFIG_FANOTIFY=y
|
||||||
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
|
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
|
||||||
CONFIG_QUOTA=y
|
CONFIG_QUOTA=y
|
||||||
CONFIG_AUTOFS4_FS=y
|
CONFIG_AUTOFS4_FS=y
|
||||||
CONFIG_FUSE_FS=y
|
CONFIG_FUSE_FS=m
|
||||||
CONFIG_CUSE=y
|
CONFIG_CUSE=m
|
||||||
|
CONFIG_OVERLAY_FS=m
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
#define __ARCH_WANT_KPROBES_INSN_SLOT
|
#define __ARCH_WANT_KPROBES_INSN_SLOT
|
||||||
#define MAX_INSN_SIZE 1
|
#define MAX_INSN_SIZE 1
|
||||||
#define MAX_STACK_SIZE 128
|
|
||||||
|
|
||||||
#define flush_insn_slot(p) do { } while (0)
|
#define flush_insn_slot(p) do { } while (0)
|
||||||
#define kretprobe_blacklist_size 0
|
#define kretprobe_blacklist_size 0
|
||||||
|
@ -47,7 +46,6 @@ struct kprobe_ctlblk {
|
||||||
struct prev_kprobe prev_kprobe;
|
struct prev_kprobe prev_kprobe;
|
||||||
struct kprobe_step_ctx ss_ctx;
|
struct kprobe_step_ctx ss_ctx;
|
||||||
struct pt_regs jprobe_saved_regs;
|
struct pt_regs jprobe_saved_regs;
|
||||||
char jprobes_stack[MAX_STACK_SIZE];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void arch_remove_kprobe(struct kprobe *);
|
void arch_remove_kprobe(struct kprobe *);
|
||||||
|
|
|
@ -265,22 +265,25 @@ extern unsigned long __must_check __clear_user(void __user *addr, unsigned long
|
||||||
static inline unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n)
|
static inline unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
kasan_check_write(to, n);
|
kasan_check_write(to, n);
|
||||||
return __arch_copy_from_user(to, from, n);
|
check_object_size(to, n, false);
|
||||||
|
return __arch_copy_from_user(to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n)
|
static inline unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||||
{
|
{
|
||||||
kasan_check_read(from, n);
|
kasan_check_read(from, n);
|
||||||
return __arch_copy_to_user(to, from, n);
|
check_object_size(from, n, true);
|
||||||
|
return __arch_copy_to_user(to, from, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
|
static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||||
{
|
{
|
||||||
kasan_check_write(to, n);
|
kasan_check_write(to, n);
|
||||||
|
|
||||||
if (access_ok(VERIFY_READ, from, n))
|
if (access_ok(VERIFY_READ, from, n)) {
|
||||||
|
check_object_size(to, n, false);
|
||||||
n = __arch_copy_from_user(to, from, n);
|
n = __arch_copy_from_user(to, from, n);
|
||||||
else /* security hole - plug it */
|
} else /* security hole - plug it */
|
||||||
memset(to, 0, n);
|
memset(to, 0, n);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
@ -289,8 +292,10 @@ static inline unsigned long __must_check copy_to_user(void __user *to, const voi
|
||||||
{
|
{
|
||||||
kasan_check_read(from, n);
|
kasan_check_read(from, n);
|
||||||
|
|
||||||
if (access_ok(VERIFY_WRITE, to, n))
|
if (access_ok(VERIFY_WRITE, to, n)) {
|
||||||
|
check_object_size(from, n, true);
|
||||||
n = __arch_copy_to_user(to, from, n);
|
n = __arch_copy_to_user(to, from, n);
|
||||||
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,6 +353,8 @@ el1_sync:
|
||||||
lsr x24, x1, #ESR_ELx_EC_SHIFT // exception class
|
lsr x24, x1, #ESR_ELx_EC_SHIFT // exception class
|
||||||
cmp x24, #ESR_ELx_EC_DABT_CUR // data abort in EL1
|
cmp x24, #ESR_ELx_EC_DABT_CUR // data abort in EL1
|
||||||
b.eq el1_da
|
b.eq el1_da
|
||||||
|
cmp x24, #ESR_ELx_EC_IABT_CUR // instruction abort in EL1
|
||||||
|
b.eq el1_ia
|
||||||
cmp x24, #ESR_ELx_EC_SYS64 // configurable trap
|
cmp x24, #ESR_ELx_EC_SYS64 // configurable trap
|
||||||
b.eq el1_undef
|
b.eq el1_undef
|
||||||
cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception
|
cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception
|
||||||
|
@ -364,6 +366,11 @@ el1_sync:
|
||||||
cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL1
|
cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL1
|
||||||
b.ge el1_dbg
|
b.ge el1_dbg
|
||||||
b el1_inv
|
b el1_inv
|
||||||
|
|
||||||
|
el1_ia:
|
||||||
|
/*
|
||||||
|
* Fall through to the Data abort case
|
||||||
|
*/
|
||||||
el1_da:
|
el1_da:
|
||||||
/*
|
/*
|
||||||
* Data abort handling
|
* Data abort handling
|
||||||
|
|
|
@ -757,6 +757,9 @@ ENTRY(__enable_mmu)
|
||||||
isb
|
isb
|
||||||
bl __create_page_tables // recreate kernel mapping
|
bl __create_page_tables // recreate kernel mapping
|
||||||
|
|
||||||
|
tlbi vmalle1 // Remove any stale TLB entries
|
||||||
|
dsb nsh
|
||||||
|
|
||||||
msr sctlr_el1, x19 // re-enable the MMU
|
msr sctlr_el1, x19 // re-enable the MMU
|
||||||
isb
|
isb
|
||||||
ic iallu // flush instructions fetched
|
ic iallu // flush instructions fetched
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/suspend.h>
|
#include <asm/suspend.h>
|
||||||
|
#include <asm/sysreg.h>
|
||||||
#include <asm/virt.h>
|
#include <asm/virt.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -217,12 +218,22 @@ static int create_safe_exec_page(void *src_start, size_t length,
|
||||||
set_pte(pte, __pte(virt_to_phys((void *)dst) |
|
set_pte(pte, __pte(virt_to_phys((void *)dst) |
|
||||||
pgprot_val(PAGE_KERNEL_EXEC)));
|
pgprot_val(PAGE_KERNEL_EXEC)));
|
||||||
|
|
||||||
/* Load our new page tables */
|
/*
|
||||||
asm volatile("msr ttbr0_el1, %0;"
|
* Load our new page tables. A strict BBM approach requires that we
|
||||||
"isb;"
|
* ensure that TLBs are free of any entries that may overlap with the
|
||||||
"tlbi vmalle1is;"
|
* global mappings we are about to install.
|
||||||
"dsb ish;"
|
*
|
||||||
"isb" : : "r"(virt_to_phys(pgd)));
|
* For a real hibernate/resume cycle TTBR0 currently points to a zero
|
||||||
|
* page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI
|
||||||
|
* runtime services), while for a userspace-driven test_resume cycle it
|
||||||
|
* points to userspace page tables (and we must point it at a zero page
|
||||||
|
* ourselves). Elsewhere we only (un)install the idmap with preemption
|
||||||
|
* disabled, so T0SZ should be as required regardless.
|
||||||
|
*/
|
||||||
|
cpu_set_reserved_ttbr0();
|
||||||
|
local_flush_tlb_all();
|
||||||
|
write_sysreg(virt_to_phys(pgd), ttbr0_el1);
|
||||||
|
isb();
|
||||||
|
|
||||||
*phys_dst_addr = virt_to_phys((void *)dst);
|
*phys_dst_addr = virt_to_phys((void *)dst);
|
||||||
|
|
||||||
|
@ -393,6 +404,38 @@ int swsusp_arch_resume(void)
|
||||||
void __noreturn (*hibernate_exit)(phys_addr_t, phys_addr_t, void *,
|
void __noreturn (*hibernate_exit)(phys_addr_t, phys_addr_t, void *,
|
||||||
void *, phys_addr_t, phys_addr_t);
|
void *, phys_addr_t, phys_addr_t);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restoring the memory image will overwrite the ttbr1 page tables.
|
||||||
|
* Create a second copy of just the linear map, and use this when
|
||||||
|
* restoring.
|
||||||
|
*/
|
||||||
|
tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC);
|
||||||
|
if (!tmp_pg_dir) {
|
||||||
|
pr_err("Failed to allocate memory for temporary page tables.");
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0);
|
||||||
|
if (rc)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since we only copied the linear map, we need to find restore_pblist's
|
||||||
|
* linear map address.
|
||||||
|
*/
|
||||||
|
lm_restore_pblist = LMADDR(restore_pblist);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need a zero page that is zero before & after resume in order to
|
||||||
|
* to break before make on the ttbr1 page tables.
|
||||||
|
*/
|
||||||
|
zero_page = (void *)get_safe_page(GFP_ATOMIC);
|
||||||
|
if (!zero_page) {
|
||||||
|
pr_err("Failed to allocate zero page.");
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Locate the exit code in the bottom-but-one page, so that *NULL
|
* Locate the exit code in the bottom-but-one page, so that *NULL
|
||||||
* still has disastrous affects.
|
* still has disastrous affects.
|
||||||
|
@ -418,27 +461,6 @@ int swsusp_arch_resume(void)
|
||||||
*/
|
*/
|
||||||
__flush_dcache_area(hibernate_exit, exit_size);
|
__flush_dcache_area(hibernate_exit, exit_size);
|
||||||
|
|
||||||
/*
|
|
||||||
* Restoring the memory image will overwrite the ttbr1 page tables.
|
|
||||||
* Create a second copy of just the linear map, and use this when
|
|
||||||
* restoring.
|
|
||||||
*/
|
|
||||||
tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC);
|
|
||||||
if (!tmp_pg_dir) {
|
|
||||||
pr_err("Failed to allocate memory for temporary page tables.");
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0);
|
|
||||||
if (rc)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Since we only copied the linear map, we need to find restore_pblist's
|
|
||||||
* linear map address.
|
|
||||||
*/
|
|
||||||
lm_restore_pblist = LMADDR(restore_pblist);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* KASLR will cause the el2 vectors to be in a different location in
|
* KASLR will cause the el2 vectors to be in a different location in
|
||||||
* the resumed kernel. Load hibernate's temporary copy into el2.
|
* the resumed kernel. Load hibernate's temporary copy into el2.
|
||||||
|
@ -453,12 +475,6 @@ int swsusp_arch_resume(void)
|
||||||
__hyp_set_vectors(el2_vectors);
|
__hyp_set_vectors(el2_vectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We need a zero page that is zero before & after resume in order to
|
|
||||||
* to break before make on the ttbr1 page tables.
|
|
||||||
*/
|
|
||||||
zero_page = (void *)get_safe_page(GFP_ATOMIC);
|
|
||||||
|
|
||||||
hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1,
|
hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1,
|
||||||
resume_hdr.reenter_kernel, lm_restore_pblist,
|
resume_hdr.reenter_kernel, lm_restore_pblist,
|
||||||
resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page));
|
resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page));
|
||||||
|
|
|
@ -41,18 +41,6 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||||
static void __kprobes
|
static void __kprobes
|
||||||
post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *);
|
post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *);
|
||||||
|
|
||||||
static inline unsigned long min_stack_size(unsigned long addr)
|
|
||||||
{
|
|
||||||
unsigned long size;
|
|
||||||
|
|
||||||
if (on_irq_stack(addr, raw_smp_processor_id()))
|
|
||||||
size = IRQ_STACK_PTR(raw_smp_processor_id()) - addr;
|
|
||||||
else
|
|
||||||
size = (unsigned long)current_thread_info() + THREAD_START_SP - addr;
|
|
||||||
|
|
||||||
return min(size, FIELD_SIZEOF(struct kprobe_ctlblk, jprobes_stack));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
|
static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
|
||||||
{
|
{
|
||||||
/* prepare insn slot */
|
/* prepare insn slot */
|
||||||
|
@ -489,20 +477,15 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
long stack_ptr = kernel_stack_pointer(regs);
|
|
||||||
|
|
||||||
kcb->jprobe_saved_regs = *regs;
|
kcb->jprobe_saved_regs = *regs;
|
||||||
/*
|
/*
|
||||||
* As Linus pointed out, gcc assumes that the callee
|
* Since we can't be sure where in the stack frame "stacked"
|
||||||
* owns the argument space and could overwrite it, e.g.
|
* pass-by-value arguments are stored we just don't try to
|
||||||
* tailcall optimization. So, to be absolutely safe
|
* duplicate any of the stack. Do not use jprobes on functions that
|
||||||
* we also save and restore enough stack bytes to cover
|
* use more than 64 bytes (after padding each to an 8 byte boundary)
|
||||||
* the argument area.
|
* of arguments, or pass individual arguments larger than 16 bytes.
|
||||||
*/
|
*/
|
||||||
kasan_disable_current();
|
|
||||||
memcpy(kcb->jprobes_stack, (void *)stack_ptr,
|
|
||||||
min_stack_size(stack_ptr));
|
|
||||||
kasan_enable_current();
|
|
||||||
|
|
||||||
instruction_pointer_set(regs, (unsigned long) jp->entry);
|
instruction_pointer_set(regs, (unsigned long) jp->entry);
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
@ -554,10 +537,6 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
unpause_graph_tracing();
|
unpause_graph_tracing();
|
||||||
*regs = kcb->jprobe_saved_regs;
|
*regs = kcb->jprobe_saved_regs;
|
||||||
kasan_disable_current();
|
|
||||||
memcpy((void *)stack_addr, kcb->jprobes_stack,
|
|
||||||
min_stack_size(stack_addr));
|
|
||||||
kasan_enable_current();
|
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,12 +101,20 @@ ENTRY(cpu_resume)
|
||||||
bl el2_setup // if in EL2 drop to EL1 cleanly
|
bl el2_setup // if in EL2 drop to EL1 cleanly
|
||||||
/* enable the MMU early - so we can access sleep_save_stash by va */
|
/* enable the MMU early - so we can access sleep_save_stash by va */
|
||||||
adr_l lr, __enable_mmu /* __cpu_setup will return here */
|
adr_l lr, __enable_mmu /* __cpu_setup will return here */
|
||||||
ldr x27, =_cpu_resume /* __enable_mmu will branch here */
|
adr_l x27, _resume_switched /* __enable_mmu will branch here */
|
||||||
adrp x25, idmap_pg_dir
|
adrp x25, idmap_pg_dir
|
||||||
adrp x26, swapper_pg_dir
|
adrp x26, swapper_pg_dir
|
||||||
b __cpu_setup
|
b __cpu_setup
|
||||||
ENDPROC(cpu_resume)
|
ENDPROC(cpu_resume)
|
||||||
|
|
||||||
|
.pushsection ".idmap.text", "ax"
|
||||||
|
_resume_switched:
|
||||||
|
ldr x8, =_cpu_resume
|
||||||
|
br x8
|
||||||
|
ENDPROC(_resume_switched)
|
||||||
|
.ltorg
|
||||||
|
.popsection
|
||||||
|
|
||||||
ENTRY(_cpu_resume)
|
ENTRY(_cpu_resume)
|
||||||
mrs x1, mpidr_el1
|
mrs x1, mpidr_el1
|
||||||
adrp x8, mpidr_hash
|
adrp x8, mpidr_hash
|
||||||
|
|
|
@ -661,9 +661,9 @@ void __init smp_init_cpus(void)
|
||||||
acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT,
|
acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT,
|
||||||
acpi_parse_gic_cpu_interface, 0);
|
acpi_parse_gic_cpu_interface, 0);
|
||||||
|
|
||||||
if (cpu_count > NR_CPUS)
|
if (cpu_count > nr_cpu_ids)
|
||||||
pr_warn("no. of cores (%d) greater than configured maximum of %d - clipping\n",
|
pr_warn("Number of cores (%d) exceeds configured maximum of %d - clipping\n",
|
||||||
cpu_count, NR_CPUS);
|
cpu_count, nr_cpu_ids);
|
||||||
|
|
||||||
if (!bootcpu_valid) {
|
if (!bootcpu_valid) {
|
||||||
pr_err("missing boot CPU MPIDR, not enabling secondaries\n");
|
pr_err("missing boot CPU MPIDR, not enabling secondaries\n");
|
||||||
|
@ -677,7 +677,7 @@ void __init smp_init_cpus(void)
|
||||||
* with entries in cpu_logical_map while initializing the cpus.
|
* with entries in cpu_logical_map while initializing the cpus.
|
||||||
* If the cpu set-up fails, invalidate the cpu_logical_map entry.
|
* If the cpu set-up fails, invalidate the cpu_logical_map entry.
|
||||||
*/
|
*/
|
||||||
for (i = 1; i < NR_CPUS; i++) {
|
for (i = 1; i < nr_cpu_ids; i++) {
|
||||||
if (cpu_logical_map(i) != INVALID_HWID) {
|
if (cpu_logical_map(i) != INVALID_HWID) {
|
||||||
if (smp_cpu_setup(i))
|
if (smp_cpu_setup(i))
|
||||||
cpu_logical_map(i) = INVALID_HWID;
|
cpu_logical_map(i) = INVALID_HWID;
|
||||||
|
|
|
@ -256,7 +256,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We must restore the 32-bit state before the sysregs, thanks
|
* We must restore the 32-bit state before the sysregs, thanks
|
||||||
* to Cortex-A57 erratum #852523.
|
* to erratum #852523 (Cortex-A57) or #853709 (Cortex-A72).
|
||||||
*/
|
*/
|
||||||
__sysreg32_restore_state(vcpu);
|
__sysreg32_restore_state(vcpu);
|
||||||
__sysreg_restore_guest_state(guest_ctxt);
|
__sysreg_restore_guest_state(guest_ctxt);
|
||||||
|
|
|
@ -823,14 +823,6 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
||||||
* Architected system registers.
|
* Architected system registers.
|
||||||
* Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
|
* Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
|
||||||
*
|
*
|
||||||
* We could trap ID_DFR0 and tell the guest we don't support performance
|
|
||||||
* monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was
|
|
||||||
* NAKed, so it will read the PMCR anyway.
|
|
||||||
*
|
|
||||||
* Therefore we tell the guest we have 0 counters. Unfortunately, we
|
|
||||||
* must always support PMCCNTR (the cycle counter): we just RAZ/WI for
|
|
||||||
* all PM registers, which doesn't crash the guest kernel at least.
|
|
||||||
*
|
|
||||||
* Debug handling: We do trap most, if not all debug related system
|
* Debug handling: We do trap most, if not all debug related system
|
||||||
* registers. The implementation is good enough to ensure that a guest
|
* registers. The implementation is good enough to ensure that a guest
|
||||||
* can use these with minimal performance degradation. The drawback is
|
* can use these with minimal performance degradation. The drawback is
|
||||||
|
@ -1360,7 +1352,7 @@ static const struct sys_reg_desc cp15_regs[] = {
|
||||||
{ Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },
|
{ Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },
|
||||||
|
|
||||||
/* ICC_SRE */
|
/* ICC_SRE */
|
||||||
{ Op1( 0), CRn(12), CRm(12), Op2( 5), trap_raz_wi },
|
{ Op1( 0), CRn(12), CRm(12), Op2( 5), access_gic_sre },
|
||||||
|
|
||||||
{ Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
|
{ Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
|
||||||
|
|
||||||
|
|
|
@ -242,7 +242,7 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned level,
|
||||||
|
|
||||||
static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)
|
static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)
|
||||||
{
|
{
|
||||||
pte_t *pte = pte_offset_kernel(pmd, 0);
|
pte_t *pte = pte_offset_kernel(pmd, 0UL);
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)
|
||||||
|
|
||||||
static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)
|
static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)
|
||||||
{
|
{
|
||||||
pmd_t *pmd = pmd_offset(pud, 0);
|
pmd_t *pmd = pmd_offset(pud, 0UL);
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)
|
||||||
|
|
||||||
static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start)
|
static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start)
|
||||||
{
|
{
|
||||||
pud_t *pud = pud_offset(pgd, 0);
|
pud_t *pud = pud_offset(pgd, 0UL);
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
|
|
@ -153,6 +153,11 @@ int ptep_set_access_flags(struct vm_area_struct *vma,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool is_el1_instruction_abort(unsigned int esr)
|
||||||
|
{
|
||||||
|
return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_CUR;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The kernel tried to access some page that wasn't present.
|
* The kernel tried to access some page that wasn't present.
|
||||||
*/
|
*/
|
||||||
|
@ -161,8 +166,9 @@ static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr,
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Are we prepared to handle this kernel fault?
|
* Are we prepared to handle this kernel fault?
|
||||||
|
* We are almost certainly not prepared to handle instruction faults.
|
||||||
*/
|
*/
|
||||||
if (fixup_exception(regs))
|
if (!is_el1_instruction_abort(esr) && fixup_exception(regs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -267,7 +273,8 @@ static inline bool is_permission_fault(unsigned int esr)
|
||||||
unsigned int ec = ESR_ELx_EC(esr);
|
unsigned int ec = ESR_ELx_EC(esr);
|
||||||
unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE;
|
unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE;
|
||||||
|
|
||||||
return (ec == ESR_ELx_EC_DABT_CUR && fsc_type == ESR_ELx_FSC_PERM);
|
return (ec == ESR_ELx_EC_DABT_CUR && fsc_type == ESR_ELx_FSC_PERM) ||
|
||||||
|
(ec == ESR_ELx_EC_IABT_CUR && fsc_type == ESR_ELx_FSC_PERM);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_el0_instruction_abort(unsigned int esr)
|
static bool is_el0_instruction_abort(unsigned int esr)
|
||||||
|
@ -312,6 +319,9 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
|
||||||
if (regs->orig_addr_limit == KERNEL_DS)
|
if (regs->orig_addr_limit == KERNEL_DS)
|
||||||
die("Accessing user space memory with fs=KERNEL_DS", regs, esr);
|
die("Accessing user space memory with fs=KERNEL_DS", regs, esr);
|
||||||
|
|
||||||
|
if (is_el1_instruction_abort(esr))
|
||||||
|
die("Attempting to execute userspace memory", regs, esr);
|
||||||
|
|
||||||
if (!search_exception_tables(regs->pc))
|
if (!search_exception_tables(regs->pc))
|
||||||
die("Accessing user space memory outside uaccess.h routines", regs, esr);
|
die("Accessing user space memory outside uaccess.h routines", regs, esr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
||||||
|
#include <asm/acpi.h>
|
||||||
|
|
||||||
struct pglist_data *node_data[MAX_NUMNODES] __read_mostly;
|
struct pglist_data *node_data[MAX_NUMNODES] __read_mostly;
|
||||||
EXPORT_SYMBOL(node_data);
|
EXPORT_SYMBOL(node_data);
|
||||||
nodemask_t numa_nodes_parsed __initdata;
|
nodemask_t numa_nodes_parsed __initdata;
|
||||||
|
|
|
@ -100,7 +100,16 @@ ENTRY(cpu_do_resume)
|
||||||
|
|
||||||
msr tcr_el1, x8
|
msr tcr_el1, x8
|
||||||
msr vbar_el1, x9
|
msr vbar_el1, x9
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __cpu_setup() cleared MDSCR_EL1.MDE and friends, before unmasking
|
||||||
|
* debug exceptions. By restoring MDSCR_EL1 here, we may take a debug
|
||||||
|
* exception. Mask them until local_dbg_restore() in cpu_suspend()
|
||||||
|
* resets them.
|
||||||
|
*/
|
||||||
|
disable_dbg
|
||||||
msr mdscr_el1, x10
|
msr mdscr_el1, x10
|
||||||
|
|
||||||
msr sctlr_el1, x12
|
msr sctlr_el1, x12
|
||||||
/*
|
/*
|
||||||
* Restore oslsr_el1 by writing oslar_el1
|
* Restore oslsr_el1 by writing oslar_el1
|
||||||
|
|
|
@ -146,7 +146,8 @@ static struct platform_device hitachi_fb_device = {
|
||||||
#include <linux/smc91x.h>
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
static struct smc91x_platdata smc91x_info = {
|
static struct smc91x_platdata smc91x_info = {
|
||||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||||
|
SMC91X_NOWAIT,
|
||||||
.leda = RPC_LED_100_10,
|
.leda = RPC_LED_100_10,
|
||||||
.ledb = RPC_LED_TX_RX,
|
.ledb = RPC_LED_TX_RX,
|
||||||
};
|
};
|
||||||
|
|
|
@ -134,7 +134,8 @@ static struct platform_device net2272_bfin_device = {
|
||||||
#include <linux/smc91x.h>
|
#include <linux/smc91x.h>
|
||||||
|
|
||||||
static struct smc91x_platdata smc91x_info = {
|
static struct smc91x_platdata smc91x_info = {
|
||||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||||
|
SMC91X_NOWAIT,
|
||||||
.leda = RPC_LED_100_10,
|
.leda = RPC_LED_100_10,
|
||||||
.ledb = RPC_LED_TX_RX,
|
.ledb = RPC_LED_TX_RX,
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
/* H8/300 internal I/O functions */
|
/* H8/300 internal I/O functions */
|
||||||
|
|
||||||
#define __raw_readb __raw_readb
|
#define __raw_readb __raw_readb
|
||||||
|
|
|
@ -52,6 +52,7 @@ config IA64
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF
|
select ARCH_USE_CMPXCHG_LOCKREF
|
||||||
select HAVE_ARCH_AUDITSYSCALL
|
select HAVE_ARCH_AUDITSYSCALL
|
||||||
|
select HAVE_ARCH_HARDENED_USERCOPY
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
The Itanium Processor Family is Intel's 64-bit successor to
|
The Itanium Processor Family is Intel's 64-bit successor to
|
||||||
|
|
|
@ -241,12 +241,18 @@ extern unsigned long __must_check __copy_user (void __user *to, const void __use
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
__copy_to_user (void __user *to, const void *from, unsigned long count)
|
__copy_to_user (void __user *to, const void *from, unsigned long count)
|
||||||
{
|
{
|
||||||
|
if (!__builtin_constant_p(count))
|
||||||
|
check_object_size(from, count, true);
|
||||||
|
|
||||||
return __copy_user(to, (__force void __user *) from, count);
|
return __copy_user(to, (__force void __user *) from, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
__copy_from_user (void *to, const void __user *from, unsigned long count)
|
__copy_from_user (void *to, const void __user *from, unsigned long count)
|
||||||
{
|
{
|
||||||
|
if (!__builtin_constant_p(count))
|
||||||
|
check_object_size(to, count, false);
|
||||||
|
|
||||||
return __copy_user((__force void __user *) to, from, count);
|
return __copy_user((__force void __user *) to, from, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,8 +264,11 @@ __copy_from_user (void *to, const void __user *from, unsigned long count)
|
||||||
const void *__cu_from = (from); \
|
const void *__cu_from = (from); \
|
||||||
long __cu_len = (n); \
|
long __cu_len = (n); \
|
||||||
\
|
\
|
||||||
if (__access_ok(__cu_to, __cu_len, get_fs())) \
|
if (__access_ok(__cu_to, __cu_len, get_fs())) { \
|
||||||
__cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \
|
if (!__builtin_constant_p(n)) \
|
||||||
|
check_object_size(__cu_from, __cu_len, true); \
|
||||||
|
__cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \
|
||||||
|
} \
|
||||||
__cu_len; \
|
__cu_len; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -270,8 +279,11 @@ __copy_from_user (void *to, const void __user *from, unsigned long count)
|
||||||
long __cu_len = (n); \
|
long __cu_len = (n); \
|
||||||
\
|
\
|
||||||
__chk_user_ptr(__cu_from); \
|
__chk_user_ptr(__cu_from); \
|
||||||
if (__access_ok(__cu_from, __cu_len, get_fs())) \
|
if (__access_ok(__cu_from, __cu_len, get_fs())) { \
|
||||||
|
if (!__builtin_constant_p(n)) \
|
||||||
|
check_object_size(__cu_to, __cu_len, false); \
|
||||||
__cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \
|
__cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \
|
||||||
|
} \
|
||||||
__cu_len; \
|
__cu_len; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,6 @@ static inline int frame_extra_sizes(int f)
|
||||||
|
|
||||||
static inline void adjustformat(struct pt_regs *regs)
|
static inline void adjustformat(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
((struct switch_stack *)regs - 1)->a5 = current->mm->start_data;
|
|
||||||
/*
|
/*
|
||||||
* set format byte to make stack appear modulo 4, which it will
|
* set format byte to make stack appear modulo 4, which it will
|
||||||
* be when doing the rte
|
* be when doing the rte
|
||||||
|
|
|
@ -390,7 +390,6 @@ void __init mem_init(void)
|
||||||
|
|
||||||
free_all_bootmem();
|
free_all_bootmem();
|
||||||
mem_init_print_info(NULL);
|
mem_init_print_info(NULL);
|
||||||
show_mem(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_initmem(void)
|
void free_initmem(void)
|
||||||
|
|
|
@ -164,7 +164,7 @@ typedef struct { unsigned long pgprot; } pgprot_t;
|
||||||
*/
|
*/
|
||||||
static inline unsigned long ___pa(unsigned long x)
|
static inline unsigned long ___pa(unsigned long x)
|
||||||
{
|
{
|
||||||
if (config_enabled(CONFIG_64BIT)) {
|
if (IS_ENABLED(CONFIG_64BIT)) {
|
||||||
/*
|
/*
|
||||||
* For MIPS64 the virtual address may either be in one of
|
* For MIPS64 the virtual address may either be in one of
|
||||||
* the compatibility segements ckseg0 or ckseg1, or it may
|
* the compatibility segements ckseg0 or ckseg1, or it may
|
||||||
|
@ -173,7 +173,7 @@ static inline unsigned long ___pa(unsigned long x)
|
||||||
return x < CKSEG0 ? XPHYSADDR(x) : CPHYSADDR(x);
|
return x < CKSEG0 ? XPHYSADDR(x) : CPHYSADDR(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config_enabled(CONFIG_EVA)) {
|
if (!IS_ENABLED(CONFIG_EVA)) {
|
||||||
/*
|
/*
|
||||||
* We're using the standard MIPS32 legacy memory map, ie.
|
* We're using the standard MIPS32 legacy memory map, ie.
|
||||||
* the address x is going to be in kseg0 or kseg1. We can
|
* the address x is going to be in kseg0 or kseg1. We can
|
||||||
|
|
|
@ -1642,8 +1642,14 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst,
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) {
|
if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) {
|
||||||
if (kvm_mips_host_tlb_lookup(vcpu, va) < 0)
|
if (kvm_mips_host_tlb_lookup(vcpu, va) < 0 &&
|
||||||
kvm_mips_handle_kseg0_tlb_fault(va, vcpu);
|
kvm_mips_handle_kseg0_tlb_fault(va, vcpu)) {
|
||||||
|
kvm_err("%s: handling mapped kseg0 tlb fault for %lx, vcpu: %p, ASID: %#lx\n",
|
||||||
|
__func__, va, vcpu, read_c0_entryhi());
|
||||||
|
er = EMULATE_FAIL;
|
||||||
|
preempt_enable();
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
} else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) ||
|
} else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) ||
|
||||||
KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) {
|
KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) {
|
||||||
int index;
|
int index;
|
||||||
|
@ -1680,12 +1686,18 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst,
|
||||||
run, vcpu);
|
run, vcpu);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
goto dont_update_pc;
|
goto dont_update_pc;
|
||||||
} else {
|
}
|
||||||
/*
|
/*
|
||||||
* We fault an entry from the guest tlb to the
|
* We fault an entry from the guest tlb to the
|
||||||
* shadow host TLB
|
* shadow host TLB
|
||||||
*/
|
*/
|
||||||
kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb);
|
if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) {
|
||||||
|
kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n",
|
||||||
|
__func__, va, index, vcpu,
|
||||||
|
read_c0_entryhi());
|
||||||
|
er = EMULATE_FAIL;
|
||||||
|
preempt_enable();
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2659,7 +2671,12 @@ enum emulation_result kvm_mips_handle_tlbmiss(u32 cause,
|
||||||
* OK we have a Guest TLB entry, now inject it into the
|
* OK we have a Guest TLB entry, now inject it into the
|
||||||
* shadow host TLB
|
* shadow host TLB
|
||||||
*/
|
*/
|
||||||
kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb);
|
if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) {
|
||||||
|
kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n",
|
||||||
|
__func__, va, index, vcpu,
|
||||||
|
read_c0_entryhi());
|
||||||
|
er = EMULATE_FAIL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ static int kvm_mips_map_page(struct kvm *kvm, gfn_t gfn)
|
||||||
srcu_idx = srcu_read_lock(&kvm->srcu);
|
srcu_idx = srcu_read_lock(&kvm->srcu);
|
||||||
pfn = gfn_to_pfn(kvm, gfn);
|
pfn = gfn_to_pfn(kvm, gfn);
|
||||||
|
|
||||||
if (is_error_pfn(pfn)) {
|
if (is_error_noslot_pfn(pfn)) {
|
||||||
kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn);
|
kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn);
|
||||||
err = -EFAULT;
|
err = -EFAULT;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -99,7 +99,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
|
||||||
}
|
}
|
||||||
|
|
||||||
gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT);
|
gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT);
|
||||||
if (gfn >= kvm->arch.guest_pmap_npages) {
|
if ((gfn | 1) >= kvm->arch.guest_pmap_npages) {
|
||||||
kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__,
|
kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__,
|
||||||
gfn, badvaddr);
|
gfn, badvaddr);
|
||||||
kvm_mips_dump_host_tlbs();
|
kvm_mips_dump_host_tlbs();
|
||||||
|
@ -138,35 +138,49 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu,
|
||||||
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
|
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
|
||||||
struct kvm *kvm = vcpu->kvm;
|
struct kvm *kvm = vcpu->kvm;
|
||||||
kvm_pfn_t pfn0, pfn1;
|
kvm_pfn_t pfn0, pfn1;
|
||||||
|
gfn_t gfn0, gfn1;
|
||||||
|
long tlb_lo[2];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((tlb->tlb_hi & VPN2_MASK) == 0) {
|
tlb_lo[0] = tlb->tlb_lo[0];
|
||||||
pfn0 = 0;
|
tlb_lo[1] = tlb->tlb_lo[1];
|
||||||
pfn1 = 0;
|
|
||||||
} else {
|
|
||||||
if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo[0])
|
|
||||||
>> PAGE_SHIFT) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo[1])
|
/*
|
||||||
>> PAGE_SHIFT) < 0)
|
* The commpage address must not be mapped to anything else if the guest
|
||||||
return -1;
|
* TLB contains entries nearby, or commpage accesses will break.
|
||||||
|
*/
|
||||||
|
if (!((tlb->tlb_hi ^ KVM_GUEST_COMMPAGE_ADDR) &
|
||||||
|
VPN2_MASK & (PAGE_MASK << 1)))
|
||||||
|
tlb_lo[(KVM_GUEST_COMMPAGE_ADDR >> PAGE_SHIFT) & 1] = 0;
|
||||||
|
|
||||||
pfn0 = kvm->arch.guest_pmap[
|
gfn0 = mips3_tlbpfn_to_paddr(tlb_lo[0]) >> PAGE_SHIFT;
|
||||||
mips3_tlbpfn_to_paddr(tlb->tlb_lo[0]) >> PAGE_SHIFT];
|
gfn1 = mips3_tlbpfn_to_paddr(tlb_lo[1]) >> PAGE_SHIFT;
|
||||||
pfn1 = kvm->arch.guest_pmap[
|
if (gfn0 >= kvm->arch.guest_pmap_npages ||
|
||||||
mips3_tlbpfn_to_paddr(tlb->tlb_lo[1]) >> PAGE_SHIFT];
|
gfn1 >= kvm->arch.guest_pmap_npages) {
|
||||||
|
kvm_err("%s: Invalid gfn: [%#llx, %#llx], EHi: %#lx\n",
|
||||||
|
__func__, gfn0, gfn1, tlb->tlb_hi);
|
||||||
|
kvm_mips_dump_guest_tlbs(vcpu);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kvm_mips_map_page(kvm, gfn0) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (kvm_mips_map_page(kvm, gfn1) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
pfn0 = kvm->arch.guest_pmap[gfn0];
|
||||||
|
pfn1 = kvm->arch.guest_pmap[gfn1];
|
||||||
|
|
||||||
/* Get attributes from the Guest TLB */
|
/* Get attributes from the Guest TLB */
|
||||||
entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) |
|
entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) |
|
||||||
((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
|
((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
|
||||||
(tlb->tlb_lo[0] & ENTRYLO_D) |
|
(tlb_lo[0] & ENTRYLO_D) |
|
||||||
(tlb->tlb_lo[0] & ENTRYLO_V);
|
(tlb_lo[0] & ENTRYLO_V);
|
||||||
entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) |
|
entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) |
|
||||||
((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
|
((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
|
||||||
(tlb->tlb_lo[1] & ENTRYLO_D) |
|
(tlb_lo[1] & ENTRYLO_D) |
|
||||||
(tlb->tlb_lo[1] & ENTRYLO_V);
|
(tlb_lo[1] & ENTRYLO_V);
|
||||||
|
|
||||||
kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc,
|
kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc,
|
||||||
tlb->tlb_lo[0], tlb->tlb_lo[1]);
|
tlb->tlb_lo[0], tlb->tlb_lo[1]);
|
||||||
|
@ -354,9 +368,15 @@ u32 kvm_get_inst(u32 *opc, struct kvm_vcpu *vcpu)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
return KVM_INVALID_INST;
|
return KVM_INVALID_INST;
|
||||||
}
|
}
|
||||||
kvm_mips_handle_mapped_seg_tlb_fault(vcpu,
|
if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu,
|
||||||
&vcpu->arch.
|
&vcpu->arch.guest_tlb[index])) {
|
||||||
guest_tlb[index]);
|
kvm_err("%s: handling mapped seg tlb fault failed for %p, index: %u, vcpu: %p, ASID: %#lx\n",
|
||||||
|
__func__, opc, index, vcpu,
|
||||||
|
read_c0_entryhi());
|
||||||
|
kvm_mips_dump_guest_tlbs(vcpu);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
return KVM_INVALID_INST;
|
||||||
|
}
|
||||||
inst = *(opc);
|
inst = *(opc);
|
||||||
}
|
}
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
config PARISC
|
config PARISC
|
||||||
def_bool y
|
def_bool y
|
||||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
|
||||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select HAVE_OPROFILE
|
select HAVE_OPROFILE
|
||||||
|
|
|
@ -245,7 +245,6 @@ CONFIG_DEBUG_RT_MUTEXES=y
|
||||||
CONFIG_PROVE_RCU_DELAY=y
|
CONFIG_PROVE_RCU_DELAY=y
|
||||||
CONFIG_DEBUG_BLOCK_EXT_DEVT=y
|
CONFIG_DEBUG_BLOCK_EXT_DEVT=y
|
||||||
CONFIG_LATENCYTOP=y
|
CONFIG_LATENCYTOP=y
|
||||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
|
||||||
CONFIG_KEYS=y
|
CONFIG_KEYS=y
|
||||||
# CONFIG_CRYPTO_HW is not set
|
# CONFIG_CRYPTO_HW is not set
|
||||||
CONFIG_FONTS=y
|
CONFIG_FONTS=y
|
||||||
|
|
|
@ -291,7 +291,6 @@ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
|
||||||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
|
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
CONFIG_TIMER_STATS=y
|
CONFIG_TIMER_STATS=y
|
||||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
|
||||||
CONFIG_CRYPTO_MANAGER=y
|
CONFIG_CRYPTO_MANAGER=y
|
||||||
CONFIG_CRYPTO_ECB=m
|
CONFIG_CRYPTO_ECB=m
|
||||||
CONFIG_CRYPTO_PCBC=m
|
CONFIG_CRYPTO_PCBC=m
|
||||||
|
|
|
@ -208,13 +208,13 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo
|
||||||
#define __copy_to_user_inatomic __copy_to_user
|
#define __copy_to_user_inatomic __copy_to_user
|
||||||
#define __copy_from_user_inatomic __copy_from_user
|
#define __copy_from_user_inatomic __copy_from_user
|
||||||
|
|
||||||
extern void copy_from_user_overflow(void)
|
extern void __compiletime_error("usercopy buffer size is too small")
|
||||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
__bad_copy_user(void);
|
||||||
__compiletime_error("copy_from_user() buffer size is not provably correct")
|
|
||||||
#else
|
static inline void copy_user_overflow(int size, unsigned long count)
|
||||||
__compiletime_warning("copy_from_user() buffer size is not provably correct")
|
{
|
||||||
#endif
|
WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
||||||
;
|
}
|
||||||
|
|
||||||
static inline unsigned long __must_check copy_from_user(void *to,
|
static inline unsigned long __must_check copy_from_user(void *to,
|
||||||
const void __user *from,
|
const void __user *from,
|
||||||
|
@ -223,10 +223,12 @@ static inline unsigned long __must_check copy_from_user(void *to,
|
||||||
int sz = __compiletime_object_size(to);
|
int sz = __compiletime_object_size(to);
|
||||||
int ret = -EFAULT;
|
int ret = -EFAULT;
|
||||||
|
|
||||||
if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n))
|
if (likely(sz == -1 || sz >= n))
|
||||||
ret = __copy_from_user(to, from, n);
|
ret = __copy_from_user(to, from, n);
|
||||||
else
|
else if (!__builtin_constant_p(n))
|
||||||
copy_from_user_overflow();
|
copy_user_overflow(sz, n);
|
||||||
|
else
|
||||||
|
__bad_copy_user();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,10 +97,10 @@
|
||||||
#define ENOTCONN 235 /* Transport endpoint is not connected */
|
#define ENOTCONN 235 /* Transport endpoint is not connected */
|
||||||
#define ESHUTDOWN 236 /* Cannot send after transport endpoint shutdown */
|
#define ESHUTDOWN 236 /* Cannot send after transport endpoint shutdown */
|
||||||
#define ETOOMANYREFS 237 /* Too many references: cannot splice */
|
#define ETOOMANYREFS 237 /* Too many references: cannot splice */
|
||||||
#define EREFUSED ECONNREFUSED /* for HP's NFS apparently */
|
|
||||||
#define ETIMEDOUT 238 /* Connection timed out */
|
#define ETIMEDOUT 238 /* Connection timed out */
|
||||||
#define ECONNREFUSED 239 /* Connection refused */
|
#define ECONNREFUSED 239 /* Connection refused */
|
||||||
#define EREMOTERELEASE 240 /* Remote peer released connection */
|
#define EREFUSED ECONNREFUSED /* for HP's NFS apparently */
|
||||||
|
#define EREMOTERELEASE 240 /* Remote peer released connection */
|
||||||
#define EHOSTDOWN 241 /* Host is down */
|
#define EHOSTDOWN 241 /* Host is down */
|
||||||
#define EHOSTUNREACH 242 /* No route to host */
|
#define EHOSTUNREACH 242 /* No route to host */
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue