mirror of
https://github.com/torvalds/linux.git
synced 2024-12-15 07:33:56 +00:00
Linux 4.20-rc1
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAlvfgtseHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGiacH+gKDjnfXOVZsmb9A xDaQGx3EIb1FrKgE+rImbZb1uVCJ3WnHm5mQObazwzGDn4xyOoD5EGlMRLV53AiA 1+ctCnV0C93PP75EGdQQFYtKR230CrThoJR6UG7Lc9yrp04npkV35OcZvqxMVBfx sxodhW2sZpGelsYbTAWdf/Iwl/uBO50CgbnXFqP3wf6HSWHsMZdmX/ZPcEFJnFB8 DWX4Yqkz/+rmN1jfsaileDGSc/YfryIrZP9w+nhjSWtiyX5PScpIi/X2ff36S3PX ilvWdaXRlRqJahZQZjC92VOMIkhfe/NFWT8H/xDXuf03B5CZY+PGwz3Idxj1gooB hz+BJww= =1FEH -----END PGP SIGNATURE----- Merge tag 'v4.20-rc1' into patchwork Linux 4.20-rc1 * tag 'v4.20-rc1': (836 commits) Linux 4.20-rc1 sched/topology: Fix off by one bug memory_hotplug: cond_resched in __remove_pages bfs: add sanity check at bfs_fill_super() kernel/sysctl.c: remove duplicated include kernel/kexec_file.c: remove some duplicated includes mm, thp: consolidate THP gfp handling into alloc_hugepage_direct_gfpmask ocfs2: fix clusters leak in ocfs2_defrag_extent() ocfs2: dlmglue: clean up timestamp handling ocfs2: don't put and assigning null to bh allocated outside ocfs2: fix a misuse a of brelse after failing ocfs2_check_dir_entry ocfs2: don't use iocb when EIOCBQUEUED returns ocfs2: without quota support, avoid calling quota recovery ocfs2: remove ocfs2_is_o2cb_active() mm: thp: relax __GFP_THISNODE for MADV_HUGEPAGE mappings include/linux/notifier.h: SRCU: fix ctags mm: handle no memcg case in memcg_kmem_charge() properly ARM: dts: stm32: update HASH1 dmas property on stm32mp157c ARM: orion: avoid VLA in orion_mpp_conf iov_iter: Fix 9p virtio breakage ...
This commit is contained in:
commit
215237a5e4
35
Documentation/ABI/testing/sysfs-platform-lg-laptop
Normal file
35
Documentation/ABI/testing/sysfs-platform-lg-laptop
Normal file
@ -0,0 +1,35 @@
|
||||
What: /sys/devices/platform/lg-laptop/reader_mode
|
||||
Date: October 2018
|
||||
KernelVersion: 4.20
|
||||
Contact: "Matan Ziv-Av <matan@svgalib.org>
|
||||
Description:
|
||||
Control reader mode. 1 means on, 0 means off.
|
||||
|
||||
What: /sys/devices/platform/lg-laptop/fn_lock
|
||||
Date: October 2018
|
||||
KernelVersion: 4.20
|
||||
Contact: "Matan Ziv-Av <matan@svgalib.org>
|
||||
Description:
|
||||
Control FN lock mode. 1 means on, 0 means off.
|
||||
|
||||
What: /sys/devices/platform/lg-laptop/battery_care_limit
|
||||
Date: October 2018
|
||||
KernelVersion: 4.20
|
||||
Contact: "Matan Ziv-Av <matan@svgalib.org>
|
||||
Description:
|
||||
Maximal battery charge level. Accepted values are 80 or 100.
|
||||
|
||||
What: /sys/devices/platform/lg-laptop/fan_mode
|
||||
Date: October 2018
|
||||
KernelVersion: 4.20
|
||||
Contact: "Matan Ziv-Av <matan@svgalib.org>
|
||||
Description:
|
||||
Control fan mode. 1 for performance mode, 0 for silent mode.
|
||||
|
||||
What: /sys/devices/platform/lg-laptop/usb_charge
|
||||
Date: October 2018
|
||||
KernelVersion: 4.20
|
||||
Contact: "Matan Ziv-Av <matan@svgalib.org>
|
||||
Description:
|
||||
Control USB port charging when device is turned off.
|
||||
1 means on, 0 means off.
|
@ -1879,10 +1879,8 @@ following two functions.
|
||||
|
||||
wbc_init_bio(@wbc, @bio)
|
||||
Should be called for each bio carrying writeback data and
|
||||
associates the bio with the inode's owner cgroup and the
|
||||
corresponding request queue. This must be called after
|
||||
a queue (device) has been associated with the bio and
|
||||
before submission.
|
||||
associates the bio with the inode's owner cgroup. Can be
|
||||
called anytime between bio allocation and submission.
|
||||
|
||||
wbc_account_io(@wbc, @page, @bytes)
|
||||
Should be called for each data segment being written out.
|
||||
@ -1901,7 +1899,7 @@ the configuration, the bio may be executed at a lower priority and if
|
||||
the writeback session is holding shared resources, e.g. a journal
|
||||
entry, may lead to priority inversion. There is no one easy solution
|
||||
for the problem. Filesystems can try to work around specific problem
|
||||
cases by skipping wbc_init_bio() or using bio_associate_create_blkg()
|
||||
cases by skipping wbc_init_bio() or using bio_associate_blkcg()
|
||||
directly.
|
||||
|
||||
|
||||
|
@ -1068,7 +1068,7 @@
|
||||
earlyprintk=serial[,0x...[,baudrate]]
|
||||
earlyprintk=ttySn[,baudrate]
|
||||
earlyprintk=dbgp[debugController#]
|
||||
earlyprintk=pciserial,bus:device.function[,baudrate]
|
||||
earlyprintk=pciserial[,force],bus:device.function[,baudrate]
|
||||
earlyprintk=xdbc[xhciController#]
|
||||
|
||||
earlyprintk is useful when the kernel crashes before
|
||||
@ -1100,6 +1100,10 @@
|
||||
|
||||
The sclp output can only be used on s390.
|
||||
|
||||
The optional "force" to "pciserial" enables use of a
|
||||
PCI device even when its classcode is not of the
|
||||
UART class.
|
||||
|
||||
edac_report= [HW,EDAC] Control how to report EDAC event
|
||||
Format: {"on" | "off" | "force"}
|
||||
on: enable EDAC to report H/W event. May be overridden
|
||||
|
@ -183,6 +183,10 @@ and looks like the following:
|
||||
|
||||
void (*describe)(const struct key *key, struct seq_file *m);
|
||||
void (*destroy)(void *payload);
|
||||
int (*query)(const struct kernel_pkey_params *params,
|
||||
struct kernel_pkey_query *info);
|
||||
int (*eds_op)(struct kernel_pkey_params *params,
|
||||
const void *in, void *out);
|
||||
int (*verify_signature)(const struct key *key,
|
||||
const struct public_key_signature *sig);
|
||||
};
|
||||
@ -207,12 +211,22 @@ There are a number of operations defined by the subtype:
|
||||
asymmetric key will look after freeing the fingerprint and releasing the
|
||||
reference on the subtype module.
|
||||
|
||||
(3) verify_signature().
|
||||
(3) query().
|
||||
|
||||
Optional. These are the entry points for the key usage operations.
|
||||
Currently there is only the one defined. If not set, the caller will be
|
||||
given -ENOTSUPP. The subtype may do anything it likes to implement an
|
||||
operation, including offloading to hardware.
|
||||
Mandatory. This is a function for querying the capabilities of a key.
|
||||
|
||||
(4) eds_op().
|
||||
|
||||
Optional. This is the entry point for the encryption, decryption and
|
||||
signature creation operations (which are distinguished by the operation ID
|
||||
in the parameter struct). The subtype may do anything it likes to
|
||||
implement an operation, including offloading to hardware.
|
||||
|
||||
(5) verify_signature().
|
||||
|
||||
Optional. This is the entry point for signature verification. The
|
||||
subtype may do anything it likes to implement an operation, including
|
||||
offloading to hardware.
|
||||
|
||||
|
||||
==========================
|
||||
@ -234,6 +248,8 @@ Examples of blob formats for which parsers could be implemented include:
|
||||
- X.509 ASN.1 stream.
|
||||
- Pointer to TPM key.
|
||||
- Pointer to UEFI key.
|
||||
- PKCS#8 private key [RFC 5208].
|
||||
- PKCS#5 encrypted private key [RFC 2898].
|
||||
|
||||
During key instantiation each parser in the list is tried until one doesn't
|
||||
return -EBADMSG.
|
||||
|
@ -59,9 +59,11 @@ mhz values (normalized w.r.t. the highest value found while parsing the DT).
|
||||
===========================================
|
||||
|
||||
Example 1 (ARM 64-bit, 6-cpu system, two clusters):
|
||||
capacities-dmips-mhz are scaled w.r.t. 1024 (cpu@0 and cpu@1)
|
||||
supposing cluster0@max-freq=1100 and custer1@max-freq=850,
|
||||
final capacities are 1024 for cluster0 and 446 for cluster1
|
||||
The capacities-dmips-mhz or DMIPS/MHz values (scaled to 1024)
|
||||
are 1024 and 578 for cluster0 and cluster1. Further normalization
|
||||
is done by the operating system based on cluster0@max-freq=1100 and
|
||||
custer1@max-freq=850, final capacities are 1024 for cluster0 and
|
||||
446 for cluster1 (576*850/1100).
|
||||
|
||||
cpus {
|
||||
#address-cells = <2>;
|
||||
|
@ -21,10 +21,29 @@ PROPERTIES
|
||||
the register region. An optional second element specifies
|
||||
the base address and size of the alias register region.
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: reference to the pll parents.
|
||||
|
||||
- clock-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "pll8_vote", "pxo".
|
||||
|
||||
- clock-output-names:
|
||||
Usage: optional
|
||||
Value type: <string>
|
||||
Definition: Name of the output clock. Typically acpuX_aux where X is a
|
||||
CPU number starting at 0.
|
||||
|
||||
Example:
|
||||
|
||||
clock-controller@2088000 {
|
||||
compatible = "qcom,kpss-acc-v2";
|
||||
reg = <0x02088000 0x1000>,
|
||||
<0x02008000 0x1000>;
|
||||
clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
|
||||
clock-names = "pll8_vote", "pxo";
|
||||
clock-output-names = "acpu0_aux";
|
||||
};
|
||||
|
44
Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt
Normal file
44
Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt
Normal file
@ -0,0 +1,44 @@
|
||||
Krait Processor Sub-system (KPSS) Global Clock Controller (GCC)
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: should be one of the following. The generic compatible
|
||||
"qcom,kpss-gcc" should also be included.
|
||||
"qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc"
|
||||
"qcom,kpss-gcc-apq8064", "qcom,kpss-gcc"
|
||||
"qcom,kpss-gcc-msm8974", "qcom,kpss-gcc"
|
||||
"qcom,kpss-gcc-msm8960", "qcom,kpss-gcc"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: base address and size of the register region
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: reference to the pll parents.
|
||||
|
||||
- clock-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "pll8_vote", "pxo".
|
||||
|
||||
- clock-output-names:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: Name of the output clock. Typically acpu_l2_aux indicating
|
||||
an L2 cache auxiliary clock.
|
||||
|
||||
Example:
|
||||
|
||||
l2cc: clock-controller@2011000 {
|
||||
compatible = "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc";
|
||||
reg = <0x2011000 0x1000>;
|
||||
clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
|
||||
clock-names = "pll8_vote", "pxo";
|
||||
clock-output-names = "acpu_l2_aux";
|
||||
};
|
@ -13,6 +13,7 @@ Required Properties:
|
||||
region.
|
||||
- clocks: Reference to the parent clocks ("hosc", "losc")
|
||||
- #clock-cells: should be 1.
|
||||
- #reset-cells: should be 1.
|
||||
|
||||
Each clock is assigned an identifier, and client nodes can use this identifier
|
||||
to specify the clock which they consume.
|
||||
@ -36,6 +37,7 @@ Example: Clock Management Unit node:
|
||||
reg = <0x0 0xe0160000 0x0 0x1000>;
|
||||
clocks = <&hosc>, <&losc>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
Example: UART controller node that consumes clock generated by the clock
|
||||
|
@ -4,6 +4,8 @@ This binding uses the common clock binding[1].
|
||||
|
||||
[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
|
||||
Slow Clock controller:
|
||||
|
||||
Required properties:
|
||||
- compatible : shall be one of the following:
|
||||
"atmel,at91sam9x5-sckc" or
|
||||
@ -16,84 +18,6 @@ Required properties:
|
||||
|
||||
"atmel,at91sam9x5-clk-slow-rc-osc":
|
||||
at91 internal slow RC oscillator
|
||||
|
||||
"atmel,<chip>-pmc":
|
||||
at91 PMC (Power Management Controller)
|
||||
All at91 specific clocks (clocks defined below) must be child
|
||||
node of the PMC node.
|
||||
<chip> can be: at91rm9200, at91sam9260, at91sam9261,
|
||||
at91sam9263, at91sam9g45, at91sam9n12, at91sam9rl, at91sam9x5,
|
||||
sama5d2, sama5d3 or sama5d4.
|
||||
|
||||
"atmel,at91sam9x5-clk-slow" (under sckc node)
|
||||
or
|
||||
"atmel,at91sam9260-clk-slow" (under pmc node):
|
||||
at91 slow clk
|
||||
|
||||
"atmel,at91rm9200-clk-main-osc"
|
||||
"atmel,at91sam9x5-clk-main-rc-osc"
|
||||
at91 main clk sources
|
||||
|
||||
"atmel,at91sam9x5-clk-main"
|
||||
"atmel,at91rm9200-clk-main":
|
||||
at91 main clock
|
||||
|
||||
"atmel,at91rm9200-clk-master" or
|
||||
"atmel,at91sam9x5-clk-master":
|
||||
at91 master clock
|
||||
|
||||
"atmel,at91sam9x5-clk-peripheral" or
|
||||
"atmel,at91rm9200-clk-peripheral":
|
||||
at91 peripheral clocks
|
||||
|
||||
"atmel,at91rm9200-clk-pll" or
|
||||
"atmel,at91sam9g45-clk-pll" or
|
||||
"atmel,at91sam9g20-clk-pllb" or
|
||||
"atmel,sama5d3-clk-pll":
|
||||
at91 pll clocks
|
||||
|
||||
"atmel,at91sam9x5-clk-plldiv":
|
||||
at91 plla divisor
|
||||
|
||||
"atmel,at91rm9200-clk-programmable" or
|
||||
"atmel,at91sam9g45-clk-programmable" or
|
||||
"atmel,at91sam9x5-clk-programmable":
|
||||
at91 programmable clocks
|
||||
|
||||
"atmel,at91sam9x5-clk-smd":
|
||||
at91 SMD (Soft Modem) clock
|
||||
|
||||
"atmel,at91rm9200-clk-system":
|
||||
at91 system clocks
|
||||
|
||||
"atmel,at91rm9200-clk-usb" or
|
||||
"atmel,at91sam9x5-clk-usb" or
|
||||
"atmel,at91sam9n12-clk-usb":
|
||||
at91 usb clock
|
||||
|
||||
"atmel,at91sam9x5-clk-utmi":
|
||||
at91 utmi clock
|
||||
|
||||
"atmel,sama5d4-clk-h32mx":
|
||||
at91 h32mx clock
|
||||
|
||||
"atmel,sama5d2-clk-generated":
|
||||
at91 generated clock
|
||||
|
||||
"atmel,sama5d2-clk-audio-pll-frac":
|
||||
at91 audio fractional pll
|
||||
|
||||
"atmel,sama5d2-clk-audio-pll-pad":
|
||||
at91 audio pll CLK_AUDIO output pin
|
||||
|
||||
"atmel,sama5d2-clk-audio-pll-pmc"
|
||||
at91 audio pll output on AUDIOPLLCLK that feeds the PMC
|
||||
and can be used by peripheral clock or generic clock
|
||||
|
||||
"atmel,sama5d2-clk-i2s-mux" (under pmc node):
|
||||
at91 I2S clock source selection
|
||||
|
||||
Required properties for SCKC node:
|
||||
- reg : defines the IO memory reserved for the SCKC.
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
@ -109,428 +33,30 @@ For example:
|
||||
/* put at91 slow clocks here */
|
||||
};
|
||||
|
||||
Power Management Controller (PMC):
|
||||
|
||||
Required properties for internal slow RC oscillator:
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clock-frequency : define the internal RC oscillator frequency.
|
||||
|
||||
Optional properties:
|
||||
- clock-accuracy : define the internal RC oscillator accuracy.
|
||||
|
||||
For example:
|
||||
slow_rc_osc: slow_rc_osc {
|
||||
compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
|
||||
clock-frequency = <32768>;
|
||||
clock-accuracy = <50000000>;
|
||||
};
|
||||
|
||||
Required properties for slow oscillator:
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall encode the main osc source clk sources (see atmel datasheet).
|
||||
Required properties:
|
||||
- compatible : shall be "atmel,<chip>-pmc", "syscon":
|
||||
<chip> can be: at91rm9200, at91sam9260, at91sam9261,
|
||||
at91sam9263, at91sam9g45, at91sam9n12, at91sam9rl, at91sam9g15,
|
||||
at91sam9g25, at91sam9g35, at91sam9x25, at91sam9x35, at91sam9x5,
|
||||
sama5d2, sama5d3 or sama5d4.
|
||||
- #clock-cells : from common clock binding; shall be set to 2. The first entry
|
||||
is the type of the clock (core, system, peripheral or generated) and the
|
||||
second entry its index as provided by the datasheet
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
- clock-names: Must include the following entries: "slow_clk", "main_xtal"
|
||||
|
||||
Optional properties:
|
||||
- atmel,osc-bypass : boolean property. Set this when a clock signal is directly
|
||||
provided on XIN.
|
||||
|
||||
For example:
|
||||
slow_osc: slow_osc {
|
||||
compatible = "atmel,at91rm9200-clk-slow-osc";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&slow_xtal>;
|
||||
};
|
||||
|
||||
Required properties for slow clock:
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall encode the slow clk sources (see atmel datasheet).
|
||||
|
||||
For example:
|
||||
clk32k: slck {
|
||||
compatible = "atmel,at91sam9x5-clk-slow";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&slow_rc_osc &slow_osc>;
|
||||
};
|
||||
|
||||
Required properties for PMC node:
|
||||
- reg : defines the IO memory reserved for the PMC.
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
- interrupts : shall be set to PMC interrupt line.
|
||||
- interrupt-controller : tell that the PMC is an interrupt controller.
|
||||
- #interrupt-cells : must be set to 1. The first cell encodes the interrupt id,
|
||||
and reflect the bit position in the PMC_ER/DR/SR registers.
|
||||
You can use the dt macros defined in dt-bindings/clock/at91.h.
|
||||
0 (AT91_PMC_MOSCS) -> main oscillator ready
|
||||
1 (AT91_PMC_LOCKA) -> PLL A ready
|
||||
2 (AT91_PMC_LOCKB) -> PLL B ready
|
||||
3 (AT91_PMC_MCKRDY) -> master clock ready
|
||||
6 (AT91_PMC_LOCKU) -> UTMI PLL clock ready
|
||||
8 .. 15 (AT91_PMC_PCKRDY(id)) -> programmable clock ready
|
||||
16 (AT91_PMC_MOSCSELS) -> main oscillator selected
|
||||
17 (AT91_PMC_MOSCRCS) -> RC main oscillator stabilized
|
||||
18 (AT91_PMC_CFDEV) -> clock failure detected
|
||||
|
||||
For example:
|
||||
pmc: pmc@fffffc00 {
|
||||
compatible = "atmel,sama5d3-pmc";
|
||||
interrupts = <1 4 7>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
/* put at91 clocks here */
|
||||
};
|
||||
|
||||
Required properties for main clock internal RC oscillator:
|
||||
- interrupts : shall be set to "<0>".
|
||||
- clock-frequency : define the internal RC oscillator frequency.
|
||||
|
||||
Optional properties:
|
||||
- clock-accuracy : define the internal RC oscillator accuracy.
|
||||
|
||||
For example:
|
||||
main_rc_osc: main_rc_osc {
|
||||
compatible = "atmel,at91sam9x5-clk-main-rc-osc";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <0>;
|
||||
clock-frequency = <12000000>;
|
||||
clock-accuracy = <50000000>;
|
||||
};
|
||||
|
||||
Required properties for main clock oscillator:
|
||||
- interrupts : shall be set to "<0>".
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall encode the main osc source clk sources (see atmel datasheet).
|
||||
|
||||
Optional properties:
|
||||
- atmel,osc-bypass : boolean property. Specified if a clock signal is provided
|
||||
on XIN.
|
||||
|
||||
clock signal is directly provided on XIN pin.
|
||||
|
||||
For example:
|
||||
main_osc: main_osc {
|
||||
compatible = "atmel,at91rm9200-clk-main-osc";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <0>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&main_xtal>;
|
||||
};
|
||||
|
||||
Required properties for main clock:
|
||||
- interrupts : shall be set to "<0>".
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall encode the main clk sources (see atmel datasheet).
|
||||
|
||||
For example:
|
||||
main: mainck {
|
||||
compatible = "atmel,at91sam9x5-clk-main";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <0>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&main_rc_osc &main_osc>;
|
||||
};
|
||||
|
||||
Required properties for master clock:
|
||||
- interrupts : shall be set to "<3>".
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the master clock sources (see atmel datasheet) phandles.
|
||||
e.g. "<&ck32k>, <&main>, <&plla>, <&pllb>".
|
||||
- atmel,clk-output-range : minimum and maximum clock frequency (two u32
|
||||
fields).
|
||||
e.g. output = <0 133000000>; <=> 0 to 133MHz.
|
||||
- atmel,clk-divisors : master clock divisors table (four u32 fields).
|
||||
0 <=> reserved value.
|
||||
e.g. divisors = <1 2 4 6>;
|
||||
- atmel,master-clk-have-div3-pres : some SoC use the reserved value 7 in the
|
||||
PRES field as CLOCK_DIV3 (e.g sam9x5).
|
||||
|
||||
For example:
|
||||
mck: mck {
|
||||
compatible = "atmel,at91rm9200-clk-master";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <3>;
|
||||
#clock-cells = <0>;
|
||||
atmel,clk-output-range = <0 133000000>;
|
||||
atmel,clk-divisors = <1 2 4 0>;
|
||||
};
|
||||
|
||||
Required properties for peripheral clocks:
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
- clocks : shall be the master clock phandle.
|
||||
e.g. clocks = <&mck>;
|
||||
- name: device tree node describing a specific peripheral clock.
|
||||
* #clock-cells : from common clock binding; shall be set to 0.
|
||||
* reg: peripheral id. See Atmel's datasheets to get a full
|
||||
list of peripheral ids.
|
||||
* atmel,clk-output-range : minimum and maximum clock frequency
|
||||
(two u32 fields). Only valid on at91sam9x5-clk-peripheral
|
||||
compatible IPs.
|
||||
|
||||
For example:
|
||||
periph: periphck {
|
||||
compatible = "atmel,at91sam9x5-clk-peripheral";
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
clocks = <&mck>;
|
||||
|
||||
ssc0_clk {
|
||||
#clock-cells = <0>;
|
||||
reg = <2>;
|
||||
atmel,clk-output-range = <0 133000000>;
|
||||
};
|
||||
|
||||
usart0_clk {
|
||||
#clock-cells = <0>;
|
||||
reg = <3>;
|
||||
atmel,clk-output-range = <0 66000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Required properties for pll clocks:
|
||||
- interrupts : shall be set to "<1>".
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the main clock phandle.
|
||||
- reg : pll id.
|
||||
0 -> PLL A
|
||||
1 -> PLL B
|
||||
- atmel,clk-input-range : minimum and maximum source clock frequency (two u32
|
||||
fields).
|
||||
e.g. input = <1 32000000>; <=> 1 to 32MHz.
|
||||
- #atmel,pll-clk-output-range-cells : number of cells reserved for pll output
|
||||
range description. Sould be set to 2, 3
|
||||
or 4.
|
||||
* 1st and 2nd cells represent the frequency range (min-max).
|
||||
* 3rd cell is optional and represents the OUT field value for the given
|
||||
range.
|
||||
* 4th cell is optional and represents the ICPLL field (PLLICPR
|
||||
register)
|
||||
- atmel,pll-clk-output-ranges : pll output frequency ranges + optional parameter
|
||||
depending on #atmel,pll-output-range-cells
|
||||
property value.
|
||||
|
||||
For example:
|
||||
plla: pllack {
|
||||
compatible = "atmel,at91sam9g45-clk-pll";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <1>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&main>;
|
||||
reg = <0>;
|
||||
atmel,clk-input-range = <2000000 32000000>;
|
||||
#atmel,pll-clk-output-range-cells = <4>;
|
||||
atmel,pll-clk-output-ranges = <74500000 800000000 0 0
|
||||
69500000 750000000 1 0
|
||||
64500000 700000000 2 0
|
||||
59500000 650000000 3 0
|
||||
54500000 600000000 0 1
|
||||
49500000 550000000 1 1
|
||||
44500000 500000000 2 1
|
||||
40000000 450000000 3 1>;
|
||||
};
|
||||
|
||||
Required properties for plldiv clocks (plldiv = pll / 2):
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the plla clock phandle.
|
||||
|
||||
The pll divisor is equal to 2 and cannot be changed.
|
||||
|
||||
For example:
|
||||
plladiv: plladivck {
|
||||
compatible = "atmel,at91sam9x5-clk-plldiv";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&plla>;
|
||||
};
|
||||
|
||||
Required properties for programmable clocks:
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
- clocks : shall be the programmable clock source phandles.
|
||||
e.g. clocks = <&clk32k>, <&main>, <&plla>, <&pllb>;
|
||||
- name: device tree node describing a specific prog clock.
|
||||
* #clock-cells : from common clock binding; shall be set to 0.
|
||||
* reg : programmable clock id (register offset from PCKx
|
||||
register).
|
||||
* interrupts : shall be set to "<(8 + id)>".
|
||||
|
||||
For example:
|
||||
prog: progck {
|
||||
compatible = "atmel,at91sam9g45-clk-programmable";
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
interrupt-parent = <&pmc>;
|
||||
clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>;
|
||||
|
||||
prog0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0>;
|
||||
interrupts = <8>;
|
||||
};
|
||||
|
||||
prog1 {
|
||||
#clock-cells = <0>;
|
||||
reg = <1>;
|
||||
interrupts = <9>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Required properties for smd clock:
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the smd clock source phandles.
|
||||
e.g. clocks = <&plladiv>, <&utmi>;
|
||||
|
||||
For example:
|
||||
smd: smdck {
|
||||
compatible = "atmel,at91sam9x5-clk-smd";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&plladiv>, <&utmi>;
|
||||
};
|
||||
|
||||
Required properties for system clocks:
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
- name: device tree node describing a specific system clock.
|
||||
* #clock-cells : from common clock binding; shall be set to 0.
|
||||
* reg: system clock id (bit position in SCER/SCDR/SCSR registers).
|
||||
See Atmel's datasheet to get a full list of system clock ids.
|
||||
|
||||
For example:
|
||||
system: systemck {
|
||||
compatible = "atmel,at91rm9200-clk-system";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ddrck {
|
||||
#clock-cells = <0>;
|
||||
reg = <2>;
|
||||
clocks = <&mck>;
|
||||
};
|
||||
|
||||
uhpck {
|
||||
#clock-cells = <0>;
|
||||
reg = <6>;
|
||||
clocks = <&usb>;
|
||||
};
|
||||
|
||||
udpck {
|
||||
#clock-cells = <0>;
|
||||
reg = <7>;
|
||||
clocks = <&usb>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Required properties for usb clock:
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the smd clock source phandles.
|
||||
e.g. clocks = <&pllb>;
|
||||
- atmel,clk-divisors (only available for "atmel,at91rm9200-clk-usb"):
|
||||
usb clock divisor table.
|
||||
e.g. divisors = <1 2 4 0>;
|
||||
|
||||
For example:
|
||||
usb: usbck {
|
||||
compatible = "atmel,at91sam9x5-clk-usb";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&plladiv>, <&utmi>;
|
||||
};
|
||||
|
||||
usb: usbck {
|
||||
compatible = "atmel,at91rm9200-clk-usb";
|
||||
#clock-cells = <0>;
|
||||
clocks = <&pllb>;
|
||||
atmel,clk-divisors = <1 2 4 0>;
|
||||
};
|
||||
|
||||
|
||||
Required properties for utmi clock:
|
||||
- interrupts : shall be set to "<AT91_PMC_LOCKU IRQ_TYPE_LEVEL_HIGH>".
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the main clock source phandle.
|
||||
|
||||
For example:
|
||||
utmi: utmick {
|
||||
compatible = "atmel,at91sam9x5-clk-utmi";
|
||||
interrupt-parent = <&pmc>;
|
||||
interrupts = <AT91_PMC_LOCKU IRQ_TYPE_LEVEL_HIGH>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&main>;
|
||||
};
|
||||
|
||||
Required properties for 32 bits bus Matrix clock (h32mx clock):
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : shall be the master clock source phandle.
|
||||
|
||||
For example:
|
||||
h32ck: h32mxck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "atmel,sama5d4-clk-h32mx";
|
||||
clocks = <&mck>;
|
||||
};
|
||||
|
||||
Required properties for generated clocks:
|
||||
- #size-cells : shall be 0 (reg is used to encode clk id).
|
||||
- #address-cells : shall be 1 (reg is used to encode clk id).
|
||||
- clocks : shall be the generated clock source phandles.
|
||||
e.g. clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>, <&audio_pll_pmc>;
|
||||
- name: device tree node describing a specific generated clock.
|
||||
* #clock-cells : from common clock binding; shall be set to 0.
|
||||
* reg: peripheral id. See Atmel's datasheets to get a full
|
||||
list of peripheral ids.
|
||||
* atmel,clk-output-range : minimum and maximum clock frequency
|
||||
(two u32 fields).
|
||||
|
||||
For example:
|
||||
gck {
|
||||
compatible = "atmel,sama5d2-clk-generated";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>, <&audio_pll_pmc>;
|
||||
|
||||
tcb0_gclk: tcb0_gclk {
|
||||
#clock-cells = <0>;
|
||||
reg = <35>;
|
||||
atmel,clk-output-range = <0 83000000>;
|
||||
};
|
||||
|
||||
pwm_gclk: pwm_gclk {
|
||||
#clock-cells = <0>;
|
||||
reg = <38>;
|
||||
atmel,clk-output-range = <0 83000000>;
|
||||
};
|
||||
};
|
||||
|
||||
Required properties for I2S mux clocks:
|
||||
- #size-cells : shall be 0 (reg is used to encode I2S bus id).
|
||||
- #address-cells : shall be 1 (reg is used to encode I2S bus id).
|
||||
- name: device tree node describing a specific mux clock.
|
||||
* #clock-cells : from common clock binding; shall be set to 0.
|
||||
* clocks : shall be the mux clock parent phandles; shall be 2 phandles:
|
||||
peripheral and generated clock; the first phandle shall belong to the
|
||||
peripheral clock and the second one shall belong to the generated
|
||||
clock; "clock-indices" property can be user to specify
|
||||
the correct order.
|
||||
* reg: I2S bus id of the corresponding mux clock.
|
||||
e.g. reg = <0>; for i2s0, reg = <1>; for i2s1
|
||||
|
||||
For example:
|
||||
i2s_clkmux {
|
||||
compatible = "atmel,sama5d2-clk-i2s-mux";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
i2s0muxck: i2s0_muxclk {
|
||||
clocks = <&i2s0_clk>, <&i2s0_gclk>;
|
||||
#clock-cells = <0>;
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
i2s1muxck: i2s1_muxclk {
|
||||
clocks = <&i2s1_clk>, <&i2s1_gclk>;
|
||||
#clock-cells = <0>;
|
||||
reg = <1>;
|
||||
};
|
||||
pmc: pmc@f0018000 {
|
||||
compatible = "atmel,sama5d4-pmc", "syscon";
|
||||
reg = <0xf0018000 0x120>;
|
||||
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
#clock-cells = <2>;
|
||||
clocks = <&clk32k>, <&main_xtal>;
|
||||
clock-names = "slow_clk", "main_xtal";
|
||||
};
|
||||
|
43
Documentation/devicetree/bindings/clock/hi3670-clock.txt
Normal file
43
Documentation/devicetree/bindings/clock/hi3670-clock.txt
Normal file
@ -0,0 +1,43 @@
|
||||
* Hisilicon Hi3670 Clock Controller
|
||||
|
||||
The Hi3670 clock controller generates and supplies clock to various
|
||||
controllers within the Hi3670 SoC.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: the compatible should be one of the following strings to
|
||||
indicate the clock controller functionality.
|
||||
|
||||
- "hisilicon,hi3670-crgctrl"
|
||||
- "hisilicon,hi3670-pctrl"
|
||||
- "hisilicon,hi3670-pmuctrl"
|
||||
- "hisilicon,hi3670-sctrl"
|
||||
- "hisilicon,hi3670-iomcu"
|
||||
- "hisilicon,hi3670-media1-crg"
|
||||
- "hisilicon,hi3670-media2-crg"
|
||||
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
|
||||
- #clock-cells: should be 1.
|
||||
|
||||
Each clock is assigned an identifier and client nodes use this identifier
|
||||
to specify the clock which they consume.
|
||||
|
||||
All these identifier could be found in <dt-bindings/clock/hi3670-clock.h>.
|
||||
|
||||
Examples:
|
||||
crg_ctrl: clock-controller@fff35000 {
|
||||
compatible = "hisilicon,hi3670-crgctrl", "syscon";
|
||||
reg = <0x0 0xfff35000 0x0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
uart0: serial@fdf02000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0x0 0xfdf02000 0x0 0x1000>;
|
||||
interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&crg_ctrl HI3670_CLK_GATE_UART0>,
|
||||
<&crg_ctrl HI3670_PCLK>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
@ -6,8 +6,11 @@ to provide many different clock signals derived from only 2 external source
|
||||
clocks.
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "ingenic,<soctype>-cgu".
|
||||
For example "ingenic,jz4740-cgu" or "ingenic,jz4780-cgu".
|
||||
- compatible : Should be one of:
|
||||
* ingenic,jz4740-cgu
|
||||
* ingenic,jz4725b-cgu
|
||||
* ingenic,jz4770-cgu
|
||||
* ingenic,jz4780-cgu
|
||||
- reg : The address & length of the CGU registers.
|
||||
- clocks : List of phandle & clock specifiers for clocks external to the CGU.
|
||||
Two such external clocks should be specified - first the external crystal
|
||||
|
18
Documentation/devicetree/bindings/clock/qcom,camcc.txt
Normal file
18
Documentation/devicetree/bindings/clock/qcom,camcc.txt
Normal file
@ -0,0 +1,18 @@
|
||||
Qualcomm Camera Clock & Reset Controller Binding
|
||||
------------------------------------------------
|
||||
|
||||
Required properties :
|
||||
- compatible : shall contain "qcom,sdm845-camcc".
|
||||
- reg : shall contain base register location and length.
|
||||
- #clock-cells : from common clock binding, shall contain 1.
|
||||
- #reset-cells : from common reset binding, shall contain 1.
|
||||
- #power-domain-cells : from generic power domain binding, shall contain 1.
|
||||
|
||||
Example:
|
||||
camcc: clock-controller@ad00000 {
|
||||
compatible = "qcom,sdm845-camcc";
|
||||
reg = <0xad00000 0x10000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
@ -19,6 +19,9 @@ Required properties :
|
||||
"qcom,gcc-msm8996"
|
||||
"qcom,gcc-msm8998"
|
||||
"qcom,gcc-mdm9615"
|
||||
"qcom,gcc-qcs404"
|
||||
"qcom,gcc-sdm630"
|
||||
"qcom,gcc-sdm660"
|
||||
"qcom,gcc-sdm845"
|
||||
|
||||
- reg : shall contain base register location and length
|
||||
|
60
Documentation/devicetree/bindings/clock/qcom,hfpll.txt
Normal file
60
Documentation/devicetree/bindings/clock/qcom,hfpll.txt
Normal file
@ -0,0 +1,60 @@
|
||||
High-Frequency PLL (HFPLL)
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>:
|
||||
shall contain only one of the following. The generic
|
||||
compatible "qcom,hfpll" should be also included.
|
||||
|
||||
"qcom,hfpll-ipq8064", "qcom,hfpll"
|
||||
"qcom,hfpll-apq8064", "qcom,hfpll"
|
||||
"qcom,hfpll-msm8974", "qcom,hfpll"
|
||||
"qcom,hfpll-msm8960", "qcom,hfpll"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: address and size of HPLL registers. An optional second
|
||||
element specifies the address and size of the alias
|
||||
register region.
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: reference to the xo clock.
|
||||
|
||||
- clock-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "xo".
|
||||
|
||||
- clock-output-names:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: Name of the PLL. Typically hfpllX where X is a CPU number
|
||||
starting at 0. Otherwise hfpll_Y where Y is more specific
|
||||
such as "l2".
|
||||
|
||||
Example:
|
||||
|
||||
1) An HFPLL for the L2 cache.
|
||||
|
||||
clock-controller@f9016000 {
|
||||
compatible = "qcom,hfpll-ipq8064", "qcom,hfpll";
|
||||
reg = <0xf9016000 0x30>;
|
||||
clocks = <&xo_board>;
|
||||
clock-names = "xo";
|
||||
clock-output-names = "hfpll_l2";
|
||||
};
|
||||
|
||||
2) An HFPLL for CPU0. This HFPLL has the alias register region.
|
||||
|
||||
clock-controller@f908a000 {
|
||||
compatible = "qcom,hfpll-ipq8064", "qcom,hfpll";
|
||||
reg = <0xf908a000 0x30>, <0xf900a000 0x30>;
|
||||
clocks = <&xo_board>;
|
||||
clock-names = "xo";
|
||||
clock-output-names = "hfpll0";
|
||||
};
|
34
Documentation/devicetree/bindings/clock/qcom,krait-cc.txt
Normal file
34
Documentation/devicetree/bindings/clock/qcom,krait-cc.txt
Normal file
@ -0,0 +1,34 @@
|
||||
Krait Clock Controller
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be one of:
|
||||
"qcom,krait-cc-v1"
|
||||
"qcom,krait-cc-v2"
|
||||
|
||||
- #clock-cells:
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be 1
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: reference to the clock parents of hfpll, secondary muxes.
|
||||
|
||||
- clock-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "hfpll0", "hfpll1", "acpu0_aux", "acpu1_aux", "qsb".
|
||||
|
||||
Example:
|
||||
|
||||
kraitcc: clock-controller {
|
||||
compatible = "qcom,krait-cc-v1";
|
||||
clocks = <&hfpll0>, <&hfpll1>, <&acpu0_aux>, <&acpu1_aux>, <qsb>;
|
||||
clock-names = "hfpll0", "hfpll1", "acpu0_aux", "acpu1_aux", "qsb";
|
||||
#clock-cells = <1>;
|
||||
};
|
@ -13,9 +13,13 @@ They provide the following functionalities:
|
||||
|
||||
Required Properties:
|
||||
- compatible: Must be one of:
|
||||
- "renesas,r7s9210-cpg-mssr" for the r7s9210 SoC (RZ/A2)
|
||||
- "renesas,r8a7743-cpg-mssr" for the r8a7743 SoC (RZ/G1M)
|
||||
- "renesas,r8a7744-cpg-mssr" for the r8a7744 SoC (RZ/G1N)
|
||||
- "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E)
|
||||
- "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C)
|
||||
- "renesas,r8a774a1-cpg-mssr" for the r8a774a1 SoC (RZ/G2M)
|
||||
- "renesas,r8a774c0-cpg-mssr" for the r8a774c0 SoC (RZ/G2E)
|
||||
- "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2)
|
||||
- "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W)
|
||||
- "renesas,r8a7792-cpg-mssr" for the r8a7792 SoC (R-Car V2H)
|
||||
@ -35,12 +39,13 @@ Required Properties:
|
||||
- clocks: References to external parent clocks, one entry for each entry in
|
||||
clock-names
|
||||
- clock-names: List of external parent clock names. Valid names are:
|
||||
- "extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7792,
|
||||
r8a7793, r8a7794, r8a7795, r8a7796, r8a77965, r8a77970,
|
||||
r8a77980, r8a77990, r8a77995)
|
||||
- "extalr" (r8a7795, r8a7796, r8a77965, r8a77970, r8a77980)
|
||||
- "usb_extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7793,
|
||||
r8a7794)
|
||||
- "extal" (r7s9210, r8a7743, r8a7744, r8a7745, r8a77470, r8a774a1,
|
||||
r8a774c0, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794,
|
||||
r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77990,
|
||||
r8a77995)
|
||||
- "extalr" (r8a774a1, r8a7795, r8a7796, r8a77965, r8a77970, r8a77980)
|
||||
- "usb_extal" (r8a7743, r8a7744, r8a7745, r8a77470, r8a7790, r8a7791,
|
||||
r8a7793, r8a7794)
|
||||
|
||||
- #clock-cells: Must be 2
|
||||
- For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
|
||||
|
@ -1,20 +1,22 @@
|
||||
Innolux TV123WAM 12.3 inch eDP 2K display panel
|
||||
Innolux P120ZDG-BF1 12.02 inch eDP 2K display panel
|
||||
|
||||
This binding is compatible with the simple-panel binding, which is specified
|
||||
in simple-panel.txt in this directory.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "innolux,tv123wam"
|
||||
- compatible: should be "innolux,p120zdg-bf1"
|
||||
- power-supply: regulator to provide the supply voltage
|
||||
|
||||
Optional properties:
|
||||
- enable-gpios: GPIO pin to enable or disable the panel
|
||||
- backlight: phandle of the backlight device attached to the panel
|
||||
- no-hpd: If HPD isn't hooked up; add this property.
|
||||
|
||||
Example:
|
||||
panel_edp: panel-edp {
|
||||
compatible = "innolux,tv123wam";
|
||||
compatible = "innolux,p120zdg-bf1";
|
||||
enable-gpios = <&msmgpio 31 GPIO_ACTIVE_LOW>;
|
||||
power-supply = <&pm8916_l2>;
|
||||
backlight = <&backlight>;
|
||||
no-hpd;
|
||||
};
|
@ -11,6 +11,9 @@ Optional properties:
|
||||
- ddc-i2c-bus: phandle of an I2C controller used for DDC EDID probing
|
||||
- enable-gpios: GPIO pin to enable or disable the panel
|
||||
- backlight: phandle of the backlight device attached to the panel
|
||||
- no-hpd: This panel is supposed to communicate that it's ready via HPD
|
||||
(hot plug detect) signal, but the signal isn't hooked up so we should
|
||||
hardcode the max delay from the panel spec when powering up the panel.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
Required properties:
|
||||
- compatible :
|
||||
- "fsl,imx7ulp-lpi2c" for LPI2C compatible with the one integrated on i.MX7ULP soc
|
||||
- "fsl,imx8qxp-lpi2c" for LPI2C compatible with the one integrated on i.MX8QXP soc
|
||||
- reg : address and length of the lpi2c master registers
|
||||
- interrupts : lpi2c interrupt
|
||||
- clocks : lpi2c clock specifier
|
||||
|
@ -7,6 +7,7 @@ Required properties:
|
||||
for da850 - compatible = "ti,da850-ecap", "ti,am3352-ecap", "ti,am33xx-ecap";
|
||||
for dra746 - compatible = "ti,dra746-ecap", "ti,am3352-ecap";
|
||||
for 66ak2g - compatible = "ti,k2g-ecap", "ti,am3352-ecap";
|
||||
for am654 - compatible = "ti,am654-ecap", "ti,am3352-ecap";
|
||||
- #pwm-cells: should be 3. See pwm.txt in this directory for a description of
|
||||
the cells format. The PWM channel index ranges from 0 to 4. The only third
|
||||
cell flag supported by this binding is PWM_POLARITY_INVERTED.
|
||||
|
@ -3,7 +3,9 @@
|
||||
Required Properties:
|
||||
- compatible: should be "renesas,pwm-rcar" and one of the following.
|
||||
- "renesas,pwm-r8a7743": for RZ/G1M
|
||||
- "renesas,pwm-r8a7744": for RZ/G1N
|
||||
- "renesas,pwm-r8a7745": for RZ/G1E
|
||||
- "renesas,pwm-r8a774a1": for RZ/G2M
|
||||
- "renesas,pwm-r8a7778": for R-Car M1A
|
||||
- "renesas,pwm-r8a7779": for R-Car H1
|
||||
- "renesas,pwm-r8a7790": for R-Car H2
|
||||
@ -12,6 +14,8 @@ Required Properties:
|
||||
- "renesas,pwm-r8a7795": for R-Car H3
|
||||
- "renesas,pwm-r8a7796": for R-Car M3-W
|
||||
- "renesas,pwm-r8a77965": for R-Car M3-N
|
||||
- "renesas,pwm-r8a77970": for R-Car V3M
|
||||
- "renesas,pwm-r8a77980": for R-Car V3H
|
||||
- "renesas,pwm-r8a77990": for R-Car E3
|
||||
- "renesas,pwm-r8a77995": for R-Car D3
|
||||
- reg: base address and length of the registers block for the PWM.
|
||||
|
@ -2,13 +2,19 @@
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: should be one of the following.
|
||||
- compatible: must contain one or more of the following:
|
||||
- "renesas,tpu-r8a73a4": for R8A73A4 (R-Mobile APE6) compatible PWM controller.
|
||||
- "renesas,tpu-r8a7740": for R8A7740 (R-Mobile A1) compatible PWM controller.
|
||||
- "renesas,tpu-r8a7743": for R8A7743 (RZ/G1M) compatible PWM controller.
|
||||
- "renesas,tpu-r8a7744": for R8A7744 (RZ/G1N) compatible PWM controller.
|
||||
- "renesas,tpu-r8a7745": for R8A7745 (RZ/G1E) compatible PWM controller.
|
||||
- "renesas,tpu-r8a7790": for R8A7790 (R-Car H2) compatible PWM controller.
|
||||
- "renesas,tpu": for generic R-Car and RZ/G1 TPU PWM controller.
|
||||
- "renesas,tpu-r8a77970": for R8A77970 (R-Car V3M) compatible PWM
|
||||
controller.
|
||||
- "renesas,tpu-r8a77980": for R8A77980 (R-Car V3H) compatible PWM
|
||||
controller.
|
||||
- "renesas,tpu": for the generic TPU PWM controller; this is a fallback for
|
||||
the entries listed above.
|
||||
|
||||
- reg: Base address and length of each memory resource used by the PWM
|
||||
controller hardware module.
|
||||
|
@ -0,0 +1,42 @@
|
||||
=================
|
||||
gx6605s SOC Timer
|
||||
=================
|
||||
|
||||
The timer is used in gx6605s soc as system timer and the driver
|
||||
contain clk event and clk source.
|
||||
|
||||
==============================
|
||||
timer node bindings definition
|
||||
==============================
|
||||
|
||||
Description: Describes gx6605s SOC timer
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be "csky,gx6605s-timer"
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <u32 u32>
|
||||
Definition: <phyaddr size> in soc from cpu view
|
||||
- clocks
|
||||
Usage: required
|
||||
Value type: phandle + clock specifier cells
|
||||
Definition: must be input clk node
|
||||
- interrupt
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be timer irq num defined by soc
|
||||
|
||||
Examples:
|
||||
---------
|
||||
|
||||
timer0: timer@20a000 {
|
||||
compatible = "csky,gx6605s-timer";
|
||||
reg = <0x0020a000 0x400>;
|
||||
clocks = <&dummy_apb_clk>;
|
||||
interrupts = <10>;
|
||||
interrupt-parent = <&intc>;
|
||||
};
|
42
Documentation/devicetree/bindings/timer/csky,mptimer.txt
Normal file
42
Documentation/devicetree/bindings/timer/csky,mptimer.txt
Normal file
@ -0,0 +1,42 @@
|
||||
============================
|
||||
C-SKY Multi-processors Timer
|
||||
============================
|
||||
|
||||
C-SKY multi-processors timer is designed for C-SKY SMP system and the
|
||||
regs is accessed by cpu co-processor 4 registers with mtcr/mfcr.
|
||||
|
||||
- PTIM_CTLR "cr<0, 14>" Control reg to start reset timer.
|
||||
- PTIM_TSR "cr<1, 14>" Interrupt cleanup status reg.
|
||||
- PTIM_CCVR "cr<3, 14>" Current counter value reg.
|
||||
- PTIM_LVR "cr<6, 14>" Window value reg to triger next event.
|
||||
|
||||
==============================
|
||||
timer node bindings definition
|
||||
==============================
|
||||
|
||||
Description: Describes SMP timer
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be "csky,mptimer"
|
||||
- clocks
|
||||
Usage: required
|
||||
Value type: <node>
|
||||
Definition: must be input clk node
|
||||
- interrupts
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be timer irq num defined by soc
|
||||
|
||||
Examples:
|
||||
---------
|
||||
|
||||
timer: timer {
|
||||
compatible = "csky,mptimer";
|
||||
clocks = <&dummy_apb_clk>;
|
||||
interrupts = <16>;
|
||||
interrupt-parent = <&intc>;
|
||||
};
|
@ -151,6 +151,11 @@ Mount Options
|
||||
Report overall filesystem usage in statfs instead of using the root
|
||||
directory quota.
|
||||
|
||||
nocopyfrom
|
||||
Don't use the RADOS 'copy-from' operation to perform remote object
|
||||
copies. Currently, it's only used in copy_file_range, which will revert
|
||||
to the default VFS implementation if this option is used.
|
||||
|
||||
More Information
|
||||
================
|
||||
|
||||
|
@ -286,6 +286,12 @@ pointed by REDIRECT. This should not be possible on local system as setting
|
||||
"trusted." xattrs will require CAP_SYS_ADMIN. But it should be possible
|
||||
for untrusted layers like from a pen drive.
|
||||
|
||||
Note: redirect_dir={off|nofollow|follow(*)} conflicts with metacopy=on, and
|
||||
results in an error.
|
||||
|
||||
(*) redirect_dir=follow only conflicts with metacopy=on if upperdir=... is
|
||||
given.
|
||||
|
||||
Sharing and copying layers
|
||||
--------------------------
|
||||
|
||||
|
@ -623,6 +623,11 @@ in your dentry operations instead.
|
||||
On success you get a new struct file sharing the mount/dentry with the
|
||||
original, on failure - ERR_PTR().
|
||||
--
|
||||
[mandatory]
|
||||
->clone_file_range() and ->dedupe_file_range have been replaced with
|
||||
->remap_file_range(). See Documentation/filesystems/vfs.txt for more
|
||||
information.
|
||||
--
|
||||
[recommended]
|
||||
->lookup() instances doing an equivalent of
|
||||
if (IS_ERR(inode))
|
||||
|
426
Documentation/filesystems/ubifs-authentication.md
Normal file
426
Documentation/filesystems/ubifs-authentication.md
Normal file
@ -0,0 +1,426 @@
|
||||
% UBIFS Authentication
|
||||
% sigma star gmbh
|
||||
% 2018
|
||||
|
||||
# Introduction
|
||||
|
||||
UBIFS utilizes the fscrypt framework to provide confidentiality for file
|
||||
contents and file names. This prevents attacks where an attacker is able to
|
||||
read contents of the filesystem on a single point in time. A classic example
|
||||
is a lost smartphone where the attacker is unable to read personal data stored
|
||||
on the device without the filesystem decryption key.
|
||||
|
||||
At the current state, UBIFS encryption however does not prevent attacks where
|
||||
the attacker is able to modify the filesystem contents and the user uses the
|
||||
device afterwards. In such a scenario an attacker can modify filesystem
|
||||
contents arbitrarily without the user noticing. One example is to modify a
|
||||
binary to perform a malicious action when executed [DMC-CBC-ATTACK]. Since
|
||||
most of the filesystem metadata of UBIFS is stored in plain, this makes it
|
||||
fairly easy to swap files and replace their contents.
|
||||
|
||||
Other full disk encryption systems like dm-crypt cover all filesystem metadata,
|
||||
which makes such kinds of attacks more complicated, but not impossible.
|
||||
Especially, if the attacker is given access to the device multiple points in
|
||||
time. For dm-crypt and other filesystems that build upon the Linux block IO
|
||||
layer, the dm-integrity or dm-verity subsystems [DM-INTEGRITY, DM-VERITY]
|
||||
can be used to get full data authentication at the block layer.
|
||||
These can also be combined with dm-crypt [CRYPTSETUP2].
|
||||
|
||||
This document describes an approach to get file contents _and_ full metadata
|
||||
authentication for UBIFS. Since UBIFS uses fscrypt for file contents and file
|
||||
name encryption, the authentication system could be tied into fscrypt such that
|
||||
existing features like key derivation can be utilized. It should however also
|
||||
be possible to use UBIFS authentication without using encryption.
|
||||
|
||||
|
||||
## MTD, UBI & UBIFS
|
||||
|
||||
On Linux, the MTD (Memory Technology Devices) subsystem provides a uniform
|
||||
interface to access raw flash devices. One of the more prominent subsystems that
|
||||
work on top of MTD is UBI (Unsorted Block Images). It provides volume management
|
||||
for flash devices and is thus somewhat similar to LVM for block devices. In
|
||||
addition, it deals with flash-specific wear-leveling and transparent I/O error
|
||||
handling. UBI offers logical erase blocks (LEBs) to the layers on top of it
|
||||
and maps them transparently to physical erase blocks (PEBs) on the flash.
|
||||
|
||||
UBIFS is a filesystem for raw flash which operates on top of UBI. Thus, wear
|
||||
leveling and some flash specifics are left to UBI, while UBIFS focuses on
|
||||
scalability, performance and recoverability.
|
||||
|
||||
|
||||
|
||||
+------------+ +*******+ +-----------+ +-----+
|
||||
| | * UBIFS * | UBI-BLOCK | | ... |
|
||||
| JFFS/JFFS2 | +*******+ +-----------+ +-----+
|
||||
| | +-----------------------------+ +-----------+ +-----+
|
||||
| | | UBI | | MTD-BLOCK | | ... |
|
||||
+------------+ +-----------------------------+ +-----------+ +-----+
|
||||
+------------------------------------------------------------------+
|
||||
| MEMORY TECHNOLOGY DEVICES (MTD) |
|
||||
+------------------------------------------------------------------+
|
||||
+-----------------------------+ +--------------------------+ +-----+
|
||||
| NAND DRIVERS | | NOR DRIVERS | | ... |
|
||||
+-----------------------------+ +--------------------------+ +-----+
|
||||
|
||||
Figure 1: Linux kernel subsystems for dealing with raw flash
|
||||
|
||||
|
||||
|
||||
Internally, UBIFS maintains multiple data structures which are persisted on
|
||||
the flash:
|
||||
|
||||
- *Index*: an on-flash B+ tree where the leaf nodes contain filesystem data
|
||||
- *Journal*: an additional data structure to collect FS changes before updating
|
||||
the on-flash index and reduce flash wear.
|
||||
- *Tree Node Cache (TNC)*: an in-memory B+ tree that reflects the current FS
|
||||
state to avoid frequent flash reads. It is basically the in-memory
|
||||
representation of the index, but contains additional attributes.
|
||||
- *LEB property tree (LPT)*: an on-flash B+ tree for free space accounting per
|
||||
UBI LEB.
|
||||
|
||||
In the remainder of this section we will cover the on-flash UBIFS data
|
||||
structures in more detail. The TNC is of less importance here since it is never
|
||||
persisted onto the flash directly. More details on UBIFS can also be found in
|
||||
[UBIFS-WP].
|
||||
|
||||
|
||||
### UBIFS Index & Tree Node Cache
|
||||
|
||||
Basic on-flash UBIFS entities are called *nodes*. UBIFS knows different types
|
||||
of nodes. Eg. data nodes (`struct ubifs_data_node`) which store chunks of file
|
||||
contents or inode nodes (`struct ubifs_ino_node`) which represent VFS inodes.
|
||||
Almost all types of nodes share a common header (`ubifs_ch`) containing basic
|
||||
information like node type, node length, a sequence number, etc. (see
|
||||
`fs/ubifs/ubifs-media.h`in kernel source). Exceptions are entries of the LPT
|
||||
and some less important node types like padding nodes which are used to pad
|
||||
unusable content at the end of LEBs.
|
||||
|
||||
To avoid re-writing the whole B+ tree on every single change, it is implemented
|
||||
as *wandering tree*, where only the changed nodes are re-written and previous
|
||||
versions of them are obsoleted without erasing them right away. As a result,
|
||||
the index is not stored in a single place on the flash, but *wanders* around
|
||||
and there are obsolete parts on the flash as long as the LEB containing them is
|
||||
not reused by UBIFS. To find the most recent version of the index, UBIFS stores
|
||||
a special node called *master node* into UBI LEB 1 which always points to the
|
||||
most recent root node of the UBIFS index. For recoverability, the master node
|
||||
is additionally duplicated to LEB 2. Mounting UBIFS is thus a simple read of
|
||||
LEB 1 and 2 to get the current master node and from there get the location of
|
||||
the most recent on-flash index.
|
||||
|
||||
The TNC is the in-memory representation of the on-flash index. It contains some
|
||||
additional runtime attributes per node which are not persisted. One of these is
|
||||
a dirty-flag which marks nodes that have to be persisted the next time the
|
||||
index is written onto the flash. The TNC acts as a write-back cache and all
|
||||
modifications of the on-flash index are done through the TNC. Like other caches,
|
||||
the TNC does not have to mirror the full index into memory, but reads parts of
|
||||
it from flash whenever needed. A *commit* is the UBIFS operation of updating the
|
||||
on-flash filesystem structures like the index. On every commit, the TNC nodes
|
||||
marked as dirty are written to the flash to update the persisted index.
|
||||
|
||||
|
||||
### Journal
|
||||
|
||||
To avoid wearing out the flash, the index is only persisted (*commited*) when
|
||||
certain conditions are met (eg. `fsync(2)`). The journal is used to record
|
||||
any changes (in form of inode nodes, data nodes etc.) between commits
|
||||
of the index. During mount, the journal is read from the flash and replayed
|
||||
onto the TNC (which will be created on-demand from the on-flash index).
|
||||
|
||||
UBIFS reserves a bunch of LEBs just for the journal called *log area*. The
|
||||
amount of log area LEBs is configured on filesystem creation (using
|
||||
`mkfs.ubifs`) and stored in the superblock node. The log area contains only
|
||||
two types of nodes: *reference nodes* and *commit start nodes*. A commit start
|
||||
node is written whenever an index commit is performed. Reference nodes are
|
||||
written on every journal update. Each reference node points to the position of
|
||||
other nodes (inode nodes, data nodes etc.) on the flash that are part of this
|
||||
journal entry. These nodes are called *buds* and describe the actual filesystem
|
||||
changes including their data.
|
||||
|
||||
The log area is maintained as a ring. Whenever the journal is almost full,
|
||||
a commit is initiated. This also writes a commit start node so that during
|
||||
mount, UBIFS will seek for the most recent commit start node and just replay
|
||||
every reference node after that. Every reference node before the commit start
|
||||
node will be ignored as they are already part of the on-flash index.
|
||||
|
||||
When writing a journal entry, UBIFS first ensures that enough space is
|
||||
available to write the reference node and buds part of this entry. Then, the
|
||||
reference node is written and afterwards the buds describing the file changes.
|
||||
On replay, UBIFS will record every reference node and inspect the location of
|
||||
the referenced LEBs to discover the buds. If these are corrupt or missing,
|
||||
UBIFS will attempt to recover them by re-reading the LEB. This is however only
|
||||
done for the last referenced LEB of the journal. Only this can become corrupt
|
||||
because of a power cut. If the recovery fails, UBIFS will not mount. An error
|
||||
for every other LEB will directly cause UBIFS to fail the mount operation.
|
||||
|
||||
|
||||
| ---- LOG AREA ---- | ---------- MAIN AREA ------------ |
|
||||
|
||||
-----+------+-----+--------+---- ------+-----+-----+---------------
|
||||
\ | | | | / / | | | \
|
||||
/ CS | REF | REF | | \ \ DENT | INO | INO | /
|
||||
\ | | | | / / | | | \
|
||||
----+------+-----+--------+--- -------+-----+-----+----------------
|
||||
| | ^ ^
|
||||
| | | |
|
||||
+------------------------+ |
|
||||
| |
|
||||
+-------------------------------+
|
||||
|
||||
|
||||
Figure 2: UBIFS flash layout of log area with commit start nodes
|
||||
(CS) and reference nodes (REF) pointing to main area
|
||||
containing their buds
|
||||
|
||||
|
||||
### LEB Property Tree/Table
|
||||
|
||||
The LEB property tree is used to store per-LEB information. This includes the
|
||||
LEB type and amount of free and *dirty* (old, obsolete content) space [1] on
|
||||
the LEB. The type is important, because UBIFS never mixes index nodes with data
|
||||
nodes on a single LEB and thus each LEB has a specific purpose. This again is
|
||||
useful for free space calculations. See [UBIFS-WP] for more details.
|
||||
|
||||
The LEB property tree again is a B+ tree, but it is much smaller than the
|
||||
index. Due to its smaller size it is always written as one chunk on every
|
||||
commit. Thus, saving the LPT is an atomic operation.
|
||||
|
||||
|
||||
[1] Since LEBs can only be appended and never overwritten, there is a
|
||||
difference between free space ie. the remaining space left on the LEB to be
|
||||
written to without erasing it and previously written content that is obsolete
|
||||
but can't be overwritten without erasing the full LEB.
|
||||
|
||||
|
||||
# UBIFS Authentication
|
||||
|
||||
This chapter introduces UBIFS authentication which enables UBIFS to verify
|
||||
the authenticity and integrity of metadata and file contents stored on flash.
|
||||
|
||||
|
||||
## Threat Model
|
||||
|
||||
UBIFS authentication enables detection of offline data modification. While it
|
||||
does not prevent it, it enables (trusted) code to check the integrity and
|
||||
authenticity of on-flash file contents and filesystem metadata. This covers
|
||||
attacks where file contents are swapped.
|
||||
|
||||
UBIFS authentication will not protect against rollback of full flash contents.
|
||||
Ie. an attacker can still dump the flash and restore it at a later time without
|
||||
detection. It will also not protect against partial rollback of individual
|
||||
index commits. That means that an attacker is able to partially undo changes.
|
||||
This is possible because UBIFS does not immediately overwrites obsolete
|
||||
versions of the index tree or the journal, but instead marks them as obsolete
|
||||
and garbage collection erases them at a later time. An attacker can use this by
|
||||
erasing parts of the current tree and restoring old versions that are still on
|
||||
the flash and have not yet been erased. This is possible, because every commit
|
||||
will always write a new version of the index root node and the master node
|
||||
without overwriting the previous version. This is further helped by the
|
||||
wear-leveling operations of UBI which copies contents from one physical
|
||||
eraseblock to another and does not atomically erase the first eraseblock.
|
||||
|
||||
UBIFS authentication does not cover attacks where an attacker is able to
|
||||
execute code on the device after the authentication key was provided.
|
||||
Additional measures like secure boot and trusted boot have to be taken to
|
||||
ensure that only trusted code is executed on a device.
|
||||
|
||||
|
||||
## Authentication
|
||||
|
||||
To be able to fully trust data read from flash, all UBIFS data structures
|
||||
stored on flash are authenticated. That is:
|
||||
|
||||
- The index which includes file contents, file metadata like extended
|
||||
attributes, file length etc.
|
||||
- The journal which also contains file contents and metadata by recording changes
|
||||
to the filesystem
|
||||
- The LPT which stores UBI LEB metadata which UBIFS uses for free space accounting
|
||||
|
||||
|
||||
### Index Authentication
|
||||
|
||||
Through UBIFS' concept of a wandering tree, it already takes care of only
|
||||
updating and persisting changed parts from leaf node up to the root node
|
||||
of the full B+ tree. This enables us to augment the index nodes of the tree
|
||||
with a hash over each node's child nodes. As a result, the index basically also
|
||||
a Merkle tree. Since the leaf nodes of the index contain the actual filesystem
|
||||
data, the hashes of their parent index nodes thus cover all the file contents
|
||||
and file metadata. When a file changes, the UBIFS index is updated accordingly
|
||||
from the leaf nodes up to the root node including the master node. This process
|
||||
can be hooked to recompute the hash only for each changed node at the same time.
|
||||
Whenever a file is read, UBIFS can verify the hashes from each leaf node up to
|
||||
the root node to ensure the node's integrity.
|
||||
|
||||
To ensure the authenticity of the whole index, the UBIFS master node stores a
|
||||
keyed hash (HMAC) over its own contents and a hash of the root node of the index
|
||||
tree. As mentioned above, the master node is always written to the flash whenever
|
||||
the index is persisted (ie. on index commit).
|
||||
|
||||
Using this approach only UBIFS index nodes and the master node are changed to
|
||||
include a hash. All other types of nodes will remain unchanged. This reduces
|
||||
the storage overhead which is precious for users of UBIFS (ie. embedded
|
||||
devices).
|
||||
|
||||
|
||||
+---------------+
|
||||
| Master Node |
|
||||
| (hash) |
|
||||
+---------------+
|
||||
|
|
||||
v
|
||||
+-------------------+
|
||||
| Index Node #1 |
|
||||
| |
|
||||
| branch0 branchn |
|
||||
| (hash) (hash) |
|
||||
+-------------------+
|
||||
| ... | (fanout: 8)
|
||||
| |
|
||||
+-------+ +------+
|
||||
| |
|
||||
v v
|
||||
+-------------------+ +-------------------+
|
||||
| Index Node #2 | | Index Node #3 |
|
||||
| | | |
|
||||
| branch0 branchn | | branch0 branchn |
|
||||
| (hash) (hash) | | (hash) (hash) |
|
||||
+-------------------+ +-------------------+
|
||||
| ... | ... |
|
||||
v v v
|
||||
+-----------+ +----------+ +-----------+
|
||||
| Data Node | | INO Node | | DENT Node |
|
||||
+-----------+ +----------+ +-----------+
|
||||
|
||||
|
||||
Figure 3: Coverage areas of index node hash and master node HMAC
|
||||
|
||||
|
||||
|
||||
The most important part for robustness and power-cut safety is to atomically
|
||||
persist the hash and file contents. Here the existing UBIFS logic for how
|
||||
changed nodes are persisted is already designed for this purpose such that
|
||||
UBIFS can safely recover if a power-cut occurs while persisting. Adding
|
||||
hashes to index nodes does not change this since each hash will be persisted
|
||||
atomically together with its respective node.
|
||||
|
||||
|
||||
### Journal Authentication
|
||||
|
||||
The journal is authenticated too. Since the journal is continuously written
|
||||
it is necessary to also add authentication information frequently to the
|
||||
journal so that in case of a powercut not too much data can't be authenticated.
|
||||
This is done by creating a continuous hash beginning from the commit start node
|
||||
over the previous reference nodes, the current reference node, and the bud
|
||||
nodes. From time to time whenever it is suitable authentication nodes are added
|
||||
between the bud nodes. This new node type contains a HMAC over the current state
|
||||
of the hash chain. That way a journal can be authenticated up to the last
|
||||
authentication node. The tail of the journal which may not have a authentication
|
||||
node cannot be authenticated and is skipped during journal replay.
|
||||
|
||||
We get this picture for journal authentication:
|
||||
|
||||
,,,,,,,,
|
||||
,......,...........................................
|
||||
,. CS , hash1.----. hash2.----.
|
||||
,. | , . |hmac . |hmac
|
||||
,. v , . v . v
|
||||
,.REF#0,-> bud -> bud -> bud.-> auth -> bud -> bud.-> auth ...
|
||||
,..|...,...........................................
|
||||
, | ,
|
||||
, | ,,,,,,,,,,,,,,,
|
||||
. | hash3,----.
|
||||
, | , |hmac
|
||||
, v , v
|
||||
, REF#1 -> bud -> bud,-> auth ...
|
||||
,,,|,,,,,,,,,,,,,,,,,,
|
||||
v
|
||||
REF#2 -> ...
|
||||
|
|
||||
V
|
||||
...
|
||||
|
||||
Since the hash also includes the reference nodes an attacker cannot reorder or
|
||||
skip any journal heads for replay. An attacker can only remove bud nodes or
|
||||
reference nodes from the end of the journal, effectively rewinding the
|
||||
filesystem at maximum back to the last commit.
|
||||
|
||||
The location of the log area is stored in the master node. Since the master
|
||||
node is authenticated with a HMAC as described above, it is not possible to
|
||||
tamper with that without detection. The size of the log area is specified when
|
||||
the filesystem is created using `mkfs.ubifs` and stored in the superblock node.
|
||||
To avoid tampering with this and other values stored there, a HMAC is added to
|
||||
the superblock struct. The superblock node is stored in LEB 0 and is only
|
||||
modified on feature flag or similar changes, but never on file changes.
|
||||
|
||||
|
||||
### LPT Authentication
|
||||
|
||||
The location of the LPT root node on the flash is stored in the UBIFS master
|
||||
node. Since the LPT is written and read atomically on every commit, there is
|
||||
no need to authenticate individual nodes of the tree. It suffices to
|
||||
protect the integrity of the full LPT by a simple hash stored in the master
|
||||
node. Since the master node itself is authenticated, the LPTs authenticity can
|
||||
be verified by verifying the authenticity of the master node and comparing the
|
||||
LTP hash stored there with the hash computed from the read on-flash LPT.
|
||||
|
||||
|
||||
## Key Management
|
||||
|
||||
For simplicity, UBIFS authentication uses a single key to compute the HMACs
|
||||
of superblock, master, commit start and reference nodes. This key has to be
|
||||
available on creation of the filesystem (`mkfs.ubifs`) to authenticate the
|
||||
superblock node. Further, it has to be available on mount of the filesystem
|
||||
to verify authenticated nodes and generate new HMACs for changes.
|
||||
|
||||
UBIFS authentication is intended to operate side-by-side with UBIFS encryption
|
||||
(fscrypt) to provide confidentiality and authenticity. Since UBIFS encryption
|
||||
has a different approach of encryption policies per directory, there can be
|
||||
multiple fscrypt master keys and there might be folders without encryption.
|
||||
UBIFS authentication on the other hand has an all-or-nothing approach in the
|
||||
sense that it either authenticates everything of the filesystem or nothing.
|
||||
Because of this and because UBIFS authentication should also be usable without
|
||||
encryption, it does not share the same master key with fscrypt, but manages
|
||||
a dedicated authentication key.
|
||||
|
||||
The API for providing the authentication key has yet to be defined, but the
|
||||
key can eg. be provided by userspace through a keyring similar to the way it
|
||||
is currently done in fscrypt. It should however be noted that the current
|
||||
fscrypt approach has shown its flaws and the userspace API will eventually
|
||||
change [FSCRYPT-POLICY2].
|
||||
|
||||
Nevertheless, it will be possible for a user to provide a single passphrase
|
||||
or key in userspace that covers UBIFS authentication and encryption. This can
|
||||
be solved by the corresponding userspace tools which derive a second key for
|
||||
authentication in addition to the derived fscrypt master key used for
|
||||
encryption.
|
||||
|
||||
To be able to check if the proper key is available on mount, the UBIFS
|
||||
superblock node will additionally store a hash of the authentication key. This
|
||||
approach is similar to the approach proposed for fscrypt encryption policy v2
|
||||
[FSCRYPT-POLICY2].
|
||||
|
||||
|
||||
# Future Extensions
|
||||
|
||||
In certain cases where a vendor wants to provide an authenticated filesystem
|
||||
image to customers, it should be possible to do so without sharing the secret
|
||||
UBIFS authentication key. Instead, in addition the each HMAC a digital
|
||||
signature could be stored where the vendor shares the public key alongside the
|
||||
filesystem image. In case this filesystem has to be modified afterwards,
|
||||
UBIFS can exchange all digital signatures with HMACs on first mount similar
|
||||
to the way the IMA/EVM subsystem deals with such situations. The HMAC key
|
||||
will then have to be provided beforehand in the normal way.
|
||||
|
||||
|
||||
# References
|
||||
|
||||
[CRYPTSETUP2] http://www.saout.de/pipermail/dm-crypt/2017-November/005745.html
|
||||
|
||||
[DMC-CBC-ATTACK] http://www.jakoblell.com/blog/2013/12/22/practical-malleability-attack-against-cbc-encrypted-luks-partitions/
|
||||
|
||||
[DM-INTEGRITY] https://www.kernel.org/doc/Documentation/device-mapper/dm-integrity.txt
|
||||
|
||||
[DM-VERITY] https://www.kernel.org/doc/Documentation/device-mapper/verity.txt
|
||||
|
||||
[FSCRYPT-POLICY2] https://www.spinics.net/lists/linux-ext4/msg58710.html
|
||||
|
||||
[UBIFS-WP] http://www.linux-mtd.infradead.org/doc/ubifs_whitepaper.pdf
|
@ -91,6 +91,13 @@ chk_data_crc do not skip checking CRCs on data nodes
|
||||
compr=none override default compressor and set it to "none"
|
||||
compr=lzo override default compressor and set it to "lzo"
|
||||
compr=zlib override default compressor and set it to "zlib"
|
||||
auth_key= specify the key used for authenticating the filesystem.
|
||||
Passing this option makes authentication mandatory.
|
||||
The passed key must be present in the kernel keyring
|
||||
and must be of type 'logon'
|
||||
auth_hash_name= The hash algorithm used for authentication. Used for
|
||||
both hashing and for creating HMACs. Typical values
|
||||
include "sha256" or "sha512"
|
||||
|
||||
|
||||
Quick usage instructions
|
||||
|
@ -883,8 +883,9 @@ struct file_operations {
|
||||
unsigned (*mmap_capabilities)(struct file *);
|
||||
#endif
|
||||
ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int);
|
||||
int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
|
||||
int (*dedupe_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
|
||||
loff_t (*remap_file_range)(struct file *file_in, loff_t pos_in,
|
||||
struct file *file_out, loff_t pos_out,
|
||||
loff_t len, unsigned int remap_flags);
|
||||
int (*fadvise)(struct file *, loff_t, loff_t, int);
|
||||
};
|
||||
|
||||
@ -960,11 +961,18 @@ otherwise noted.
|
||||
|
||||
copy_file_range: called by the copy_file_range(2) system call.
|
||||
|
||||
clone_file_range: called by the ioctl(2) system call for FICLONERANGE and
|
||||
FICLONE commands.
|
||||
|
||||
dedupe_file_range: called by the ioctl(2) system call for FIDEDUPERANGE
|
||||
command.
|
||||
remap_file_range: called by the ioctl(2) system call for FICLONERANGE and
|
||||
FICLONE and FIDEDUPERANGE commands to remap file ranges. An
|
||||
implementation should remap len bytes at pos_in of the source file into
|
||||
the dest file at pos_out. Implementations must handle callers passing
|
||||
in len == 0; this means "remap to the end of the source file". The
|
||||
return value should the number of bytes remapped, or the usual
|
||||
negative error code if errors occurred before any bytes were remapped.
|
||||
The remap_flags parameter accepts REMAP_FILE_* flags. If
|
||||
REMAP_FILE_DEDUP is set then the implementation must only remap if the
|
||||
requested file ranges have identical contents. If REMAP_CAN_SHORTEN is
|
||||
set, the caller is ok with the implementation shortening the request
|
||||
length to satisfy alignment or EOF requirements (or any other reason).
|
||||
|
||||
fadvise: possibly called by the fadvise64() system call.
|
||||
|
||||
|
@ -537,21 +537,6 @@ more details, with real examples.
|
||||
The third parameter may be a text as in this example, but it may also
|
||||
be an expanded variable or a macro.
|
||||
|
||||
cc-fullversion
|
||||
cc-fullversion is useful when the exact version of gcc is needed.
|
||||
One typical use-case is when a specific GCC version is broken.
|
||||
cc-fullversion points out a more specific version than cc-version does.
|
||||
|
||||
Example:
|
||||
#arch/powerpc/Makefile
|
||||
$(Q)if test "$(cc-fullversion)" = "040200" ; then \
|
||||
echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \
|
||||
false ; \
|
||||
fi
|
||||
|
||||
In this example for a specific GCC version the build will error out
|
||||
explaining to the user why it stops.
|
||||
|
||||
cc-cross-prefix
|
||||
cc-cross-prefix is used to check if there exists a $(CC) in path with
|
||||
one of the listed prefixes. The first prefix where there exist a
|
||||
|
81
Documentation/laptops/lg-laptop.rst
Normal file
81
Documentation/laptops/lg-laptop.rst
Normal file
@ -0,0 +1,81 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
LG Gram laptop extra features
|
||||
=============================
|
||||
|
||||
By Matan Ziv-Av <matan@svgalib.org>
|
||||
|
||||
|
||||
Hotkeys
|
||||
-------
|
||||
|
||||
The following FN keys are ignored by the kernel without this driver:
|
||||
- FN-F1 (LG control panel) - Generates F15
|
||||
- FN-F5 (Touchpad toggle) - Generates F13
|
||||
- FN-F6 (Airplane mode) - Generates RFKILL
|
||||
- FN-F8 (Keyboard backlight) - Generates F16.
|
||||
This key also changes keyboard backlight mode.
|
||||
- FN-F9 (Reader mode) - Generates F14
|
||||
|
||||
The rest of the FN key work without a need for a special driver.
|
||||
|
||||
|
||||
Reader mode
|
||||
-----------
|
||||
|
||||
Writing 0/1 to /sys/devices/platform/lg-laptop/reader_mode disables/enables
|
||||
reader mode. In this mode the screen colors change (blue color reduced),
|
||||
and the reader mode indicator LED (on F9 key) turns on.
|
||||
|
||||
|
||||
FN Lock
|
||||
-------
|
||||
|
||||
Writing 0/1 to /sys/devices/platform/lg-laptop/fn_lock disables/enables
|
||||
FN lock.
|
||||
|
||||
|
||||
Battery care limit
|
||||
------------------
|
||||
|
||||
Writing 80/100 to /sys/devices/platform/lg-laptop/battery_care_limit
|
||||
sets the maximum capacity to charge the battery. Limiting the charge
|
||||
reduces battery capacity loss over time.
|
||||
|
||||
This value is reset to 100 when the kernel boots.
|
||||
|
||||
|
||||
Fan mode
|
||||
--------
|
||||
|
||||
Writing 1/0 to /sys/devices/platform/lg-laptop/fan_mode disables/enables
|
||||
the fan silent mode.
|
||||
|
||||
|
||||
USB charge
|
||||
----------
|
||||
|
||||
Writing 0/1 to /sys/devices/platform/lg-laptop/usb_charge disables/enables
|
||||
charging another device from the USB port while the device is turned off.
|
||||
|
||||
This value is reset to 0 when the kernel boots.
|
||||
|
||||
|
||||
LEDs
|
||||
~~~~
|
||||
|
||||
The are two LED devices supported by the driver:
|
||||
|
||||
Keyboard backlight
|
||||
------------------
|
||||
|
||||
A led device named kbd_led controls the keyboard backlight. There are three
|
||||
lighting level: off (0), low (127) and high (255).
|
||||
|
||||
The keyboard backlight is also controlled by the key combination FN-F8
|
||||
which cycles through those levels.
|
||||
|
||||
|
||||
Touchpad indicator LED
|
||||
----------------------
|
||||
|
||||
On the F5 key. Controlled by led device names tpad_led.
|
@ -20,7 +20,7 @@ Enabling the driver
|
||||
The driver is enabled via the standard kernel configuration system,
|
||||
using the make command::
|
||||
|
||||
make oldconfig/silentoldconfig/menuconfig/etc.
|
||||
make oldconfig/menuconfig/etc.
|
||||
|
||||
The driver is located in the menu structure at:
|
||||
|
||||
|
@ -316,6 +316,17 @@ tcp_frto - INTEGER
|
||||
|
||||
By default it's enabled with a non-zero value. 0 disables F-RTO.
|
||||
|
||||
tcp_fwmark_accept - BOOLEAN
|
||||
If set, incoming connections to listening sockets that do not have a
|
||||
socket mark will set the mark of the accepting socket to the fwmark of
|
||||
the incoming SYN packet. This will cause all packets on that connection
|
||||
(starting from the first SYNACK) to be sent with that fwmark. The
|
||||
listening socket's mark is unchanged. Listening sockets that already
|
||||
have a fwmark set via setsockopt(SOL_SOCKET, SO_MARK, ...) are
|
||||
unaffected.
|
||||
|
||||
Default: 0
|
||||
|
||||
tcp_invalid_ratelimit - INTEGER
|
||||
Limit the maximal rate for sending duplicate acknowledgments
|
||||
in response to incoming TCP packets that are for an existing
|
||||
|
@ -25,6 +25,7 @@ Below are the essential guides that every developer should read.
|
||||
code-of-conduct-interpretation
|
||||
development-process
|
||||
submitting-patches
|
||||
programming-language
|
||||
coding-style
|
||||
maintainer-pgp-guide
|
||||
email-clients
|
||||
|
45
Documentation/process/programming-language.rst
Normal file
45
Documentation/process/programming-language.rst
Normal file
@ -0,0 +1,45 @@
|
||||
.. _programming_language:
|
||||
|
||||
Programming Language
|
||||
====================
|
||||
|
||||
The kernel is written in the C programming language [c-language]_.
|
||||
More precisely, the kernel is typically compiled with ``gcc`` [gcc]_
|
||||
under ``-std=gnu89`` [gcc-c-dialect-options]_: the GNU dialect of ISO C90
|
||||
(including some C99 features).
|
||||
|
||||
This dialect contains many extensions to the language [gnu-extensions]_,
|
||||
and many of them are used within the kernel as a matter of course.
|
||||
|
||||
There is some support for compiling the kernel with ``clang`` [clang]_
|
||||
and ``icc`` [icc]_ for several of the architectures, although at the time
|
||||
of writing it is not completed, requiring third-party patches.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
|
||||
One of the common extensions used throughout the kernel are attributes
|
||||
[gcc-attribute-syntax]_. Attributes allow to introduce
|
||||
implementation-defined semantics to language entities (like variables,
|
||||
functions or types) without having to make significant syntactic changes
|
||||
to the language (e.g. adding a new keyword) [n2049]_.
|
||||
|
||||
In some cases, attributes are optional (i.e. a compiler not supporting them
|
||||
should still produce proper code, even if it is slower or does not perform
|
||||
as many compile-time checks/diagnostics).
|
||||
|
||||
The kernel defines pseudo-keywords (e.g. ``__pure``) instead of using
|
||||
directly the GNU attribute syntax (e.g. ``__attribute__((__pure__))``)
|
||||
in order to feature detect which ones can be used and/or to shorten the code.
|
||||
|
||||
Please refer to ``include/linux/compiler_attributes.h`` for more information.
|
||||
|
||||
.. [c-language] http://www.open-std.org/jtc1/sc22/wg14/www/standards
|
||||
.. [gcc] https://gcc.gnu.org
|
||||
.. [clang] https://clang.llvm.org
|
||||
.. [icc] https://software.intel.com/en-us/c-compilers
|
||||
.. [gcc-c-dialect-options] https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
|
||||
.. [gnu-extensions] https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
|
||||
.. [gcc-attribute-syntax] https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html
|
||||
.. [n2049] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2049.pdf
|
||||
|
@ -859,6 +859,7 @@ The keyctl syscall functions are:
|
||||
and either the buffer length or the OtherInfo length exceeds the
|
||||
allowed length.
|
||||
|
||||
|
||||
* Restrict keyring linkage::
|
||||
|
||||
long keyctl(KEYCTL_RESTRICT_KEYRING, key_serial_t keyring,
|
||||
@ -890,6 +891,116 @@ The keyctl syscall functions are:
|
||||
applicable to the asymmetric key type.
|
||||
|
||||
|
||||
* Query an asymmetric key::
|
||||
|
||||
long keyctl(KEYCTL_PKEY_QUERY,
|
||||
key_serial_t key_id, unsigned long reserved,
|
||||
struct keyctl_pkey_query *info);
|
||||
|
||||
Get information about an asymmetric key. The information is returned in
|
||||
the keyctl_pkey_query struct::
|
||||
|
||||
__u32 supported_ops;
|
||||
__u32 key_size;
|
||||
__u16 max_data_size;
|
||||
__u16 max_sig_size;
|
||||
__u16 max_enc_size;
|
||||
__u16 max_dec_size;
|
||||
__u32 __spare[10];
|
||||
|
||||
``supported_ops`` contains a bit mask of flags indicating which ops are
|
||||
supported. This is constructed from a bitwise-OR of::
|
||||
|
||||
KEYCTL_SUPPORTS_{ENCRYPT,DECRYPT,SIGN,VERIFY}
|
||||
|
||||
``key_size`` indicated the size of the key in bits.
|
||||
|
||||
``max_*_size`` indicate the maximum sizes in bytes of a blob of data to be
|
||||
signed, a signature blob, a blob to be encrypted and a blob to be
|
||||
decrypted.
|
||||
|
||||
``__spare[]`` must be set to 0. This is intended for future use to hand
|
||||
over one or more passphrases needed unlock a key.
|
||||
|
||||
If successful, 0 is returned. If the key is not an asymmetric key,
|
||||
EOPNOTSUPP is returned.
|
||||
|
||||
|
||||
* Encrypt, decrypt, sign or verify a blob using an asymmetric key::
|
||||
|
||||
long keyctl(KEYCTL_PKEY_ENCRYPT,
|
||||
const struct keyctl_pkey_params *params,
|
||||
const char *info,
|
||||
const void *in,
|
||||
void *out);
|
||||
|
||||
long keyctl(KEYCTL_PKEY_DECRYPT,
|
||||
const struct keyctl_pkey_params *params,
|
||||
const char *info,
|
||||
const void *in,
|
||||
void *out);
|
||||
|
||||
long keyctl(KEYCTL_PKEY_SIGN,
|
||||
const struct keyctl_pkey_params *params,
|
||||
const char *info,
|
||||
const void *in,
|
||||
void *out);
|
||||
|
||||
long keyctl(KEYCTL_PKEY_VERIFY,
|
||||
const struct keyctl_pkey_params *params,
|
||||
const char *info,
|
||||
const void *in,
|
||||
const void *in2);
|
||||
|
||||
Use an asymmetric key to perform a public-key cryptographic operation a
|
||||
blob of data. For encryption and verification, the asymmetric key may
|
||||
only need the public parts to be available, but for decryption and signing
|
||||
the private parts are required also.
|
||||
|
||||
The parameter block pointed to by params contains a number of integer
|
||||
values::
|
||||
|
||||
__s32 key_id;
|
||||
__u32 in_len;
|
||||
__u32 out_len;
|
||||
__u32 in2_len;
|
||||
|
||||
``key_id`` is the ID of the asymmetric key to be used. ``in_len`` and
|
||||
``in2_len`` indicate the amount of data in the in and in2 buffers and
|
||||
``out_len`` indicates the size of the out buffer as appropriate for the
|
||||
above operations.
|
||||
|
||||
For a given operation, the in and out buffers are used as follows::
|
||||
|
||||
Operation ID in,in_len out,out_len in2,in2_len
|
||||
======================= =============== =============== ===============
|
||||
KEYCTL_PKEY_ENCRYPT Raw data Encrypted data -
|
||||
KEYCTL_PKEY_DECRYPT Encrypted data Raw data -
|
||||
KEYCTL_PKEY_SIGN Raw data Signature -
|
||||
KEYCTL_PKEY_VERIFY Raw data - Signature
|
||||
|
||||
``info`` is a string of key=value pairs that supply supplementary
|
||||
information. These include:
|
||||
|
||||
``enc=<encoding>`` The encoding of the encrypted/signature blob. This
|
||||
can be "pkcs1" for RSASSA-PKCS1-v1.5 or
|
||||
RSAES-PKCS1-v1.5; "pss" for "RSASSA-PSS"; "oaep" for
|
||||
"RSAES-OAEP". If omitted or is "raw", the raw output
|
||||
of the encryption function is specified.
|
||||
|
||||
``hash=<algo>`` If the data buffer contains the output of a hash
|
||||
function and the encoding includes some indication of
|
||||
which hash function was used, the hash function can be
|
||||
specified with this, eg. "hash=sha256".
|
||||
|
||||
The ``__spare[]`` space in the parameter block must be set to 0. This is
|
||||
intended, amongst other things, to allow the passing of passphrases
|
||||
required to unlock a key.
|
||||
|
||||
If successful, encrypt, decrypt and sign all return the amount of data
|
||||
written into the output buffer. Verification returns 0 on success.
|
||||
|
||||
|
||||
Kernel Services
|
||||
===============
|
||||
|
||||
@ -1483,6 +1594,112 @@ The structure has a number of fields, some of which are mandatory:
|
||||
attempted key link operation. If there is no match, -EINVAL is returned.
|
||||
|
||||
|
||||
* ``int (*asym_eds_op)(struct kernel_pkey_params *params,
|
||||
const void *in, void *out);``
|
||||
``int (*asym_verify_signature)(struct kernel_pkey_params *params,
|
||||
const void *in, const void *in2);``
|
||||
|
||||
These methods are optional. If provided the first allows a key to be
|
||||
used to encrypt, decrypt or sign a blob of data, and the second allows a
|
||||
key to verify a signature.
|
||||
|
||||
In all cases, the following information is provided in the params block::
|
||||
|
||||
struct kernel_pkey_params {
|
||||
struct key *key;
|
||||
const char *encoding;
|
||||
const char *hash_algo;
|
||||
char *info;
|
||||
__u32 in_len;
|
||||
union {
|
||||
__u32 out_len;
|
||||
__u32 in2_len;
|
||||
};
|
||||
enum kernel_pkey_operation op : 8;
|
||||
};
|
||||
|
||||
This includes the key to be used; a string indicating the encoding to use
|
||||
(for instance, "pkcs1" may be used with an RSA key to indicate
|
||||
RSASSA-PKCS1-v1.5 or RSAES-PKCS1-v1.5 encoding or "raw" if no encoding);
|
||||
the name of the hash algorithm used to generate the data for a signature
|
||||
(if appropriate); the sizes of the input and output (or second input)
|
||||
buffers; and the ID of the operation to be performed.
|
||||
|
||||
For a given operation ID, the input and output buffers are used as
|
||||
follows::
|
||||
|
||||
Operation ID in,in_len out,out_len in2,in2_len
|
||||
======================= =============== =============== ===============
|
||||
kernel_pkey_encrypt Raw data Encrypted data -
|
||||
kernel_pkey_decrypt Encrypted data Raw data -
|
||||
kernel_pkey_sign Raw data Signature -
|
||||
kernel_pkey_verify Raw data - Signature
|
||||
|
||||
asym_eds_op() deals with encryption, decryption and signature creation as
|
||||
specified by params->op. Note that params->op is also set for
|
||||
asym_verify_signature().
|
||||
|
||||
Encrypting and signature creation both take raw data in the input buffer
|
||||
and return the encrypted result in the output buffer. Padding may have
|
||||
been added if an encoding was set. In the case of signature creation,
|
||||
depending on the encoding, the padding created may need to indicate the
|
||||
digest algorithm - the name of which should be supplied in hash_algo.
|
||||
|
||||
Decryption takes encrypted data in the input buffer and returns the raw
|
||||
data in the output buffer. Padding will get checked and stripped off if
|
||||
an encoding was set.
|
||||
|
||||
Verification takes raw data in the input buffer and the signature in the
|
||||
second input buffer and checks that the one matches the other. Padding
|
||||
will be validated. Depending on the encoding, the digest algorithm used
|
||||
to generate the raw data may need to be indicated in hash_algo.
|
||||
|
||||
If successful, asym_eds_op() should return the number of bytes written
|
||||
into the output buffer. asym_verify_signature() should return 0.
|
||||
|
||||
A variety of errors may be returned, including EOPNOTSUPP if the operation
|
||||
is not supported; EKEYREJECTED if verification fails; ENOPKG if the
|
||||
required crypto isn't available.
|
||||
|
||||
|
||||
* ``int (*asym_query)(const struct kernel_pkey_params *params,
|
||||
struct kernel_pkey_query *info);``
|
||||
|
||||
This method is optional. If provided it allows information about the
|
||||
public or asymmetric key held in the key to be determined.
|
||||
|
||||
The parameter block is as for asym_eds_op() and co. but in_len and out_len
|
||||
are unused. The encoding and hash_algo fields should be used to reduce
|
||||
the returned buffer/data sizes as appropriate.
|
||||
|
||||
If successful, the following information is filled in::
|
||||
|
||||
struct kernel_pkey_query {
|
||||
__u32 supported_ops;
|
||||
__u32 key_size;
|
||||
__u16 max_data_size;
|
||||
__u16 max_sig_size;
|
||||
__u16 max_enc_size;
|
||||
__u16 max_dec_size;
|
||||
};
|
||||
|
||||
The supported_ops field will contain a bitmask indicating what operations
|
||||
are supported by the key, including encryption of a blob, decryption of a
|
||||
blob, signing a blob and verifying the signature on a blob. The following
|
||||
constants are defined for this::
|
||||
|
||||
KEYCTL_SUPPORTS_{ENCRYPT,DECRYPT,SIGN,VERIFY}
|
||||
|
||||
The key_size field is the size of the key in bits. max_data_size and
|
||||
max_sig_size are the maximum raw data and signature sizes for creation and
|
||||
verification of a signature; max_enc_size and max_dec_size are the maximum
|
||||
raw data and signature sizes for encryption and decryption. The
|
||||
max_*_size fields are measured in bytes.
|
||||
|
||||
If successful, 0 will be returned. If the key doesn't support this,
|
||||
EOPNOTSUPP will be returned.
|
||||
|
||||
|
||||
Request-Key Callback Service
|
||||
============================
|
||||
|
||||
|
@ -302,11 +302,11 @@ sure structure holes are cleared.
|
||||
Memory poisoning
|
||||
----------------
|
||||
|
||||
When releasing memory, it is best to poison the contents (clear stack on
|
||||
syscall return, wipe heap memory on a free), to avoid reuse attacks that
|
||||
rely on the old contents of memory. This frustrates many uninitialized
|
||||
variable attacks, stack content exposures, heap content exposures, and
|
||||
use-after-free attacks.
|
||||
When releasing memory, it is best to poison the contents, to avoid reuse
|
||||
attacks that rely on the old contents of memory. E.g., clear stack on a
|
||||
syscall return (``CONFIG_GCC_PLUGIN_STACKLEAK``), wipe heap memory on a
|
||||
free. This frustrates many uninitialized variable attacks, stack content
|
||||
exposures, heap content exposures, and use-after-free attacks.
|
||||
|
||||
Destination tracking
|
||||
--------------------
|
||||
|
@ -89,6 +89,7 @@ show up in /proc/sys/kernel:
|
||||
- shmmni
|
||||
- softlockup_all_cpu_backtrace
|
||||
- soft_watchdog
|
||||
- stack_erasing
|
||||
- stop-a [ SPARC only ]
|
||||
- sysrq ==> Documentation/admin-guide/sysrq.rst
|
||||
- sysctl_writes_strict
|
||||
@ -987,6 +988,23 @@ detect a hard lockup condition.
|
||||
|
||||
==============================================================
|
||||
|
||||
stack_erasing
|
||||
|
||||
This parameter can be used to control kernel stack erasing at the end
|
||||
of syscalls for kernels built with CONFIG_GCC_PLUGIN_STACKLEAK.
|
||||
|
||||
That erasing reduces the information which kernel stack leak bugs
|
||||
can reveal and blocks some uninitialized stack variable attacks.
|
||||
The tradeoff is the performance impact: on a single CPU system kernel
|
||||
compilation sees a 1% slowdown, other systems and workloads may vary.
|
||||
|
||||
0: kernel stack erasing is disabled, STACKLEAK_METRICS are not updated.
|
||||
|
||||
1: kernel stack erasing is enabled (default), it is performed before
|
||||
returning to the userspace at the end of syscalls.
|
||||
|
||||
==============================================================
|
||||
|
||||
tainted:
|
||||
|
||||
Non-zero if the kernel has been tainted. Numeric values, which can be
|
||||
|
@ -146,3 +146,6 @@ Their order is preserved but their base will be offset early at boot time.
|
||||
Be very careful vs. KASLR when changing anything here. The KASLR address
|
||||
range must not overlap with anything except the KASAN shadow area, which is
|
||||
correct as KASAN disables KASLR.
|
||||
|
||||
For both 4- and 5-level layouts, the STACKLEAK_POISON value in the last 2MB
|
||||
hole: ffffffffffff4111
|
||||
|
45
MAINTAINERS
45
MAINTAINERS
@ -376,7 +376,7 @@ F: drivers/platform/x86/i2c-multi-instantiate.c
|
||||
ACPI PMIC DRIVERS
|
||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
M: Len Brown <lenb@kernel.org>
|
||||
R: Andy Shevchenko <andy@infradead.org>
|
||||
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
R: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||
@ -3737,6 +3737,11 @@ L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/compal-laptop.c
|
||||
|
||||
COMPILER ATTRIBUTES
|
||||
M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
||||
S: Maintained
|
||||
F: include/linux/compiler_attributes.h
|
||||
|
||||
CONEXANT ACCESSRUNNER USB DRIVER
|
||||
L: accessrunner-general@lists.sourceforge.net
|
||||
W: http://accessrunner.sourceforge.net/
|
||||
@ -4207,6 +4212,12 @@ M: Pali Rohár <pali.rohar@gmail.com>
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell-rbtn.*
|
||||
|
||||
DELL REMOTE BIOS UPDATE DRIVER
|
||||
M: Stuart Hayes <stuart.w.hayes@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell_rbu.c
|
||||
|
||||
DELL LAPTOP SMM DRIVER
|
||||
M: Pali Rohár <pali.rohar@gmail.com>
|
||||
S: Maintained
|
||||
@ -4214,10 +4225,11 @@ F: drivers/hwmon/dell-smm-hwmon.c
|
||||
F: include/uapi/linux/i8k.h
|
||||
|
||||
DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas)
|
||||
M: Doug Warzecha <Douglas_Warzecha@dell.com>
|
||||
M: Stuart Hayes <stuart.w.hayes@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/dcdbas.txt
|
||||
F: drivers/firmware/dcdbas.*
|
||||
F: drivers/platform/x86/dcdbas.*
|
||||
|
||||
DELL WMI NOTIFICATIONS DRIVER
|
||||
M: Matthew Garrett <mjg59@srcf.ucam.org>
|
||||
@ -5871,6 +5883,14 @@ L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/busses/i2c-cpm.c
|
||||
|
||||
FREESCALE IMX LPI2C DRIVER
|
||||
M: Dong Aisheng <aisheng.dong@nxp.com>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
L: linux-imx@nxp.com
|
||||
S: Maintained
|
||||
F: drivers/i2c/busses/i2c-imx-lpi2c.c
|
||||
F: Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.txt
|
||||
|
||||
FREESCALE IMX / MXC FEC DRIVER
|
||||
M: Fugang Duan <fugang.duan@nxp.com>
|
||||
L: netdev@vger.kernel.org
|
||||
@ -7347,6 +7367,12 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: sound/soc/intel/
|
||||
|
||||
INTEL ATOMISP2 DUMMY / POWER-MANAGEMENT DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/intel_atomisp2_pm.c
|
||||
|
||||
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
||||
M: Intel SCU Linux support <intel-linux-scu@intel.com>
|
||||
M: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
||||
@ -7533,7 +7559,6 @@ M: Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
|
||||
M: Vishwanath Somayaji <vishwanath.somayaji@intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/x86/include/asm/pmc_core.h
|
||||
F: drivers/platform/x86/intel_pmc_core*
|
||||
|
||||
INTEL PMC/P-Unit IPC DRIVER
|
||||
@ -7577,7 +7602,8 @@ F: drivers/infiniband/hw/i40iw/
|
||||
F: include/uapi/rdma/i40iw-abi.h
|
||||
|
||||
INTEL TELEMETRY DRIVER
|
||||
M: Souvik Kumar Chakravarty <souvik.k.chakravarty@intel.com>
|
||||
M: Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>
|
||||
M: "David E. Box" <david.e.box@linux.intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/x86/include/asm/intel_telemetry.h
|
||||
@ -8310,6 +8336,14 @@ W: http://legousb.sourceforge.net/
|
||||
S: Maintained
|
||||
F: drivers/usb/misc/legousbtower.c
|
||||
|
||||
LG LAPTOP EXTRAS
|
||||
M: Matan Ziv-Av <matan@svgalib.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-platform-lg-laptop
|
||||
F: Documentation/laptops/lg-laptop.rst
|
||||
F: drivers/platform/x86/lg-laptop.c
|
||||
|
||||
LG2160 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -15829,7 +15863,6 @@ F: net/vmw_vsock/virtio_transport_common.c
|
||||
F: net/vmw_vsock/virtio_transport.c
|
||||
F: drivers/net/vsockmon.c
|
||||
F: drivers/vhost/vsock.c
|
||||
F: drivers/vhost/vsock.h
|
||||
F: tools/testing/vsock/
|
||||
|
||||
VIRTIO CONSOLE DRIVER
|
||||
|
8
Makefile
8
Makefile
@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
PATCHLEVEL = 20
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = "People's Front"
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -485,7 +485,7 @@ ifneq ($(KBUILD_SRC),)
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree)
|
||||
endif
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
|
||||
ifneq ($(CROSS_COMPILE),)
|
||||
CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
|
||||
@ -702,7 +702,7 @@ stackp-flags-$(CONFIG_STACKPROTECTOR_STRONG) := -fstack-protector-strong
|
||||
|
||||
KBUILD_CFLAGS += $(stackp-flags-y)
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||
|
@ -429,6 +429,13 @@ config SECCOMP_FILTER
|
||||
|
||||
See Documentation/userspace-api/seccomp_filter.rst for details.
|
||||
|
||||
config HAVE_ARCH_STACKLEAK
|
||||
bool
|
||||
help
|
||||
An architecture should select this if it has the code which
|
||||
fills the used part of the kernel stack with the STACKLEAK_POISON
|
||||
value before returning from system calls.
|
||||
|
||||
config HAVE_STACKPROTECTOR
|
||||
bool
|
||||
help
|
||||
|
@ -923,7 +923,7 @@
|
||||
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&rcc HASH1>;
|
||||
resets = <&rcc HASH1_R>;
|
||||
dmas = <&mdma1 31 0x10 0x1000A02 0x0 0x0 0x0>;
|
||||
dmas = <&mdma1 31 0x10 0x1000A02 0x0 0x0>;
|
||||
dma-names = "in";
|
||||
dma-maxburst = <2>;
|
||||
status = "disabled";
|
||||
|
@ -7,6 +7,9 @@ config DMABOUNCE
|
||||
bool
|
||||
select ZONE_DMA
|
||||
|
||||
config KRAIT_L2_ACCESSORS
|
||||
bool
|
||||
|
||||
config SHARP_LOCOMO
|
||||
bool
|
||||
|
||||
|
@ -7,6 +7,7 @@ obj-y += firmware.o
|
||||
|
||||
obj-$(CONFIG_SA1111) += sa1111.o
|
||||
obj-$(CONFIG_DMABOUNCE) += dmabounce.o
|
||||
obj-$(CONFIG_KRAIT_L2_ACCESSORS) += krait-l2-accessors.o
|
||||
obj-$(CONFIG_SHARP_LOCOMO) += locomo.o
|
||||
obj-$(CONFIG_SHARP_PARAM) += sharpsl_param.o
|
||||
obj-$(CONFIG_SHARP_SCOOP) += scoop.o
|
||||
|
48
arch/arm/common/krait-l2-accessors.c
Normal file
48
arch/arm/common/krait-l2-accessors.c
Normal file
@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/krait-l2-accessors.h>
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(krait_l2_lock);
|
||||
|
||||
void krait_set_l2_indirect_reg(u32 addr, u32 val)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&krait_l2_lock, flags);
|
||||
/*
|
||||
* Select the L2 window by poking l2cpselr, then write to the window
|
||||
* via l2cpdr.
|
||||
*/
|
||||
asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
|
||||
isb();
|
||||
asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val));
|
||||
isb();
|
||||
|
||||
raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(krait_set_l2_indirect_reg);
|
||||
|
||||
u32 krait_get_l2_indirect_reg(u32 addr)
|
||||
{
|
||||
u32 val;
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&krait_l2_lock, flags);
|
||||
/*
|
||||
* Select the L2 window by poking l2cpselr, then read from the window
|
||||
* via l2cpdr.
|
||||
*/
|
||||
asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
|
||||
isb();
|
||||
asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val));
|
||||
|
||||
raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
|
||||
|
||||
return val;
|
||||
}
|
||||
EXPORT_SYMBOL(krait_get_l2_indirect_reg);
|
@ -1,6 +1,7 @@
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EMBEDDED=y
|
||||
|
9
arch/arm/include/asm/krait-l2-accessors.h
Normal file
9
arch/arm/include/asm/krait-l2-accessors.h
Normal file
@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef __ASMARM_KRAIT_L2_ACCESSORS_H
|
||||
#define __ASMARM_KRAIT_L2_ACCESSORS_H
|
||||
|
||||
extern void krait_set_l2_indirect_reg(u32 addr, u32 val);
|
||||
extern u32 krait_get_l2_indirect_reg(u32 addr);
|
||||
|
||||
#endif
|
@ -1,21 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-davinci/include/mach/clock.h
|
||||
*
|
||||
* Clock control driver for DaVinci - header file
|
||||
*
|
||||
* Authors: Vladimir Barinov <source@mvista.com>
|
||||
*
|
||||
* 2007 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
#ifndef __ASM_ARCH_DAVINCI_CLOCK_H
|
||||
#define __ASM_ARCH_DAVINCI_CLOCK_H
|
||||
|
||||
struct clk;
|
||||
|
||||
int davinci_clk_reset_assert(struct clk *c);
|
||||
int davinci_clk_reset_deassert(struct clk *c);
|
||||
|
||||
#endif
|
@ -773,7 +773,7 @@ static struct plat_serial8250_port ams_delta_modem_ports[] = {
|
||||
{
|
||||
.membase = IOMEM(MODEM_VIRT),
|
||||
.mapbase = MODEM_PHYS,
|
||||
.irq = -EINVAL, /* changed later */
|
||||
.irq = IRQ_NOTCONNECTED, /* changed later */
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.irqflags = IRQF_TRIGGER_RISING,
|
||||
.iotype = UPIO_MEM,
|
||||
@ -864,8 +864,7 @@ static int __init modem_nreset_init(void)
|
||||
|
||||
|
||||
/*
|
||||
* This function expects MODEM IRQ number already assigned to the port
|
||||
* and fails if it's not.
|
||||
* This function expects MODEM IRQ number already assigned to the port.
|
||||
* The MODEM device requires its RESET# pin kept high during probe.
|
||||
* That requirement can be fulfilled in several ways:
|
||||
* - with a descriptor of already functional modem_nreset regulator
|
||||
@ -888,9 +887,6 @@ static int __init ams_delta_modem_init(void)
|
||||
if (!machine_is_ams_delta())
|
||||
return -ENODEV;
|
||||
|
||||
if (ams_delta_modem_ports[0].irq < 0)
|
||||
return ams_delta_modem_ports[0].irq;
|
||||
|
||||
omap_cfg_reg(M14_1510_GPIO2);
|
||||
|
||||
/* Initialize the modem_nreset regulator consumer before use */
|
||||
|
@ -28,10 +28,15 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,
|
||||
unsigned int mpp_max, void __iomem *dev_bus)
|
||||
{
|
||||
unsigned int mpp_nr_regs = (1 + mpp_max/8);
|
||||
u32 mpp_ctrl[mpp_nr_regs];
|
||||
u32 mpp_ctrl[8];
|
||||
int i;
|
||||
|
||||
printk(KERN_DEBUG "initial MPP regs:");
|
||||
if (mpp_nr_regs > ARRAY_SIZE(mpp_ctrl)) {
|
||||
printk(KERN_ERR "orion_mpp_conf: invalid mpp_max\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < mpp_nr_regs; i++) {
|
||||
mpp_ctrl[i] = readl(mpp_ctrl_addr(i, dev_bus));
|
||||
printk(" %08x", mpp_ctrl[i]);
|
||||
|
@ -134,6 +134,7 @@ vdso_install:
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
# We need to generate vdso-offsets.h before compiling certain files in kernel/.
|
||||
# In order to do that, we should use the archprepare target, but we can't since
|
||||
# asm-offsets.h is included in some files used to generate vdso-offsets.h, and
|
||||
@ -143,6 +144,7 @@ archclean:
|
||||
prepare: vdso_prepare
|
||||
vdso_prepare: prepare0
|
||||
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h
|
||||
endif
|
||||
|
||||
define archhelp
|
||||
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
|
||||
|
@ -308,6 +308,9 @@ CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
|
||||
CONFIG_SERIAL_MVEBU_UART=y
|
||||
CONFIG_SERIAL_DEV_BUS=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_IPMI_HANDLER=m
|
||||
CONFIG_IPMI_DEVICE_INTERFACE=m
|
||||
CONFIG_IPMI_SI=m
|
||||
CONFIG_TCG_TPM=y
|
||||
CONFIG_TCG_TIS_I2C_INFINEON=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
|
@ -96,6 +96,7 @@ static inline unsigned long __percpu_##op(void *ptr, \
|
||||
: [val] "Ir" (val)); \
|
||||
break; \
|
||||
default: \
|
||||
ret = 0; \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
\
|
||||
@ -125,6 +126,7 @@ static inline unsigned long __percpu_read(void *ptr, int size)
|
||||
ret = READ_ONCE(*(u64 *)ptr);
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
@ -194,6 +196,7 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val,
|
||||
: [val] "r" (val));
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
||||
/**
|
||||
* elfcorehdr_read - read from ELF core header
|
||||
* @buf: buffer where the data is placed
|
||||
* @csize: number of bytes to read
|
||||
* @count: number of bytes to read
|
||||
* @ppos: address in the memory
|
||||
*
|
||||
* This function reads @count bytes from elf core header which exists
|
||||
|
@ -23,7 +23,9 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/sched/debug.h>
|
||||
#include <linux/set_memory.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/cacheflush.h>
|
||||
@ -42,10 +44,21 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||
static void __kprobes
|
||||
post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *);
|
||||
|
||||
static int __kprobes patch_text(kprobe_opcode_t *addr, u32 opcode)
|
||||
{
|
||||
void *addrs[1];
|
||||
u32 insns[1];
|
||||
|
||||
addrs[0] = addr;
|
||||
insns[0] = opcode;
|
||||
|
||||
return aarch64_insn_patch_text(addrs, insns, 1);
|
||||
}
|
||||
|
||||
static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
|
||||
{
|
||||
/* prepare insn slot */
|
||||
p->ainsn.api.insn[0] = cpu_to_le32(p->opcode);
|
||||
patch_text(p->ainsn.api.insn, p->opcode);
|
||||
|
||||
flush_icache_range((uintptr_t) (p->ainsn.api.insn),
|
||||
(uintptr_t) (p->ainsn.api.insn) +
|
||||
@ -118,15 +131,15 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __kprobes patch_text(kprobe_opcode_t *addr, u32 opcode)
|
||||
void *alloc_insn_page(void)
|
||||
{
|
||||
void *addrs[1];
|
||||
u32 insns[1];
|
||||
void *page;
|
||||
|
||||
addrs[0] = (void *)addr;
|
||||
insns[0] = (u32)opcode;
|
||||
page = vmalloc_exec(PAGE_SIZE);
|
||||
if (page)
|
||||
set_memory_ro((unsigned long)page, 1);
|
||||
|
||||
return aarch64_insn_patch_text(addrs, insns, 1);
|
||||
return page;
|
||||
}
|
||||
|
||||
/* arm kprobe: install breakpoint in text */
|
||||
|
@ -497,25 +497,3 @@ void arch_setup_new_exec(void)
|
||||
{
|
||||
current->mm->context.flags = is_compat_task() ? MMCF_AARCH32 : 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GCC_PLUGIN_STACKLEAK
|
||||
void __used stackleak_check_alloca(unsigned long size)
|
||||
{
|
||||
unsigned long stack_left;
|
||||
unsigned long current_sp = current_stack_pointer;
|
||||
struct stack_info info;
|
||||
|
||||
BUG_ON(!on_accessible_stack(current, current_sp, &info));
|
||||
|
||||
stack_left = current_sp - info.low;
|
||||
|
||||
/*
|
||||
* There's a good chance we're almost out of stack space if this
|
||||
* is true. Using panic() over BUG() is more likely to give
|
||||
* reliable debugging output.
|
||||
*/
|
||||
if (size >= stack_left)
|
||||
panic("alloca() over the kernel stack boundary\n");
|
||||
}
|
||||
EXPORT_SYMBOL(stackleak_check_alloca);
|
||||
#endif
|
||||
|
@ -160,6 +160,7 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
|
||||
__dma_unmap_area(phys_to_virt(paddr), size, dir);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IOMMU_DMA
|
||||
static int __swiotlb_get_sgtable_page(struct sg_table *sgt,
|
||||
struct page *page, size_t size)
|
||||
{
|
||||
@ -188,6 +189,7 @@ static int __swiotlb_mmap_pfn(struct vm_area_struct *vma,
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_IOMMU_DMA */
|
||||
|
||||
static int __init atomic_pool_init(void)
|
||||
{
|
||||
|
@ -290,7 +290,6 @@ notrace void __init machine_init(unsigned long dt_ptr)
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
int bootmap_size;
|
||||
struct memblock_region *reg;
|
||||
|
||||
printk(KERN_INFO "Initializing kernel\n");
|
||||
@ -347,16 +346,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
init_mm.end_data = memory_start;
|
||||
init_mm.brk = memory_start;
|
||||
|
||||
/*
|
||||
* Give all the memory to the bootmap allocator, tell it to put the
|
||||
* boot mem_map at the start of memory
|
||||
*/
|
||||
bootmap_size = init_bootmem_node(NODE_DATA(0),
|
||||
memory_start >> PAGE_SHIFT,
|
||||
PAGE_OFFSET >> PAGE_SHIFT,
|
||||
memory_end >> PAGE_SHIFT);
|
||||
memblock_reserve(memory_start, bootmap_size);
|
||||
|
||||
unflatten_and_copy_device_tree();
|
||||
|
||||
c6x_cache_init();
|
||||
@ -391,22 +380,9 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Initialize the coherent memory allocator */
|
||||
coherent_mem_init(dma_start, dma_size);
|
||||
|
||||
/*
|
||||
* Free all memory as a starting point.
|
||||
*/
|
||||
free_bootmem(PAGE_OFFSET, memory_end - PAGE_OFFSET);
|
||||
|
||||
/*
|
||||
* Then reserve memory which is already being used.
|
||||
*/
|
||||
for_each_memblock(reserved, reg) {
|
||||
pr_debug("reserved - 0x%08x-0x%08x\n",
|
||||
(u32) reg->base, (u32) reg->size);
|
||||
reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
|
||||
}
|
||||
|
||||
max_low_pfn = PFN_DOWN(memory_end);
|
||||
min_low_pfn = PFN_UP(memory_start);
|
||||
max_pfn = max_low_pfn;
|
||||
max_mapnr = max_low_pfn - min_low_pfn;
|
||||
|
||||
/* Get kmalloc into gear */
|
||||
|
@ -1,9 +1 @@
|
||||
menu "C-SKY Debug Options"
|
||||
config CSKY_BUILTIN_DTB
|
||||
string "Use kernel builtin dtb"
|
||||
help
|
||||
User could define the dtb instead of the one which is passed from
|
||||
bootloader.
|
||||
Sometimes for debug, we want to use a built-in dtb and then we needn't
|
||||
modify bootloader at all.
|
||||
endmenu
|
||||
# dummy file, do not delete
|
||||
|
@ -65,26 +65,15 @@ libs-y += arch/csky/lib/ \
|
||||
$(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name)
|
||||
|
||||
boot := arch/csky/boot
|
||||
ifneq '$(CONFIG_CSKY_BUILTIN_DTB)' '""'
|
||||
core-y += $(boot)/dts/
|
||||
endif
|
||||
|
||||
all: zImage
|
||||
|
||||
|
||||
dtbs: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts
|
||||
|
||||
%.dtb %.dtb.S %.dtb.o: scripts
|
||||
$(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
|
||||
|
||||
zImage Image uImage: vmlinux dtbs
|
||||
zImage Image uImage: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
$(Q)$(MAKE) $(clean)=$(boot)/dts
|
||||
rm -rf arch/csky/include/generated
|
||||
|
||||
define archhelp
|
||||
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
|
||||
|
@ -1,13 +1,3 @@
|
||||
dtstree := $(srctree)/$(src)
|
||||
|
||||
ifneq '$(CONFIG_CSKY_BUILTIN_DTB)' '""'
|
||||
builtindtb-y := $(patsubst "%",%,$(CONFIG_CSKY_BUILTIN_DTB))
|
||||
dtb-y += $(builtindtb-y).dtb
|
||||
obj-y += $(builtindtb-y).dtb.o
|
||||
.SECONDARY: $(obj)/$(builtindtb-y).dtb.S
|
||||
else
|
||||
dtb-y := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts))
|
||||
endif
|
||||
|
||||
always += $(dtb-y)
|
||||
clean-files += *.dtb *.dtb.S
|
||||
|
@ -128,7 +128,7 @@ cflags-y += -ffreestanding
|
||||
# clang's output will be based upon the build machine. So for clang we simply
|
||||
# unconditionally specify -EB or -EL as appropriate.
|
||||
#
|
||||
ifeq ($(cc-name),clang)
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -EB
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -EL
|
||||
else
|
||||
|
@ -10,7 +10,7 @@ ccflags-vdso := \
|
||||
$(filter -march=%,$(KBUILD_CFLAGS)) \
|
||||
-D__VDSO__
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
ccflags-vdso += $(filter --target=%,$(KBUILD_CFLAGS))
|
||||
endif
|
||||
|
||||
|
@ -930,10 +930,6 @@ config FSL_GTM
|
||||
help
|
||||
Freescale General-purpose Timers support
|
||||
|
||||
# Yes MCA RS/6000s exist but Linux-PPC does not currently support any
|
||||
config MCA
|
||||
bool
|
||||
|
||||
# Platforms that what PCI turned unconditionally just do select PCI
|
||||
# in their config node. Platforms that want to choose at config
|
||||
# time should select PPC_PCI_CHOICE
|
||||
@ -944,7 +940,6 @@ config PCI
|
||||
bool "PCI support" if PPC_PCI_CHOICE
|
||||
default y if !40x && !CPM2 && !PPC_8xx && !PPC_83xx \
|
||||
&& !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON
|
||||
default PCI_QSPAN if PPC_8xx
|
||||
select GENERIC_PCI_IOMAP
|
||||
help
|
||||
Find out whether your system includes a PCI bus. PCI is the name of
|
||||
@ -958,14 +953,6 @@ config PCI_DOMAINS
|
||||
config PCI_SYSCALL
|
||||
def_bool PCI
|
||||
|
||||
config PCI_QSPAN
|
||||
bool "QSpan PCI"
|
||||
depends on PPC_8xx
|
||||
select PPC_I8259
|
||||
help
|
||||
Say Y here if you have a system based on a Motorola 8xx-series
|
||||
embedded processor with a QSPAN PCI interface, otherwise say N.
|
||||
|
||||
config PCI_8260
|
||||
bool
|
||||
depends on PCI && 8260
|
||||
|
@ -96,7 +96,7 @@ aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1)
|
||||
aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2
|
||||
endif
|
||||
|
||||
ifneq ($(cc-name),clang)
|
||||
ifndef CONFIG_CC_IS_CLANG
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align
|
||||
endif
|
||||
|
||||
@ -175,7 +175,7 @@ endif
|
||||
# Work around gcc code-gen bugs with -pg / -fno-omit-frame-pointer in gcc <= 4.8
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44199
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52828
|
||||
ifneq ($(cc-name),clang)
|
||||
ifndef CONFIG_CC_IS_CLANG
|
||||
CC_FLAGS_FTRACE += $(call cc-ifversion, -lt, 0409, -mno-sched-epilog)
|
||||
endif
|
||||
endif
|
||||
|
@ -77,12 +77,12 @@
|
||||
};
|
||||
|
||||
ethernet@f0000 {
|
||||
phy-handle = <&xg_cs4315_phy1>;
|
||||
phy-handle = <&xg_cs4315_phy2>;
|
||||
phy-connection-type = "xgmii";
|
||||
};
|
||||
|
||||
ethernet@f2000 {
|
||||
phy-handle = <&xg_cs4315_phy2>;
|
||||
phy-handle = <&xg_cs4315_phy1>;
|
||||
phy-connection-type = "xgmii";
|
||||
};
|
||||
|
||||
|
@ -72,7 +72,7 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
ranges = <0x0 0xff000000 0x4000>;
|
||||
ranges = <0x0 0xff000000 0x28000>;
|
||||
bus-frequency = <0>;
|
||||
|
||||
// Temporary -- will go away once kernel uses ranges for get_immrbase().
|
||||
@ -224,6 +224,17 @@
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
crypto@20000 {
|
||||
compatible = "fsl,sec1.2", "fsl,sec1.0";
|
||||
reg = <0x20000 0x8000>;
|
||||
interrupts = <1 1>;
|
||||
interrupt-parent = <&PIC>;
|
||||
fsl,num-channels = <1>;
|
||||
fsl,channel-fifo-len = <24>;
|
||||
fsl,exec-units-mask = <0x4c>;
|
||||
fsl,descriptor-types-mask = <0x05000154>;
|
||||
};
|
||||
};
|
||||
|
||||
chosen {
|
||||
|
@ -36,6 +36,11 @@ int raw_patch_instruction(unsigned int *addr, unsigned int instr);
|
||||
int patch_instruction_site(s32 *addr, unsigned int instr);
|
||||
int patch_branch_site(s32 *site, unsigned long target, int flags);
|
||||
|
||||
static inline unsigned long patch_site_addr(s32 *site)
|
||||
{
|
||||
return (unsigned long)site + *site;
|
||||
}
|
||||
|
||||
int instr_is_relative_branch(unsigned int instr);
|
||||
int instr_is_relative_link_branch(unsigned int instr);
|
||||
int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr);
|
||||
|
@ -34,20 +34,12 @@
|
||||
* respectively NA for All or X for Supervisor and no access for User.
|
||||
* Then we use the APG to say whether accesses are according to Page rules or
|
||||
* "all Supervisor" rules (Access to all)
|
||||
* We also use the 2nd APG bit for _PAGE_ACCESSED when having SWAP:
|
||||
* When that bit is not set access is done iaw "all user"
|
||||
* which means no access iaw page rules.
|
||||
* Therefore, we define 4 APG groups. lsb is _PMD_USER, 2nd is _PAGE_ACCESSED
|
||||
* 0x => No access => 11 (all accesses performed as user iaw page definition)
|
||||
* 10 => No user => 01 (all accesses performed according to page definition)
|
||||
* 11 => User => 00 (all accesses performed as supervisor iaw page definition)
|
||||
* Therefore, we define 2 APG groups. lsb is _PMD_USER
|
||||
* 0 => No user => 01 (all accesses performed according to page definition)
|
||||
* 1 => User => 00 (all accesses performed as supervisor iaw page definition)
|
||||
* We define all 16 groups so that all other bits of APG can take any value
|
||||
*/
|
||||
#ifdef CONFIG_SWAP
|
||||
#define MI_APG_INIT 0xf4f4f4f4
|
||||
#else
|
||||
#define MI_APG_INIT 0x44444444
|
||||
#endif
|
||||
|
||||
/* The effective page number register. When read, contains the information
|
||||
* about the last instruction TLB miss. When MI_RPN is written, bits in
|
||||
@ -115,20 +107,12 @@
|
||||
* Supervisor and no access for user and NA for ALL.
|
||||
* Then we use the APG to say whether accesses are according to Page rules or
|
||||
* "all Supervisor" rules (Access to all)
|
||||
* We also use the 2nd APG bit for _PAGE_ACCESSED when having SWAP:
|
||||
* When that bit is not set access is done iaw "all user"
|
||||
* which means no access iaw page rules.
|
||||
* Therefore, we define 4 APG groups. lsb is _PMD_USER, 2nd is _PAGE_ACCESSED
|
||||
* 0x => No access => 11 (all accesses performed as user iaw page definition)
|
||||
* 10 => No user => 01 (all accesses performed according to page definition)
|
||||
* 11 => User => 00 (all accesses performed as supervisor iaw page definition)
|
||||
* Therefore, we define 2 APG groups. lsb is _PMD_USER
|
||||
* 0 => No user => 01 (all accesses performed according to page definition)
|
||||
* 1 => User => 00 (all accesses performed as supervisor iaw page definition)
|
||||
* We define all 16 groups so that all other bits of APG can take any value
|
||||
*/
|
||||
#ifdef CONFIG_SWAP
|
||||
#define MD_APG_INIT 0xf4f4f4f4
|
||||
#else
|
||||
#define MD_APG_INIT 0x44444444
|
||||
#endif
|
||||
|
||||
/* The effective page number register. When read, contains the information
|
||||
* about the last instruction TLB miss. When MD_RPN is written, bits in
|
||||
@ -180,12 +164,6 @@
|
||||
*/
|
||||
#define SPRN_M_TW 799
|
||||
|
||||
/* APGs */
|
||||
#define M_APG0 0x00000000
|
||||
#define M_APG1 0x00000020
|
||||
#define M_APG2 0x00000040
|
||||
#define M_APG3 0x00000060
|
||||
|
||||
#ifdef CONFIG_PPC_MM_SLICES
|
||||
#include <asm/nohash/32/slice.h>
|
||||
#define SLICE_ARRAY_SIZE (1 << (32 - SLICE_LOW_SHIFT - 1))
|
||||
@ -251,6 +229,15 @@ static inline unsigned int mmu_psize_to_shift(unsigned int mmu_psize)
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* patch sites */
|
||||
extern s32 patch__itlbmiss_linmem_top;
|
||||
extern s32 patch__dtlbmiss_linmem_top, patch__dtlbmiss_immr_jmp;
|
||||
extern s32 patch__fixupdar_linmem_top;
|
||||
|
||||
extern s32 patch__itlbmiss_exit_1, patch__itlbmiss_exit_2;
|
||||
extern s32 patch__dtlbmiss_exit_1, patch__dtlbmiss_exit_2, patch__dtlbmiss_exit_3;
|
||||
extern s32 patch__itlbmiss_perf, patch__dtlbmiss_perf;
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#if defined(CONFIG_PPC_4K_PAGES)
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
/*
|
||||
* Definitions for talking to the RTAS on CHRP machines.
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/code-patching-asm.h>
|
||||
|
||||
#if CONFIG_TASK_SIZE <= 0x80000000 && CONFIG_PAGE_OFFSET >= 0x80000000
|
||||
/* By simply checking Address >= 0x80000000, we know if its a kernel address */
|
||||
@ -318,8 +319,8 @@ InstructionTLBMiss:
|
||||
cmpli cr0, r11, PAGE_OFFSET@h
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
/* It is assumed that kernel code fits into the first 8M page */
|
||||
_ENTRY(ITLBMiss_cmp)
|
||||
cmpli cr7, r11, (PAGE_OFFSET + 0x0800000)@h
|
||||
0: cmpli cr7, r11, (PAGE_OFFSET + 0x0800000)@h
|
||||
patch_site 0b, patch__itlbmiss_linmem_top
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
@ -353,13 +354,14 @@ _ENTRY(ITLBMiss_cmp)
|
||||
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_HUGETLB_PAGE)
|
||||
mtcr r12
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SWAP
|
||||
rlwinm r11, r10, 31, _PAGE_ACCESSED >> 1
|
||||
#endif
|
||||
/* Load the MI_TWC with the attributes for this "segment." */
|
||||
mtspr SPRN_MI_TWC, r11 /* Set segment attributes */
|
||||
|
||||
#ifdef CONFIG_SWAP
|
||||
rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
||||
and r11, r11, r10
|
||||
rlwimi r10, r11, 0, _PAGE_PRESENT
|
||||
#endif
|
||||
li r11, RPN_PATTERN | 0x200
|
||||
/* The Linux PTE won't go exactly into the MMU TLB.
|
||||
* Software indicator bits 20 and 23 must be clear.
|
||||
@ -372,16 +374,17 @@ _ENTRY(ITLBMiss_cmp)
|
||||
mtspr SPRN_MI_RPN, r10 /* Update TLB entry */
|
||||
|
||||
/* Restore registers */
|
||||
_ENTRY(itlb_miss_exit_1)
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_HUGETLB_PAGE)
|
||||
mfspr r12, SPRN_SPRG_SCRATCH2
|
||||
#endif
|
||||
rfi
|
||||
patch_site 0b, patch__itlbmiss_exit_1
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
_ENTRY(itlb_miss_perf)
|
||||
lis r10, (itlb_miss_counter - PAGE_OFFSET)@ha
|
||||
patch_site 0f, patch__itlbmiss_perf
|
||||
0: lis r10, (itlb_miss_counter - PAGE_OFFSET)@ha
|
||||
lwz r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
addi r11, r11, 1
|
||||
stw r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
@ -435,11 +438,11 @@ DataStoreTLBMiss:
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
cmpli cr0, r11, VIRT_IMMR_BASE@h
|
||||
#endif
|
||||
_ENTRY(DTLBMiss_cmp)
|
||||
cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
0: cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
patch_site 0b, patch__dtlbmiss_linmem_top
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
_ENTRY(DTLBMiss_jmp)
|
||||
beq- DTLBMissIMMR
|
||||
0: beq- DTLBMissIMMR
|
||||
patch_site 0b, patch__dtlbmiss_immr_jmp
|
||||
#endif
|
||||
blt cr7, DTLBMissLinear
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
||||
@ -470,14 +473,22 @@ _ENTRY(DTLBMiss_jmp)
|
||||
* above.
|
||||
*/
|
||||
rlwimi r11, r10, 0, _PAGE_GUARDED
|
||||
#ifdef CONFIG_SWAP
|
||||
/* _PAGE_ACCESSED has to be set. We use second APG bit for that, 0
|
||||
* on that bit will represent a Non Access group
|
||||
*/
|
||||
rlwinm r11, r10, 31, _PAGE_ACCESSED >> 1
|
||||
#endif
|
||||
mtspr SPRN_MD_TWC, r11
|
||||
|
||||
/* Both _PAGE_ACCESSED and _PAGE_PRESENT has to be set.
|
||||
* We also need to know if the insn is a load/store, so:
|
||||
* Clear _PAGE_PRESENT and load that which will
|
||||
* trap into DTLB Error with store bit set accordinly.
|
||||
*/
|
||||
/* PRESENT=0x1, ACCESSED=0x20
|
||||
* r11 = ((r10 & PRESENT) & ((r10 & ACCESSED) >> 5));
|
||||
* r10 = (r10 & ~PRESENT) | r11;
|
||||
*/
|
||||
#ifdef CONFIG_SWAP
|
||||
rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
||||
and r11, r11, r10
|
||||
rlwimi r10, r11, 0, _PAGE_PRESENT
|
||||
#endif
|
||||
/* The Linux PTE won't go exactly into the MMU TLB.
|
||||
* Software indicator bits 24, 25, 26, and 27 must be
|
||||
* set. All other Linux PTE bits control the behavior
|
||||
@ -489,14 +500,16 @@ _ENTRY(DTLBMiss_jmp)
|
||||
|
||||
/* Restore registers */
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
_ENTRY(dtlb_miss_exit_1)
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
|
||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||
mfspr r12, SPRN_SPRG_SCRATCH2
|
||||
rfi
|
||||
patch_site 0b, patch__dtlbmiss_exit_1
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
_ENTRY(dtlb_miss_perf)
|
||||
lis r10, (dtlb_miss_counter - PAGE_OFFSET)@ha
|
||||
patch_site 0f, patch__dtlbmiss_perf
|
||||
0: lis r10, (dtlb_miss_counter - PAGE_OFFSET)@ha
|
||||
lwz r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
addi r11, r11, 1
|
||||
stw r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
@ -637,8 +650,8 @@ InstructionBreakpoint:
|
||||
*/
|
||||
DTLBMissIMMR:
|
||||
mtcr r12
|
||||
/* Set 512k byte guarded page and mark it valid and accessed */
|
||||
li r10, MD_PS512K | MD_GUARDED | MD_SVALID | M_APG2
|
||||
/* Set 512k byte guarded page and mark it valid */
|
||||
li r10, MD_PS512K | MD_GUARDED | MD_SVALID
|
||||
mtspr SPRN_MD_TWC, r10
|
||||
mfspr r10, SPRN_IMMR /* Get current IMMR */
|
||||
rlwinm r10, r10, 0, 0xfff80000 /* Get 512 kbytes boundary */
|
||||
@ -648,16 +661,17 @@ DTLBMissIMMR:
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
_ENTRY(dtlb_miss_exit_2)
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
|
||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||
mfspr r12, SPRN_SPRG_SCRATCH2
|
||||
rfi
|
||||
patch_site 0b, patch__dtlbmiss_exit_2
|
||||
|
||||
DTLBMissLinear:
|
||||
mtcr r12
|
||||
/* Set 8M byte page and mark it valid and accessed */
|
||||
li r11, MD_PS8MEG | MD_SVALID | M_APG2
|
||||
/* Set 8M byte page and mark it valid */
|
||||
li r11, MD_PS8MEG | MD_SVALID
|
||||
mtspr SPRN_MD_TWC, r11
|
||||
rlwinm r10, r10, 0, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
||||
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SH | _PAGE_DIRTY | \
|
||||
@ -666,28 +680,29 @@ DTLBMissLinear:
|
||||
|
||||
li r11, RPN_PATTERN
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
_ENTRY(dtlb_miss_exit_3)
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
|
||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||
mfspr r12, SPRN_SPRG_SCRATCH2
|
||||
rfi
|
||||
patch_site 0b, patch__dtlbmiss_exit_3
|
||||
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
ITLBMissLinear:
|
||||
mtcr r12
|
||||
/* Set 8M byte page and mark it valid,accessed */
|
||||
li r11, MI_PS8MEG | MI_SVALID | M_APG2
|
||||
/* Set 8M byte page and mark it valid */
|
||||
li r11, MI_PS8MEG | MI_SVALID
|
||||
mtspr SPRN_MI_TWC, r11
|
||||
rlwinm r10, r10, 0, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
||||
ori r10, r10, 0xf0 | MI_SPS16K | _PAGE_SH | _PAGE_DIRTY | \
|
||||
_PAGE_PRESENT
|
||||
mtspr SPRN_MI_RPN, r10 /* Update TLB entry */
|
||||
|
||||
_ENTRY(itlb_miss_exit_2)
|
||||
mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||
mfspr r12, SPRN_SPRG_SCRATCH2
|
||||
rfi
|
||||
patch_site 0b, patch__itlbmiss_exit_2
|
||||
#endif
|
||||
|
||||
/* This is the procedure to calculate the data EA for buggy dcbx,dcbi instructions
|
||||
@ -705,8 +720,10 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table */
|
||||
blt+ 3f
|
||||
rlwinm r11, r10, 16, 0xfff8
|
||||
_ENTRY(FixupDAR_cmp)
|
||||
cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
|
||||
0: cmpli cr7, r11, (PAGE_OFFSET + 0x1800000)@h
|
||||
patch_site 0b, patch__fixupdar_linmem_top
|
||||
|
||||
/* create physical page address from effective address */
|
||||
tophys(r11, r10)
|
||||
blt- cr7, 201f
|
||||
@ -960,7 +977,7 @@ initial_mmu:
|
||||
ori r8, r8, MI_EVALID /* Mark it valid */
|
||||
mtspr SPRN_MI_EPN, r8
|
||||
li r8, MI_PS8MEG /* Set 8M byte page */
|
||||
ori r8, r8, MI_SVALID | M_APG2 /* Make it valid, APG 2 */
|
||||
ori r8, r8, MI_SVALID /* Make it valid */
|
||||
mtspr SPRN_MI_TWC, r8
|
||||
li r8, MI_BOOTINIT /* Create RPN for address 0 */
|
||||
mtspr SPRN_MI_RPN, r8 /* Store TLB entry */
|
||||
@ -987,7 +1004,7 @@ initial_mmu:
|
||||
ori r8, r8, MD_EVALID /* Mark it valid */
|
||||
mtspr SPRN_MD_EPN, r8
|
||||
li r8, MD_PS512K | MD_GUARDED /* Set 512k byte page */
|
||||
ori r8, r8, MD_SVALID | M_APG2 /* Make it valid and accessed */
|
||||
ori r8, r8, MD_SVALID /* Make it valid */
|
||||
mtspr SPRN_MD_TWC, r8
|
||||
mr r8, r9 /* Create paddr for TLB */
|
||||
ori r8, r8, MI_BOOTINIT|0x2 /* Inhibit cache -- Cort */
|
||||
|
@ -590,12 +590,11 @@ void flush_all_to_thread(struct task_struct *tsk)
|
||||
if (tsk->thread.regs) {
|
||||
preempt_disable();
|
||||
BUG_ON(tsk != current);
|
||||
save_all(tsk);
|
||||
|
||||
#ifdef CONFIG_SPE
|
||||
if (tsk->thread.regs->msr & MSR_SPE)
|
||||
tsk->thread.spefscr = mfspr(SPRN_SPEFSCR);
|
||||
#endif
|
||||
save_all(tsk);
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
@ -2337,8 +2337,7 @@ static void kvmppc_set_timer(struct kvm_vcpu *vcpu)
|
||||
kvmppc_core_prepare_to_enter(vcpu);
|
||||
return;
|
||||
}
|
||||
dec_nsec = (vcpu->arch.dec_expires - now) * NSEC_PER_SEC
|
||||
/ tb_ticks_per_sec;
|
||||
dec_nsec = tb_to_ns(vcpu->arch.dec_expires - now);
|
||||
hrtimer_start(&vcpu->arch.dec_timer, dec_nsec, HRTIMER_MODE_REL);
|
||||
vcpu->arch.timer_running = 1;
|
||||
}
|
||||
|
@ -61,11 +61,10 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
|
||||
|
||||
dec_time = vcpu->arch.dec;
|
||||
/*
|
||||
* Guest timebase ticks at the same frequency as host decrementer.
|
||||
* So use the host decrementer calculations for decrementer emulation.
|
||||
* Guest timebase ticks at the same frequency as host timebase.
|
||||
* So use the host timebase calculations for decrementer emulation.
|
||||
*/
|
||||
dec_time = dec_time << decrementer_clockevent.shift;
|
||||
do_div(dec_time, decrementer_clockevent.mult);
|
||||
dec_time = tb_to_ns(dec_time);
|
||||
dec_nsec = do_div(dec_time, NSEC_PER_SEC);
|
||||
hrtimer_start(&vcpu->arch.dec_timer,
|
||||
ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
|
||||
|
@ -13,6 +13,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/mmu_context.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/code-patching.h>
|
||||
|
||||
@ -79,7 +80,7 @@ void __init MMU_init_hw(void)
|
||||
for (; i < 32 && mem >= LARGE_PAGE_SIZE_8M; i++) {
|
||||
mtspr(SPRN_MD_CTR, ctr | (i << 8));
|
||||
mtspr(SPRN_MD_EPN, (unsigned long)__va(addr) | MD_EVALID);
|
||||
mtspr(SPRN_MD_TWC, MD_PS8MEG | MD_SVALID | M_APG2);
|
||||
mtspr(SPRN_MD_TWC, MD_PS8MEG | MD_SVALID);
|
||||
mtspr(SPRN_MD_RPN, addr | flags | _PAGE_PRESENT);
|
||||
addr += LARGE_PAGE_SIZE_8M;
|
||||
mem -= LARGE_PAGE_SIZE_8M;
|
||||
@ -97,22 +98,13 @@ static void __init mmu_mapin_immr(void)
|
||||
map_kernel_page(v + offset, p + offset, PAGE_KERNEL_NCG);
|
||||
}
|
||||
|
||||
/* Address of instructions to patch */
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
extern unsigned int DTLBMiss_jmp;
|
||||
#endif
|
||||
extern unsigned int DTLBMiss_cmp, FixupDAR_cmp;
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
extern unsigned int ITLBMiss_cmp;
|
||||
#endif
|
||||
|
||||
static void __init mmu_patch_cmp_limit(unsigned int *addr, unsigned long mapped)
|
||||
static void __init mmu_patch_cmp_limit(s32 *site, unsigned long mapped)
|
||||
{
|
||||
unsigned int instr = *addr;
|
||||
unsigned int instr = *(unsigned int *)patch_site_addr(site);
|
||||
|
||||
instr &= 0xffff0000;
|
||||
instr |= (unsigned long)__va(mapped) >> 16;
|
||||
patch_instruction(addr, instr);
|
||||
patch_instruction_site(site, instr);
|
||||
}
|
||||
|
||||
unsigned long __init mmu_mapin_ram(unsigned long top)
|
||||
@ -123,17 +115,17 @@ unsigned long __init mmu_mapin_ram(unsigned long top)
|
||||
mapped = 0;
|
||||
mmu_mapin_immr();
|
||||
#ifndef CONFIG_PIN_TLB_IMMR
|
||||
patch_instruction(&DTLBMiss_jmp, PPC_INST_NOP);
|
||||
patch_instruction_site(&patch__dtlbmiss_immr_jmp, PPC_INST_NOP);
|
||||
#endif
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
mmu_patch_cmp_limit(&ITLBMiss_cmp, 0);
|
||||
mmu_patch_cmp_limit(&patch__itlbmiss_linmem_top, 0);
|
||||
#endif
|
||||
} else {
|
||||
mapped = top & ~(LARGE_PAGE_SIZE_8M - 1);
|
||||
}
|
||||
|
||||
mmu_patch_cmp_limit(&DTLBMiss_cmp, mapped);
|
||||
mmu_patch_cmp_limit(&FixupDAR_cmp, mapped);
|
||||
mmu_patch_cmp_limit(&patch__dtlbmiss_linmem_top, mapped);
|
||||
mmu_patch_cmp_limit(&patch__fixupdar_linmem_top, mapped);
|
||||
|
||||
/* If the size of RAM is not an exact power of two, we may not
|
||||
* have covered RAM in its entirety with 8 MiB
|
||||
|
@ -31,9 +31,6 @@
|
||||
|
||||
extern unsigned long itlb_miss_counter, dtlb_miss_counter;
|
||||
extern atomic_t instruction_counter;
|
||||
extern unsigned int itlb_miss_perf, dtlb_miss_perf;
|
||||
extern unsigned int itlb_miss_exit_1, itlb_miss_exit_2;
|
||||
extern unsigned int dtlb_miss_exit_1, dtlb_miss_exit_2, dtlb_miss_exit_3;
|
||||
|
||||
static atomic_t insn_ctr_ref;
|
||||
static atomic_t itlb_miss_ref;
|
||||
@ -103,22 +100,22 @@ static int mpc8xx_pmu_add(struct perf_event *event, int flags)
|
||||
break;
|
||||
case PERF_8xx_ID_ITLB_LOAD_MISS:
|
||||
if (atomic_inc_return(&itlb_miss_ref) == 1) {
|
||||
unsigned long target = (unsigned long)&itlb_miss_perf;
|
||||
unsigned long target = patch_site_addr(&patch__itlbmiss_perf);
|
||||
|
||||
patch_branch(&itlb_miss_exit_1, target, 0);
|
||||
patch_branch_site(&patch__itlbmiss_exit_1, target, 0);
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
patch_branch(&itlb_miss_exit_2, target, 0);
|
||||
patch_branch_site(&patch__itlbmiss_exit_2, target, 0);
|
||||
#endif
|
||||
}
|
||||
val = itlb_miss_counter;
|
||||
break;
|
||||
case PERF_8xx_ID_DTLB_LOAD_MISS:
|
||||
if (atomic_inc_return(&dtlb_miss_ref) == 1) {
|
||||
unsigned long target = (unsigned long)&dtlb_miss_perf;
|
||||
unsigned long target = patch_site_addr(&patch__dtlbmiss_perf);
|
||||
|
||||
patch_branch(&dtlb_miss_exit_1, target, 0);
|
||||
patch_branch(&dtlb_miss_exit_2, target, 0);
|
||||
patch_branch(&dtlb_miss_exit_3, target, 0);
|
||||
patch_branch_site(&patch__dtlbmiss_exit_1, target, 0);
|
||||
patch_branch_site(&patch__dtlbmiss_exit_2, target, 0);
|
||||
patch_branch_site(&patch__dtlbmiss_exit_3, target, 0);
|
||||
}
|
||||
val = dtlb_miss_counter;
|
||||
break;
|
||||
@ -180,17 +177,17 @@ static void mpc8xx_pmu_del(struct perf_event *event, int flags)
|
||||
break;
|
||||
case PERF_8xx_ID_ITLB_LOAD_MISS:
|
||||
if (atomic_dec_return(&itlb_miss_ref) == 0) {
|
||||
patch_instruction(&itlb_miss_exit_1, insn);
|
||||
patch_instruction_site(&patch__itlbmiss_exit_1, insn);
|
||||
#ifndef CONFIG_PIN_TLB_TEXT
|
||||
patch_instruction(&itlb_miss_exit_2, insn);
|
||||
patch_instruction_site(&patch__itlbmiss_exit_2, insn);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case PERF_8xx_ID_DTLB_LOAD_MISS:
|
||||
if (atomic_dec_return(&dtlb_miss_ref) == 0) {
|
||||
patch_instruction(&dtlb_miss_exit_1, insn);
|
||||
patch_instruction(&dtlb_miss_exit_2, insn);
|
||||
patch_instruction(&dtlb_miss_exit_3, insn);
|
||||
patch_instruction_site(&patch__dtlbmiss_exit_1, insn);
|
||||
patch_instruction_site(&patch__dtlbmiss_exit_2, insn);
|
||||
patch_instruction_site(&patch__dtlbmiss_exit_3, insn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -29,6 +29,7 @@ config KILAUEA
|
||||
select 405EX
|
||||
select PPC40x_SIMPLE
|
||||
select PPC4xx_PCI_EXPRESS
|
||||
select PCI
|
||||
select PCI_MSI
|
||||
select PPC4xx_MSI
|
||||
help
|
||||
|
@ -21,6 +21,7 @@ config BLUESTONE
|
||||
depends on 44x
|
||||
select PPC44x_SIMPLE
|
||||
select APM821xx
|
||||
select PCI
|
||||
select PCI_MSI
|
||||
select PPC4xx_MSI
|
||||
select PPC4xx_PCI_EXPRESS
|
||||
@ -200,6 +201,7 @@ config AKEBONO
|
||||
select SWIOTLB
|
||||
select 476FPE
|
||||
select PPC4xx_PCI_EXPRESS
|
||||
select PCI
|
||||
select PCI_MSI
|
||||
select PPC4xx_HSTA_MSI
|
||||
select I2C
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/firmware.h>
|
||||
@ -36,6 +37,7 @@
|
||||
#include <asm/vio.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/drmem.h>
|
||||
|
||||
#include "pseries.h"
|
||||
|
||||
@ -433,6 +435,16 @@ static void parse_em_data(struct seq_file *m)
|
||||
seq_printf(m, "power_mode_data=%016lx\n", retbuf[0]);
|
||||
}
|
||||
|
||||
static void maxmem_data(struct seq_file *m)
|
||||
{
|
||||
unsigned long maxmem = 0;
|
||||
|
||||
maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
|
||||
maxmem += hugetlb_total_pages() * PAGE_SIZE;
|
||||
|
||||
seq_printf(m, "MaxMem=%ld\n", maxmem);
|
||||
}
|
||||
|
||||
static int pseries_lparcfg_data(struct seq_file *m, void *v)
|
||||
{
|
||||
int partition_potential_processors;
|
||||
@ -491,6 +503,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
|
||||
seq_printf(m, "slb_size=%d\n", mmu_slb_size);
|
||||
#endif
|
||||
parse_em_data(m);
|
||||
maxmem_data(m);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -11,6 +11,12 @@ UBSAN_SANITIZE := n
|
||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||
KBUILD_CFLAGS = $(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS))
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
# clang stores addresses on the stack causing the frame size to blow
|
||||
# out. See https://github.com/ClangBuiltLinux/linux/issues/252
|
||||
KBUILD_CFLAGS += -Wframe-larger-than=4096
|
||||
endif
|
||||
|
||||
ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC)
|
||||
|
||||
obj-y += xmon.o nonstdio.o spr_access.o
|
||||
|
@ -107,7 +107,6 @@ config ARCH_RV32I
|
||||
select GENERIC_LIB_ASHRDI3
|
||||
select GENERIC_LIB_LSHRDI3
|
||||
select GENERIC_LIB_UCMPDI2
|
||||
select GENERIC_LIB_UMODDI3
|
||||
|
||||
config ARCH_RV64I
|
||||
bool "RV64I"
|
||||
|
@ -1,6 +1,3 @@
|
||||
CONFIG_SMP=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_XILINX=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
@ -11,10 +8,15 @@ CONFIG_CFS_BANDWIDTH=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_XILINX=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
@ -59,6 +61,7 @@ CONFIG_USB_OHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_SIFIVE_PLIC=y
|
||||
CONFIG_RAS=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
@ -72,8 +75,5 @@ CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_V4_1=y
|
||||
CONFIG_NFS_V4_2=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_CRYPTO_USER_API_HASH=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_SIFIVE_PLIC=y
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
|
@ -16,9 +16,6 @@
|
||||
#include <asm/auxvec.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/* TODO: Move definition into include/uapi/linux/elf-em.h */
|
||||
#define EM_RISCV 0xF3
|
||||
|
||||
/*
|
||||
* These are used to set parameters in the core dumps.
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@ bool has_fpu __read_mostly;
|
||||
|
||||
void riscv_fill_hwcap(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
struct device_node *node = NULL;
|
||||
const char *isa;
|
||||
size_t i;
|
||||
static unsigned long isa2hwcap[256] = {0};
|
||||
@ -44,9 +44,11 @@ void riscv_fill_hwcap(void)
|
||||
|
||||
/*
|
||||
* We don't support running Linux on hertergenous ISA systems. For
|
||||
* now, we just check the ISA of the first processor.
|
||||
* now, we just check the ISA of the first "okay" processor.
|
||||
*/
|
||||
node = of_find_node_by_type(NULL, "cpu");
|
||||
while ((node = of_find_node_by_type(node, "cpu")))
|
||||
if (riscv_of_processor_hartid(node) >= 0)
|
||||
break;
|
||||
if (!node) {
|
||||
pr_warning("Unable to find \"cpu\" devicetree entry");
|
||||
return;
|
||||
|
@ -1849,16 +1849,12 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
|
||||
{
|
||||
u64 saved_fault_address = current_thread_info()->fault_address;
|
||||
u8 saved_fault_code = get_thread_fault_code();
|
||||
mm_segment_t old_fs;
|
||||
|
||||
perf_callchain_store(entry, regs->tpc);
|
||||
|
||||
if (!current->mm)
|
||||
return;
|
||||
|
||||
old_fs = get_fs();
|
||||
set_fs(USER_DS);
|
||||
|
||||
flushw_user();
|
||||
|
||||
pagefault_disable();
|
||||
@ -1870,7 +1866,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
|
||||
|
||||
pagefault_enable();
|
||||
|
||||
set_fs(old_fs);
|
||||
set_thread_fault_code(saved_fault_code);
|
||||
current_thread_info()->fault_address = saved_fault_address;
|
||||
}
|
||||
|
@ -47,9 +47,9 @@ sys_call_table32:
|
||||
.word sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
|
||||
/*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_sendto, sys_shutdown
|
||||
.word sys_socketpair, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
|
||||
/*140*/ .word sys_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit
|
||||
/*140*/ .word sys_sendfile64, sys_getpeername, compat_sys_futex, sys_gettid, compat_sys_getrlimit
|
||||
.word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
|
||||
/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
|
||||
/*150*/ .word sys_getsockname, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
|
||||
.word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount
|
||||
/*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
|
||||
.word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr
|
||||
|
@ -261,7 +261,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
|
||||
if (err == 0) {
|
||||
spin_unlock(&line->lock);
|
||||
return IRQ_NONE;
|
||||
} else if (err < 0) {
|
||||
} else if ((err < 0) && (err != -EAGAIN)) {
|
||||
line->head = line->buffer;
|
||||
line->tail = line->buffer;
|
||||
}
|
||||
@ -284,7 +284,7 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
|
||||
if (err)
|
||||
return err;
|
||||
if (output)
|
||||
err = um_request_irq(driver->write_irq, fd, IRQ_NONE,
|
||||
err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
|
||||
line_write_interrupt, IRQF_SHARED,
|
||||
driver->write_irq_name, data);
|
||||
return err;
|
||||
|
@ -168,7 +168,7 @@ int port_connection(int fd, int *socket, int *pid_out)
|
||||
{
|
||||
int new, err;
|
||||
char *argv[] = { "/usr/sbin/in.telnetd", "-L",
|
||||
"/usr/lib/uml/port-helper", NULL };
|
||||
OS_LIB_PATH "/uml/port-helper", NULL };
|
||||
struct port_pre_exec_data data;
|
||||
|
||||
new = accept(fd, NULL, 0);
|
||||
|
@ -1118,16 +1118,11 @@ static int vector_net_close(struct net_device *dev)
|
||||
os_close_file(vp->fds->tx_fd);
|
||||
vp->fds->tx_fd = -1;
|
||||
}
|
||||
if (vp->bpf != NULL)
|
||||
kfree(vp->bpf);
|
||||
if (vp->fds->remote_addr != NULL)
|
||||
kfree(vp->fds->remote_addr);
|
||||
if (vp->transport_data != NULL)
|
||||
kfree(vp->transport_data);
|
||||
if (vp->header_rxbuffer != NULL)
|
||||
kfree(vp->header_rxbuffer);
|
||||
if (vp->header_txbuffer != NULL)
|
||||
kfree(vp->header_txbuffer);
|
||||
kfree(vp->bpf);
|
||||
kfree(vp->fds->remote_addr);
|
||||
kfree(vp->transport_data);
|
||||
kfree(vp->header_rxbuffer);
|
||||
kfree(vp->header_txbuffer);
|
||||
if (vp->rx_queue != NULL)
|
||||
destroy_queue(vp->rx_queue);
|
||||
if (vp->tx_queue != NULL)
|
||||
|
@ -267,8 +267,7 @@ cleanup:
|
||||
os_close_file(rxfd);
|
||||
if (txfd >= 0)
|
||||
os_close_file(txfd);
|
||||
if (result != NULL)
|
||||
kfree(result);
|
||||
kfree(result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -434,8 +433,7 @@ cleanup:
|
||||
if (fd >= 0)
|
||||
os_close_file(fd);
|
||||
if (result != NULL) {
|
||||
if (result->remote_addr != NULL)
|
||||
kfree(result->remote_addr);
|
||||
kfree(result->remote_addr);
|
||||
kfree(result);
|
||||
}
|
||||
return NULL;
|
||||
|
@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef AIO_H__
|
||||
#define AIO_H__
|
||||
|
||||
enum aio_type { AIO_READ, AIO_WRITE, AIO_MMAP };
|
||||
|
||||
struct aio_thread_reply {
|
||||
void *data;
|
||||
int err;
|
||||
};
|
||||
|
||||
struct aio_context {
|
||||
int reply_fd;
|
||||
struct aio_context *next;
|
||||
};
|
||||
|
||||
#define INIT_AIO_CONTEXT { .reply_fd = -1, \
|
||||
.next = NULL }
|
||||
|
||||
extern int submit_aio(enum aio_type type, int fd, char *buf, int len,
|
||||
unsigned long long offset, int reply_fd,
|
||||
struct aio_context *aio);
|
||||
|
||||
#endif
|
@ -244,8 +244,7 @@ static void garbage_collect_irq_entries(void)
|
||||
to_free = NULL;
|
||||
}
|
||||
walk = walk->next;
|
||||
if (to_free != NULL)
|
||||
kfree(to_free);
|
||||
kfree(to_free);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include <skas.h>
|
||||
|
||||
/*
|
||||
* Note this is constrained to return 0, -EFAULT, -EACCESS, -ENOMEM by
|
||||
* Note this is constrained to return 0, -EFAULT, -EACCES, -ENOMEM by
|
||||
* segv().
|
||||
*/
|
||||
int handle_page_fault(unsigned long address, unsigned long ip,
|
||||
|
@ -6,18 +6,14 @@
|
||||
# Don't instrument UML-specific code
|
||||
KCOV_INSTRUMENT := n
|
||||
|
||||
obj-y = aio.o execvp.o file.o helper.o irq.o main.o mem.o process.o \
|
||||
obj-y = execvp.o file.o helper.o irq.o main.o mem.o process.o \
|
||||
registers.o sigio.o signal.o start_up.o time.o tty.o \
|
||||
umid.o user_syms.o util.o drivers/ skas/
|
||||
|
||||
obj-$(CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA) += elf_aux.o
|
||||
|
||||
USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \
|
||||
USER_OBJS := $(user-objs-y) elf_aux.o execvp.o file.o helper.o irq.o \
|
||||
main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \
|
||||
tty.o umid.o util.o
|
||||
|
||||
HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \
|
||||
echo -DHAVE_AIO_ABI )
|
||||
CFLAGS_aio.o += $(HAVE_AIO_ABI)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
@ -1,390 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <aio.h>
|
||||
#include <init.h>
|
||||
#include <kern_util.h>
|
||||
#include <os.h>
|
||||
|
||||
struct aio_thread_req {
|
||||
enum aio_type type;
|
||||
int io_fd;
|
||||
unsigned long long offset;
|
||||
char *buf;
|
||||
int len;
|
||||
struct aio_context *aio;
|
||||
};
|
||||
|
||||
#if defined(HAVE_AIO_ABI)
|
||||
#include <linux/aio_abi.h>
|
||||
|
||||
/*
|
||||
* If we have the headers, we are going to build with AIO enabled.
|
||||
* If we don't have aio in libc, we define the necessary stubs here.
|
||||
*/
|
||||
|
||||
#if !defined(HAVE_AIO_LIBC)
|
||||
|
||||
static long io_setup(int n, aio_context_t *ctxp)
|
||||
{
|
||||
return syscall(__NR_io_setup, n, ctxp);
|
||||
}
|
||||
|
||||
static long io_submit(aio_context_t ctx, long nr, struct iocb **iocbpp)
|
||||
{
|
||||
return syscall(__NR_io_submit, ctx, nr, iocbpp);
|
||||
}
|
||||
|
||||
static long io_getevents(aio_context_t ctx_id, long min_nr, long nr,
|
||||
struct io_event *events, struct timespec *timeout)
|
||||
{
|
||||
return syscall(__NR_io_getevents, ctx_id, min_nr, nr, events, timeout);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The AIO_MMAP cases force the mmapped page into memory here
|
||||
* rather than in whatever place first touches the data. I used
|
||||
* to do this by touching the page, but that's delicate because
|
||||
* gcc is prone to optimizing that away. So, what's done here
|
||||
* is we read from the descriptor from which the page was
|
||||
* mapped. The caller is required to pass an offset which is
|
||||
* inside the page that was mapped. Thus, when the read
|
||||
* returns, we know that the page is in the page cache, and
|
||||
* that it now backs the mmapped area.
|
||||
*/
|
||||
|
||||
static int do_aio(aio_context_t ctx, enum aio_type type, int fd, char *buf,
|
||||
int len, unsigned long long offset, struct aio_context *aio)
|
||||
{
|
||||
struct iocb *iocbp = & ((struct iocb) {
|
||||
.aio_data = (unsigned long) aio,
|
||||
.aio_fildes = fd,
|
||||
.aio_buf = (unsigned long) buf,
|
||||
.aio_nbytes = len,
|
||||
.aio_offset = offset
|
||||
});
|
||||
char c;
|
||||
|
||||
switch (type) {
|
||||
case AIO_READ:
|
||||
iocbp->aio_lio_opcode = IOCB_CMD_PREAD;
|
||||
break;
|
||||
case AIO_WRITE:
|
||||
iocbp->aio_lio_opcode = IOCB_CMD_PWRITE;
|
||||
break;
|
||||
case AIO_MMAP:
|
||||
iocbp->aio_lio_opcode = IOCB_CMD_PREAD;
|
||||
iocbp->aio_buf = (unsigned long) &c;
|
||||
iocbp->aio_nbytes = sizeof(c);
|
||||
break;
|
||||
default:
|
||||
printk(UM_KERN_ERR "Bogus op in do_aio - %d\n", type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return (io_submit(ctx, 1, &iocbp) > 0) ? 0 : -errno;
|
||||
}
|
||||
|
||||
/* Initialized in an initcall and unchanged thereafter */
|
||||
static aio_context_t ctx = 0;
|
||||
|
||||
static int aio_thread(void *arg)
|
||||
{
|
||||
struct aio_thread_reply reply;
|
||||
struct io_event event;
|
||||
int err, n, reply_fd;
|
||||
|
||||
os_fix_helper_signals();
|
||||
while (1) {
|
||||
n = io_getevents(ctx, 1, 1, &event, NULL);
|
||||
if (n < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
printk(UM_KERN_ERR "aio_thread - io_getevents failed, "
|
||||
"errno = %d\n", errno);
|
||||
}
|
||||
else {
|
||||
reply = ((struct aio_thread_reply)
|
||||
{ .data = (void *) (long) event.data,
|
||||
.err = event.res });
|
||||
reply_fd = ((struct aio_context *) reply.data)->reply_fd;
|
||||
err = write(reply_fd, &reply, sizeof(reply));
|
||||
if (err != sizeof(reply))
|
||||
printk(UM_KERN_ERR "aio_thread - write failed, "
|
||||
"fd = %d, err = %d\n", reply_fd, errno);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int do_not_aio(struct aio_thread_req *req)
|
||||
{
|
||||
char c;
|
||||
unsigned long long actual;
|
||||
int n;
|
||||
|
||||
actual = lseek64(req->io_fd, req->offset, SEEK_SET);
|
||||
if (actual != req->offset)
|
||||
return -errno;
|
||||
|
||||
switch (req->type) {
|
||||
case AIO_READ:
|
||||
n = read(req->io_fd, req->buf, req->len);
|
||||
break;
|
||||
case AIO_WRITE:
|
||||
n = write(req->io_fd, req->buf, req->len);
|
||||
break;
|
||||
case AIO_MMAP:
|
||||
n = read(req->io_fd, &c, sizeof(c));
|
||||
break;
|
||||
default:
|
||||
printk(UM_KERN_ERR "do_not_aio - bad request type : %d\n",
|
||||
req->type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (n < 0)
|
||||
return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* These are initialized in initcalls and not changed */
|
||||
static int aio_req_fd_r = -1;
|
||||
static int aio_req_fd_w = -1;
|
||||
static int aio_pid = -1;
|
||||
static unsigned long aio_stack;
|
||||
|
||||
static int not_aio_thread(void *arg)
|
||||
{
|
||||
struct aio_thread_req req;
|
||||
struct aio_thread_reply reply;
|
||||
int err;
|
||||
|
||||
os_fix_helper_signals();
|
||||
while (1) {
|
||||
err = read(aio_req_fd_r, &req, sizeof(req));
|
||||
if (err != sizeof(req)) {
|
||||
if (err < 0)
|
||||
printk(UM_KERN_ERR "not_aio_thread - "
|
||||
"read failed, fd = %d, err = %d\n",
|
||||
aio_req_fd_r,
|
||||
errno);
|
||||
else {
|
||||
printk(UM_KERN_ERR "not_aio_thread - short "
|
||||
"read, fd = %d, length = %d\n",
|
||||
aio_req_fd_r, err);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
err = do_not_aio(&req);
|
||||
reply = ((struct aio_thread_reply) { .data = req.aio,
|
||||
.err = err });
|
||||
err = write(req.aio->reply_fd, &reply, sizeof(reply));
|
||||
if (err != sizeof(reply))
|
||||
printk(UM_KERN_ERR "not_aio_thread - write failed, "
|
||||
"fd = %d, err = %d\n", req.aio->reply_fd, errno);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int init_aio_24(void)
|
||||
{
|
||||
int fds[2], err;
|
||||
|
||||
err = os_pipe(fds, 1, 1);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
aio_req_fd_w = fds[0];
|
||||
aio_req_fd_r = fds[1];
|
||||
|
||||
err = os_set_fd_block(aio_req_fd_w, 0);
|
||||
if (err)
|
||||
goto out_close_pipe;
|
||||
|
||||
err = run_helper_thread(not_aio_thread, NULL,
|
||||
CLONE_FILES | CLONE_VM, &aio_stack);
|
||||
if (err < 0)
|
||||
goto out_close_pipe;
|
||||
|
||||
aio_pid = err;
|
||||
goto out;
|
||||
|
||||
out_close_pipe:
|
||||
close(fds[0]);
|
||||
close(fds[1]);
|
||||
aio_req_fd_w = -1;
|
||||
aio_req_fd_r = -1;
|
||||
out:
|
||||
#ifndef HAVE_AIO_ABI
|
||||
printk(UM_KERN_INFO "/usr/include/linux/aio_abi.h not present during "
|
||||
"build\n");
|
||||
#endif
|
||||
printk(UM_KERN_INFO "2.6 host AIO support not used - falling back to "
|
||||
"I/O thread\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AIO_ABI
|
||||
#define DEFAULT_24_AIO 0
|
||||
static int init_aio_26(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (io_setup(256, &ctx)) {
|
||||
err = -errno;
|
||||
printk(UM_KERN_ERR "aio_thread failed to initialize context, "
|
||||
"err = %d\n", errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = run_helper_thread(aio_thread, NULL,
|
||||
CLONE_FILES | CLONE_VM, &aio_stack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
aio_pid = err;
|
||||
|
||||
printk(UM_KERN_INFO "Using 2.6 host AIO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int submit_aio_26(enum aio_type type, int io_fd, char *buf, int len,
|
||||
unsigned long long offset, struct aio_context *aio)
|
||||
{
|
||||
struct aio_thread_reply reply;
|
||||
int err;
|
||||
|
||||
err = do_aio(ctx, type, io_fd, buf, len, offset, aio);
|
||||
if (err) {
|
||||
reply = ((struct aio_thread_reply) { .data = aio,
|
||||
.err = err });
|
||||
err = write(aio->reply_fd, &reply, sizeof(reply));
|
||||
if (err != sizeof(reply)) {
|
||||
err = -errno;
|
||||
printk(UM_KERN_ERR "submit_aio_26 - write failed, "
|
||||
"fd = %d, err = %d\n", aio->reply_fd, -err);
|
||||
}
|
||||
else err = 0;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#else
|
||||
#define DEFAULT_24_AIO 1
|
||||
static int init_aio_26(void)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int submit_aio_26(enum aio_type type, int io_fd, char *buf, int len,
|
||||
unsigned long long offset, struct aio_context *aio)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Initialized in an initcall and unchanged thereafter */
|
||||
static int aio_24 = DEFAULT_24_AIO;
|
||||
|
||||
static int __init set_aio_24(char *name, int *add)
|
||||
{
|
||||
aio_24 = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__uml_setup("aio=2.4", set_aio_24,
|
||||
"aio=2.4\n"
|
||||
" This is used to force UML to use 2.4-style AIO even when 2.6 AIO is\n"
|
||||
" available. 2.4 AIO is a single thread that handles one request at a\n"
|
||||
" time, synchronously. 2.6 AIO is a thread which uses the 2.6 AIO \n"
|
||||
" interface to handle an arbitrary number of pending requests. 2.6 AIO \n"
|
||||
" is not available in tt mode, on 2.4 hosts, or when UML is built with\n"
|
||||
" /usr/include/linux/aio_abi.h not available. Many distributions don't\n"
|
||||
" include aio_abi.h, so you will need to copy it from a kernel tree to\n"
|
||||
" your /usr/include/linux in order to build an AIO-capable UML\n\n"
|
||||
);
|
||||
|
||||
static int init_aio(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!aio_24) {
|
||||
err = init_aio_26();
|
||||
if (err && (errno == ENOSYS)) {
|
||||
printk(UM_KERN_INFO "2.6 AIO not supported on the "
|
||||
"host - reverting to 2.4 AIO\n");
|
||||
aio_24 = 1;
|
||||
}
|
||||
else return err;
|
||||
}
|
||||
|
||||
if (aio_24)
|
||||
return init_aio_24();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The reason for the __initcall/__uml_exitcall asymmetry is that init_aio
|
||||
* needs to be called when the kernel is running because it calls run_helper,
|
||||
* which needs get_free_page. exit_aio is a __uml_exitcall because the generic
|
||||
* kernel does not run __exitcalls on shutdown, and can't because many of them
|
||||
* break when called outside of module unloading.
|
||||
*/
|
||||
__initcall(init_aio);
|
||||
|
||||
static void exit_aio(void)
|
||||
{
|
||||
if (aio_pid != -1) {
|
||||
os_kill_process(aio_pid, 1);
|
||||
free_stack(aio_stack, 0);
|
||||
}
|
||||
}
|
||||
|
||||
__uml_exitcall(exit_aio);
|
||||
|
||||
static int submit_aio_24(enum aio_type type, int io_fd, char *buf, int len,
|
||||
unsigned long long offset, struct aio_context *aio)
|
||||
{
|
||||
struct aio_thread_req req = { .type = type,
|
||||
.io_fd = io_fd,
|
||||
.offset = offset,
|
||||
.buf = buf,
|
||||
.len = len,
|
||||
.aio = aio,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = write(aio_req_fd_w, &req, sizeof(req));
|
||||
if (err == sizeof(req))
|
||||
err = 0;
|
||||
else err = -errno;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int submit_aio(enum aio_type type, int io_fd, char *buf, int len,
|
||||
unsigned long long offset, int reply_fd,
|
||||
struct aio_context *aio)
|
||||
{
|
||||
aio->reply_fd = reply_fd;
|
||||
if (aio_24)
|
||||
return submit_aio_24(type, io_fd, buf, len, offset, aio);
|
||||
else
|
||||
return submit_aio_26(type, io_fd, buf, len, offset, aio);
|
||||
}
|
@ -610,6 +610,11 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
||||
fatal_sigsegv();
|
||||
}
|
||||
longjmp(*switch_buf, 1);
|
||||
|
||||
/* unreachable */
|
||||
printk(UM_KERN_ERR "impossible long jump!");
|
||||
fatal_sigsegv();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void initial_thread_cb_skas(void (*proc)(void *), void *arg)
|
||||
|
@ -129,6 +129,7 @@ config X86
|
||||
select HAVE_ARCH_PREL32_RELOCATIONS
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_THREAD_STRUCT_WHITELIST
|
||||
select HAVE_ARCH_STACKLEAK
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD if X86_64
|
||||
|
@ -113,7 +113,7 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
|
||||
{
|
||||
int err;
|
||||
|
||||
memset(&cpu.flags, 0, sizeof cpu.flags);
|
||||
memset(&cpu.flags, 0, sizeof(cpu.flags));
|
||||
cpu.level = 3;
|
||||
|
||||
if (has_eflag(X86_EFLAGS_AC))
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user