Linux 5.18.1
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.18.1 kernel.
All users of the 5.18 kernel series must upgrade.
The updated 5.18.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.18.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/admin-guide/sysctl/kernel.rst | 8 Makefile | 2 arch/alpha/include/asm/timex.h | 1 arch/arm/include/asm/timex.h | 1 arch/ia64/include/asm/timex.h | 1 arch/m68k/include/asm/timex.h | 2 arch/mips/include/asm/timex.h | 17 arch/nios2/include/asm/timex.h | 3 arch/parisc/include/asm/timex.h | 3 arch/powerpc/include/asm/timex.h | 1 arch/riscv/include/asm/timex.h | 2 arch/s390/include/asm/timex.h | 1 arch/sparc/include/asm/timex_32.h | 4 arch/um/include/asm/timex.h | 9 arch/x86/include/asm/timex.h | 9 arch/x86/include/asm/tsc.h | 7 arch/xtensa/include/asm/timex.h | 6 drivers/acpi/sysfs.c | 25 drivers/char/random.c | 1213 +++++++++++----------------- drivers/hid/amd-sfh-hid/amd_sfh_client.c | 11 drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 7 drivers/hid/amd-sfh-hid/amd_sfh_pcie.h | 4 include/linux/mm.h | 1 include/linux/prandom.h | 23 include/linux/random.h | 92 -- include/linux/security.h | 2 include/linux/siphash.h | 28 include/linux/timex.h | 8 init/main.c | 13 kernel/debug/debug_core.c | 24 kernel/debug/kdb/kdb_main.c | 62 + kernel/time/timekeeping.c | 15 lib/Kconfig.debug | 3 lib/siphash.c | 32 mm/util.c | 32 security/security.c | 2 sound/pci/ctxfi/ctatc.c | 2 sound/pci/ctxfi/cthardware.h | 3 38 files changed, 820 insertions(+), 859 deletions(-)
Basavaraj Natikar (1):
HID: amd_sfh: Add support for sensor discovery
Daniel Thompson (1):
lockdown: also lock down previous kgdb use
Edward Matijevic (1):
ALSA: ctxfi: Add SB046x PCI ID
Greg Kroah-Hartman (1):
Linux 5.18.1
Jason A. Donenfeld (40):
random: fix sysctl documentation nits
init: call time_init() before rand_initialize()
ia64: define get_cycles macro for arch-override
s390: define get_cycles macro for arch-override
parisc: define get_cycles macro for arch-override
alpha: define get_cycles macro for arch-override
powerpc: define get_cycles macro for arch-override
timekeeping: Add raw clock fallback for random_get_entropy()
m68k: use fallback for random_get_entropy() instead of zero
riscv: use fallback for random_get_entropy() instead of zero
mips: use fallback for random_get_entropy() instead of just c0 random
arm: use fallback for random_get_entropy() instead of zero
nios2: use fallback for random_get_entropy() instead of zero x86/tsc: Use fallback for random_get_entropy() instead of zero
um: use fallback for random_get_entropy() instead of zero
sparc: use fallback for random_get_entropy() instead of zero
xtensa: use fallback for random_get_entropy() instead of zero
random: insist on random_get_entropy() existing in order to simplify
random: do not use batches when !crng_ready()
random: use first 128 bits of input as fast init
random: do not pretend to handle premature next security model
random: order timer entropy functions below interrupt functions
random: do not use input pool from hard IRQs
random: help compiler out with fast_mix() by using simpler arguments
siphash: use one source of truth for siphash permutations
random: use symbolic constants for crng_init states
random: avoid initializing twice in credit race
random: move initialization out of reseeding hot path
random: remove ratelimiting for in-kernel unseeded randomness
random: use proper jiffies comparison macro
random: handle latent entropy and command line from random_init()
random: credit architectural init the exact amount
random: use static branch for crng_ready()
random: remove extern from functions in header
random: use proper return types on get_random_{int,long}_wait()
random: make consistent use of buf and len
random: move initialization functions out of hot pages
random: move randomize_page() into mm where it belongs
random: unify batched entropy implementations
random: check for signals after page of pool writes
Jens Axboe (3):
random: convert to using fops->read_iter()
random: convert to using fops->write_iter()
random: wire up fops->splice_{read,write}_iter()Lorenzo Pieralisi (1):
ACPI: sysfs: Fix BERT error region memory mapping
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/sysctl/kernel.rst +4 -4
@@ -994,6 +994,9 @@ This is a directory, with the following entries: * ``boot_id``: a UUID generated the first time this is retrieved, and unvarying after that; +* ``uuid``: a UUID generated every time this is retrieved (this can + thus be used to generate UUIDs at will); + * ``entropy_avail``: the pool's entropy count, in bits; * ``poolsize``: the entropy pool size, in bits;
@@ -1001,10 +1004,7 @@ This is a directory, with the following entries: * ``urandom_min_reseed_secs``: obsolete (used to determine the minimum number of seconds between urandom pool reseeding). This file is writable for compatibility purposes, but writing to it has no effect - on any RNG behavior. - -* ``uuid``: a UUID generated every time this is retrieved (this can - thus be used to generate UUIDs at will); + on any RNG behavior; * ``write_wakeup_threshold``: when the entropy count drops below this (as a number of bits), processes waiting to write to ``/dev/random``
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 18 -SUBLEVEL = 0 +SUBLEVEL = 1 EXTRAVERSION = NAME = Superb Owl
arch/alpha/include/asm/timex.h +1 -0
@@ -28,5 +28,6 @@ static inline cycles_t get_cycles (void) __asm__ __volatile__ ("rpcc %0" :"=r" (ret)); return ret; } +#define get_cycles get_cycles#endif
arch/arm/include/asm/timex.h +1 -0
@@ -11,5 +11,6 @@typedef unsigned long cycles_t ;#define get_cycles () ({ cycles_t c; read_current_timer(&c) ? 0 : c; }) +#define random_get_entropy () (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())#endif
arch/ia64/include/asm/timex.h +1 -0
@@ -39,6 +39,7 @@ get_cycles (void) ret =ia64_getreg (_IA64_REG_AR_ITC);return ret; } +#define get_cycles get_cyclesextern void ia64_cpu_local_tick (void );extern unsigned long long ia64_native_sched_clock (void );
arch/m68k/include/asm/timex.h +1 -1
@@ -35,7 +35,7 @@ static inline unsigned long random_get_entropy(void) {if (mach_random_get_entropy)return mach_random_get_entropy (); -return 0 ; +return random_get_entropy_fallback (); }#define random_get_entropy random_get_entropy
arch/mips/include/asm/timex.h +8 -9
@@ -76,25 +76,24 @@ static inline cycles_t get_cycles(void)else return 0 ;/* no usable counter */ } +#define get_cycles get_cycles/* * Like get_cycles - but where c0_count is not available we desperately * use c0_random in an attempt to get at least a little bit of entropy. -* -* R6000 and R6000A neither have a count register nor a random register. -* That leaves no entropy source in the CPU itself. */ static inline unsigned long random_get_entropy (void ) { -unsigned int prid =read_c0_prid (); -unsigned int imp = prid &PRID_IMP_MASK ; +unsigned int c0_random; -if (can_use_mips_counter (prid)) +if (can_use_mips_counter (read_c0_prid ()))return read_c0_count (); -else if (likely (imp !=PRID_IMP_R6000 && imp !=PRID_IMP_R6000A )) -return read_c0_random (); + +if (cpu_has_3kex) + c0_random = (read_c0_random () >>8 ) &0x3f ;else -return 0 ;/* no usable register */ + c0_random =read_c0_random () &0x3f ; +return (random_get_entropy_fallback () <<6 ) | (0x3f - c0_random); }#define random_get_entropy random_get_entropy
arch/nios2/include/asm/timex.h +3 -0
@@ -8,5 +8,8 @@typedef unsigned long cycles_t ;extern cycles_t get_cycles (void ); +#define get_cycles get_cycles + +#define random_get_entropy () (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())#endif
arch/parisc/include/asm/timex.h +2 -1
@@ -13,9 +13,10 @@typedef unsigned long cycles_t ; -static inline cycles_t get_cycles (void ) +static inline cycles_t get_cycles (void ) {return mfctl (16 ); } +#define get_cycles get_cycles#endif
arch/powerpc/include/asm/timex.h +1 -0
@@ -19,6 +19,7 @@ static inline cycles_t get_cycles(void) {return mftb (); } +#define get_cycles get_cycles#endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_TIMEX_H */
arch/riscv/include/asm/timex.h +1 -1
@@ -41,7 +41,7 @@ static inline u32 get_cycles_hi(void)static inline unsigned long random_get_entropy (void ) {if (unlikely (clint_time_val ==NULL )) -return 0 ; +return random_get_entropy_fallback ();return get_cycles (); }#define random_get_entropy () random_get_entropy()
arch/s390/include/asm/timex.h +1 -0
@@ -197,6 +197,7 @@ static inline cycles_t get_cycles(void) {return (cycles_t )get_tod_clock () >>2 ; } +#define get_cycles get_cyclesint get_phys_clock (unsigned long *clock);void init_cpu_timer (void );
arch/sparc/include/asm/timex_32.h +1 -3
@@ -9,8 +9,6 @@#define CLOCK_TICK_RATE 1193180/* Underlying HZ */ -/* XXX Maybe do something better at some point... -DaveM */ -typedef unsigned long cycles_t ; -#define get_cycles () (0) +#include <asm-generic/timex.h> #endif
arch/um/include/asm/timex.h +2 -7
@@ -2,13 +2,8 @@#ifndef __UM_TIMEX_H#define __UM_TIMEX_H -typedef unsigned long cycles_t ; - -static inline cycles_t get_cycles (void ) -{ -return 0 ; -} -#define CLOCK_TICK_RATE (HZ) +#include <asm-generic/timex.h> +#endif
arch/x86/include/asm/timex.h +9 -0
@@ -5,6 +5,15 @@#include <asm/processor.h> #include <asm/tsc.h> +static inline unsigned long random_get_entropy (void ) +{ +if (!IS_ENABLED (CONFIG_X86_TSC ) && + !cpu_feature_enabled (X86_FEATURE_TSC )) +return random_get_entropy_fallback (); +return rdtsc (); +} +#define random_get_entropy random_get_entropy +/* Assume we use the PIT time source for the clock tick */ #define CLOCK_TICK_RATE PIT_TICK_RATE
arch/x86/include/asm/tsc.h +3 -4
@@ -20,13 +20,12 @@ extern void disable_TSC(void);static inline cycles_t get_cycles (void ) { -#ifndef CONFIG_X86_TSC -if (!boot_cpu_has (X86_FEATURE_TSC )) +if (!IS_ENABLED (CONFIG_X86_TSC ) && + !cpu_feature_enabled (X86_FEATURE_TSC ))return 0 ; -#endif -return rdtsc (); } +#define get_cycles get_cyclesextern struct system_counterval_t convert_art_to_tsc (u64 art);extern struct system_counterval_t convert_art_ns_to_tsc (u64 art_ns);
arch/xtensa/include/asm/timex.h +2 -4
@@ -29,10 +29,6 @@extern unsigned long ccount_freq; -typedef unsigned long long cycles_t ; - -#define get_cycles () (0) -void local_timer_setup (unsigned cpu);/*
@@ -59,4 +55,6 @@ static inline void set_linux_timer (unsigned long ccompare) xtensa_set_sr(ccompare, SREG_CCOMPARE + LINUX_TIMER); } +#include <asm-generic/timex.h> +#endif /* _XTENSA_TIMEX_H */
drivers/acpi/sysfs.c +18 -7
@@ -415,19 +415,30 @@ static ssize_t acpi_data_show(struct file *filp, struct kobject *kobj, loff_t offset, size_t count) {struct acpi_data_attr *data_attr; -void *base; -ssize_t rc; +void __iomem *base; +ssize_t size; data_attr = container_of(bin_attr, struct acpi_data_attr, attr); + size = data_attr->attr.size; + +if (offset <0 ) +return -EINVAL ; + +if (offset >= size) +return 0 ; - base =acpi_os_map_memory (data_attr->addr, data_attr->attr.size); +if (count > size - offset) + count = size - offset; + + base =acpi_os_map_iomem (data_attr->addr, size);if (!base)return -ENOMEM ; - rc =memory_read_from_buffer (buf, count, &offset, base, - data_attr->attr.size); -acpi_os_unmap_memory (base, data_attr->attr.size); -return rc; +memcpy_fromio (buf, base + offset, count); + +acpi_os_unmap_iomem (base, size); + +return count; }static int acpi_bert_data_init (void *th,struct acpi_data_attr *data_attr)
drivers/char/random.c +503 -710
1,826 lines not on this page · raw message
drivers/hid/amd-sfh-hid/amd_sfh_client.c +11 -0
@@ -227,6 +227,17 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)dev_dbg (dev,"sid 0x%x status 0x%x\n" , cl_data->sensor_idx[i], cl_data->sensor_sts[i]); } +if (privdata->mp2_ops->discovery_status && + privdata->mp2_ops->discovery_status (privdata) ==0 ) { +amd_sfh_hid_client_deinit (privdata); +for (i =0 ; i < cl_data->num_hid_devices; i++) { +devm_kfree (dev, cl_data->feature_report[i]); +devm_kfree (dev, in_data->input_report[i]); +devm_kfree (dev, cl_data->report_descr[i]); + } +dev_warn (dev,"Failed to discover, sensors not enabled\n" ); +return -EOPNOTSUPP ; + }schedule_delayed_work (&cl_data->work_buffer,msecs_to_jiffies (AMD_SFH_IDLE_LOOP ));return 0 ;
drivers/hid/amd-sfh-hid/amd_sfh_pcie.c +7 -0
@@ -130,6 +130,12 @@ static int amd_sfh_irq_init_v2(struct amd_mp2_dev *privdata)return 0 ; } +static int amd_sfh_dis_sts_v2 (struct amd_mp2_dev *privdata) +{ +return (readl (privdata->mmio +AMD_P2C_MSG (1 )) & +SENSOR_DISCOVERY_STATUS_MASK ) >>SENSOR_DISCOVERY_STATUS_SHIFT ; +} +void amd_start_sensor (struct amd_mp2_dev *privdata,struct amd_mp2_sensor_info info) {union sfh_cmd_param cmd_param;
@@ -245,6 +251,7 @@ static const struct amd_mp2_ops amd_sfh_ops_v2 = { .response = amd_sfh_wait_response_v2, .clear_intr = amd_sfh_clear_intr_v2, .init_intr = amd_sfh_irq_init_v2, + .discovery_status = amd_sfh_dis_sts_v2, };static const struct amd_mp2_ops amd_sfh_ops = {
drivers/hid/amd-sfh-hid/amd_sfh_pcie.h +4 -0
@@ -39,6 +39,9 @@#define AMD_SFH_IDLE_LOOP 200 +#define SENSOR_DISCOVERY_STATUS_MASK GENMASK(5, 3) +#define SENSOR_DISCOVERY_STATUS_SHIFT 3 +/* SFH Command register */ union sfh_cmd_base {u32 ul;
@@ -143,5 +146,6 @@ struct amd_mp2_ops {int (*response)(struct amd_mp2_dev *mp2,u8 sid,u32 sensor_sts);void (*clear_intr)(struct amd_mp2_dev *privdata);int (*init_intr)(struct amd_mp2_dev *privdata); + int (*discovery_status)(struct amd_mp2_dev *privdata); };#endif
include/linux/mm.h +1 -0
@@ -2677,6 +2677,7 @@ extern int install_special_mapping(struct mm_struct *mm, unsigned long flags, struct page **pages);unsigned long randomize_stack_top (unsigned long stack_top); +unsigned long randomize_page (unsigned long start,unsigned long range);extern unsigned long get_unmapped_area (struct file *,unsigned long ,unsigned long ,unsigned long ,unsigned long );
include/linux/prandom.h +7 -16
@@ -10,6 +10,7 @@#include <linux/types.h> #include <linux/percpu.h> +#include <linux/siphash.h> u32 prandom_u32 (void );void prandom_bytes (void *buf,size_t nbytes);
@@ -27,15 +28,10 @@ DECLARE_PER_CPU(unsigned long, net_rand_noise);* The core SipHash round function. Each line can be executed in * parallel given enough CPU resources. */ -#define PRND_SIPROUND (v0, v1, v2, v3) ( \ - v0 += v1, v1 = rol64(v1, 13), v2 += v3, v3 = rol64(v3, 16), \ - v1 ^= v0, v0 = rol64(v0, 32), v3 ^= v2, \ - v0 += v3, v3 = rol64(v3, 21), v2 += v1, v1 = rol64(v1, 17), \ - v3 ^= v0, v1 ^= v2, v2 = rol64(v2, 32) \ -) +#define PRND_SIPROUND (v0, v1, v2, v3) SIPHASH_PERMUTATION(v0, v1, v2, v3) -#define PRND_K0 (0x736f6d6570736575 ^ 0x6c7967656e657261) -#define PRND_K1 (0x646f72616e646f6d ^ 0x7465646279746573) +#define PRND_K0 (SIPHASH_CONST_0 ^ SIPHASH_CONST_2) +#define PRND_K1 (SIPHASH_CONST_1 ^ SIPHASH_CONST_3)#elif BITS_PER_LONG ==32 /*
@@ -43,14 +39,9 @@ DECLARE_PER_CPU(unsigned long, net_rand_noise);* This is weaker, but 32-bit machines are not used for high-traffic * applications, so there is less output for an attacker to analyze. */ -#define PRND_SIPROUND (v0, v1, v2, v3) ( \ - v0 += v1, v1 = rol32(v1, 5), v2 += v3, v3 = rol32(v3, 8), \ - v1 ^= v0, v0 = rol32(v0, 16), v3 ^= v2, \ - v0 += v3, v3 = rol32(v3, 7), v2 += v1, v1 = rol32(v1, 13), \ - v3 ^= v0, v1 ^= v2, v2 = rol32(v2, 16) \ -) -#define PRND_K0 0x6c796765 -#define PRND_K1 0x74656462 +#define PRND_SIPROUND (v0, v1, v2, v3) HSIPHASH_PERMUTATION(v0, v1, v2, v3) +#define PRND_K0 (HSIPHASH_CONST_0 ^ HSIPHASH_CONST_2) +#define PRND_K1 (HSIPHASH_CONST_1 ^ HSIPHASH_CONST_3)#else #error Unsupported BITS_PER_LONG
include/linux/random.h +37 -55
145 lines not on this page · raw message
include/linux/security.h +2 -0
@@ -121,10 +121,12 @@ enum lockdown_reason {LOCKDOWN_DEBUGFS ,LOCKDOWN_XMON_WR ,LOCKDOWN_BPF_WRITE_USER , +LOCKDOWN_DBG_WRITE_KERNEL ,LOCKDOWN_INTEGRITY_MAX ,LOCKDOWN_KCORE ,LOCKDOWN_KPROBES ,LOCKDOWN_BPF_READ_KERNEL , +LOCKDOWN_DBG_READ_KERNEL ,LOCKDOWN_PERF ,LOCKDOWN_TRACEFS , LOCKDOWN_XMON_RW,
include/linux/siphash.h +28 -0
@@ -138,4 +138,32 @@ static inline u32 hsiphash(const void *data, size_t len, return ___hsiphash_aligned(data, len, key); } +/* +* These macros expose the raw SipHash and HalfSipHash permutations. +* Do not use them directly! If you think you have a use for them, +* be sure to CC the maintainer of this file explaining why. +*/ + +#define SIPHASH_PERMUTATION (a, b, c, d) ( \ + (a) += (b), (b) = rol64((b), 13), (b) ^= (a), (a) = rol64((a), 32), \ + (c) += (d), (d) = rol64((d), 16), (d) ^= (c), \ + (a) += (d), (d) = rol64((d), 21), (d) ^= (a), \ + (c) += (b), (b) = rol64((b), 17), (b) ^= (c), (c) = rol64((c), 32)) + +#define SIPHASH_CONST_0 0x736f6d6570736575ULL +#define SIPHASH_CONST_1 0x646f72616e646f6dULL +#define SIPHASH_CONST_2 0x6c7967656e657261ULL +#define SIPHASH_CONST_3 0x7465646279746573ULL + +#define HSIPHASH_PERMUTATION (a, b, c, d) ( \ + (a) += (b), (b) = rol32((b), 5), (b) ^= (a), (a) = rol32((a), 16), \ + (c) += (d), (d) = rol32((d), 8), (d) ^= (c), \ + (a) += (d), (d) = rol32((d), 7), (d) ^= (a), \ + (c) += (b), (b) = rol32((b), 13), (b) ^= (c), (c) = rol32((c), 16)) + +#define HSIPHASH_CONST_0 0U +#define HSIPHASH_CONST_1 0U +#define HSIPHASH_CONST_2 0x6c796765U +#define HSIPHASH_CONST_3 0x74656462U +#endif /* _LINUX_SIPHASH_H */
include/linux/timex.h +8 -0
@@ -62,6 +62,8 @@#include <linux/types.h> #include <linux/param.h> +unsigned long random_get_entropy_fallback (void ); +#include <asm/timex.h> #ifndef random_get_entropy
@@ -74,8 +76,14 @@* * By default we use get_cycles() for this purpose, but individual * architectures may override this in their asm/timex.h header file. +* If a given arch does not have get_cycles(), then we fallback to +* using random_get_entropy_fallback(). */ +#ifdef get_cycles#define random_get_entropy () ((unsigned long)get_cycles()) +#else +#define random_get_entropy () random_get_entropy_fallback() +#endif #endif /*
init/main.c +5 -8
@@ -1035,21 +1035,18 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)softirq_init ();timekeeping_init ();kfence_init (); +time_init ();/* * For best initial stack canary entropy, prepare it after: * - setup_arch() for any UEFI RNG entropy and boot cmdline access -* - timekeeping_init() for ktime entropy used in rand_initialize() -* - rand_initialize() to get any arch-specific entropy like RDRAND -* - add_latent_entropy() to get any latent entropy -* - adding command line entropy +* - timekeeping_init() for ktime entropy used in random_init() +* - time_init() for making random_get_entropy() work on some platforms +* - random_init() to initialize the RNG from from early entropy sources */ -rand_initialize (); -add_latent_entropy (); -add_device_randomness (command_line,strlen (command_line)); +random_init (command_line);boot_init_stack_canary (); -time_init ();perf_event_init ();profile_init ();call_function_init ();
kernel/debug/debug_core.c +24 -0
@@ -53,6 +53,7 @@#include <linux/vmacache.h> #include <linux/rcupdate.h> #include <linux/irq.h> +#include <linux/security.h> #include <asm/cacheflush.h> #include <asm/byteorder.h>
@@ -752,6 +753,29 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,continue ; kgdb_connected =0 ; }else { +/* +* This is a brutal way to interfere with the debugger +* and prevent gdb being used to poke at kernel memory. +* This could cause trouble if lockdown is applied when +* there is already an active gdb session. For now the +* answer is simply "don't do that". Typically lockdown +* *will* be applied before the debug core gets started +* so only developers using kgdb for fairly advanced +* early kernel debug can be biten by this. Hopefully +* they are sophisticated enough to take care of +* themselves, especially with help from the lockdown +* message printed on the console! +*/ +if (security_locked_down (LOCKDOWN_DBG_WRITE_KERNEL )) { +if (IS_ENABLED (CONFIG_KGDB_KDB )) { +/* Switch back to kdb if possible... */ + dbg_kdb_mode =1 ; +continue ; + }else { +/* ... otherwise just bail */ +break ; + } + } error =gdb_serial_stub (ks); }
kernel/debug/kdb/kdb_main.c +59 -3
81 lines not on this page · raw message
kernel/time/timekeeping.c +15 -0
@@ -17,6 +17,7 @@#include <linux/clocksource.h> #include <linux/jiffies.h> #include <linux/time.h> +#include <linux/timex.h> #include <linux/tick.h> #include <linux/stop_machine.h> #include <linux/pvclock_gtod.h>
@@ -2380,6 +2381,20 @@ static int timekeeping_validate_timex(const struct __kernel_timex *txc)return 0 ; } +/** +* random_get_entropy_fallback - Returns the raw clock source value, +* used by random.c for platforms with no valid random_get_entropy(). +*/ +unsigned long random_get_entropy_fallback (void ) +{ +struct tk_read_base *tkr = &tk_core.timekeeper.tkr_mono; +struct clocksource *clock =READ_ONCE (tkr->clock); + +if (unlikely (timekeeping_suspended || !clock)) +return 0 ; +return clock->read (clock); +} +EXPORT_SYMBOL_GPL (random_get_entropy_fallback);/** * do_adjtimex() - Accessor function to NTP __do_adjtimex function
lib/Kconfig.debug +1 -2
@@ -1616,8 +1616,7 @@ config WARN_ALL_UNSEEDED_RANDOM so architecture maintainers really need to do what they can to get the CRNG seeded sooner after the system is booted. However, since users cannot do anything actionable to - address this, by default the kernel will issue only a single - warning for the first use of unseeded randomness. + address this, by default this option is disabled. Say Y here if you want to receive warnings for all uses of unseeded randomness. This will be of use primarily for
lib/siphash.c +10 -22
@@ -18,19 +18,13 @@#include <asm/word-at-a-time.h> #endif -#define SIPROUND \ - do { \ - v0 += v1; v1 = rol64(v1, 13); v1 ^= v0; v0 = rol64(v0, 32); \ - v2 += v3; v3 = rol64(v3, 16); v3 ^= v2; \ - v0 += v3; v3 = rol64(v3, 21); v3 ^= v0; \ - v2 += v1; v1 = rol64(v1, 17); v1 ^= v2; v2 = rol64(v2, 32); \ - } while (0) +#define SIPROUND SIPHASH_PERMUTATION(v0, v1, v2, v3)#define PREAMBLE (len) \ - u64 v0 = 0x736f6d6570736575ULL; \ - u64 v1 = 0x646f72616e646f6dULL; \ - u64 v2 = 0x6c7967656e657261ULL; \ - u64 v3 = 0x7465646279746573ULL; \ + u64 v0 = SIPHASH_CONST_0; \ + u64 v1 = SIPHASH_CONST_1; \ + u64 v2 = SIPHASH_CONST_2; \ + u64 v3 = SIPHASH_CONST_3; \ u64 b = ((u64)(len)) << 56; \ v3 ^= key->key[1]; \ v2 ^= key->key[0]; \
@@ -389,19 +383,13 @@ u32 hsiphash_4u32(const u32 first, const u32 second, const u32 third, }EXPORT_SYMBOL (hsiphash_4u32);#else -#define HSIPROUND \ - do { \ - v0 += v1; v1 = rol32(v1, 5); v1 ^= v0; v0 = rol32(v0, 16); \ - v2 += v3; v3 = rol32(v3, 8); v3 ^= v2; \ - v0 += v3; v3 = rol32(v3, 7); v3 ^= v0; \ - v2 += v1; v1 = rol32(v1, 13); v1 ^= v2; v2 = rol32(v2, 16); \ - } while (0) +#define HSIPROUND HSIPHASH_PERMUTATION(v0, v1, v2, v3)#define HPREAMBLE (len) \ - u32 v0 = 0; \ - u32 v1 = 0; \ - u32 v2 = 0x6c796765U; \ - u32 v3 = 0x74656462U; \ + u32 v0 = HSIPHASH_CONST_0; \ + u32 v1 = HSIPHASH_CONST_1; \ + u32 v2 = HSIPHASH_CONST_2; \ + u32 v3 = HSIPHASH_CONST_3; \ u32 b = ((u32)(len)) << 24; \ v3 ^= key->key[1]; \ v2 ^= key->key[0]; \
mm/util.c +32 -0
@@ -343,6 +343,38 @@ unsigned long randomize_stack_top(unsigned long stack_top)#endif } +/** +* randomize_page - Generate a random, page aligned address +* @start: The smallest acceptable address the caller will take. +* @range: The size of the area, starting at @start, within which the +* random address must fall. +* +* If @start + @range would overflow, @range is capped. +* +* NOTE: Historical use of randomize_range, which this replaces, presumed that +* @start was already page aligned. We now align it regardless. +* +* Return: A page aligned address within [start, start + range). On error, +* @start is returned. +*/ +unsigned long randomize_page (unsigned long start,unsigned long range) +{ +if (!PAGE_ALIGNED (start)) { + range -=PAGE_ALIGN (start) - start; + start =PAGE_ALIGN (start); + } + +if (start >ULONG_MAX - range) + range =ULONG_MAX - start; + + range >>=PAGE_SHIFT ; + +if (range ==0 ) +return start; + +return start + (get_random_long () % range <<PAGE_SHIFT ); +} +#ifdef CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT unsigned long arch_randomize_brk (struct mm_struct *mm) {
security/security.c +2 -0
@@ -59,10 +59,12 @@ const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1] = { [LOCKDOWN_DEBUGFS] = "debugfs access", [LOCKDOWN_XMON_WR] = "xmon write access", [LOCKDOWN_BPF_WRITE_USER] = "use of bpf to write user RAM", + [LOCKDOWN_DBG_WRITE_KERNEL] = "use of kgdb/kdb to write kernel RAM", [LOCKDOWN_INTEGRITY_MAX] = "integrity", [LOCKDOWN_KCORE] = "/proc/kcore access", [LOCKDOWN_KPROBES] = "use of kprobes", [LOCKDOWN_BPF_READ_KERNEL] = "use of bpf to read kernel RAM", + [LOCKDOWN_DBG_READ_KERNEL] = "use of kgdb/kdb to read kernel RAM", [LOCKDOWN_PERF] = "unsafe use of perf", [LOCKDOWN_TRACEFS] = "use of tracefs", [LOCKDOWN_XMON_RW] = "xmon read and write access",
sound/pci/ctxfi/ctatc.c +2 -0
@@ -36,6 +36,7 @@ | ((IEC958_AES3_CON_FS_48000) << 24))static const struct snd_pci_quirk subsys_20k1_list[] = { +SND_PCI_QUIRK (PCI_VENDOR_ID_CREATIVE ,0x0021 ,"SB046x" ,CTSB046X ),SND_PCI_QUIRK (PCI_VENDOR_ID_CREATIVE ,0x0022 ,"SB055x" ,CTSB055X ),SND_PCI_QUIRK (PCI_VENDOR_ID_CREATIVE ,0x002f ,"SB055x" ,CTSB055X ),SND_PCI_QUIRK (PCI_VENDOR_ID_CREATIVE ,0x0029 ,"SB073x" ,CTSB073X ),
@@ -64,6 +65,7 @@ static const struct snd_pci_quirk subsys_20k2_list[] = {static const char *ct_subsys_name[NUM_CTCARDS ] = {/* 20k1 models */ + [CTSB046X ] ="SB046x" , [CTSB055X ] ="SB055x" , [CTSB073X ] ="SB073x" , [CTUAA ] ="UAA" ,
sound/pci/ctxfi/cthardware.h +2 -1
@@ -26,8 +26,9 @@ enum CHIPTYP {enum CTCARDS {/* 20k1 models */ +CTSB046X , +CT20K1_MODEL_FIRST =CTSB046X ,CTSB055X , -CT20K1_MODEL_FIRST =CTSB055X ,CTSB073X ,CTUAA ,CT20K1_UNKNOWN ,