mirror of
https://github.com/LineageOS/android_kernel_fxtec_sm6115.git
synced 2026-08-19 05:41:10 +00:00
version 4.19.325-cip131 * tag 'v4.19.325-cip131' of https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip: CIP: Bump version suffix to -cip131 after merge from cip/linux-4.19.y-st tree Update localversion-st, tree is up-to-date with 5.10.252. nfsd: fix return error code for nfsd_map_name_to_[ug]id net: usb: pegasus: enable basic endpoint checking Bluetooth: L2CAP: Fix not checking l2cap_chan security level Bluetooth: Enforce key size of 16 bytes on FIPS level xfrm6: fix uninitialized saddr in xfrm6_get_saddr() netfilter: nf_conntrack: Add allow_clash to generic protocol handler ext4: don't cache extent during splitting extent NTB: ntb_transport: Fix too small buffer for debugfs_name net: ethernet: ec_bhf: Fix dma_free_coherent() dma handle fbdev: ffb: fix corrupted video output on Sun FFB1 fbdev: of: display_timing: fix refcount leak in of_get_display_timings() atm: fore200e: fix use-after-free in tasklets during device removal net: wan/fsl_ucc_hdlc: Fix dma_free_coherent() in uhdlc_memclean() net: ethernet: marvell: skge: remove incorrect conflicting PCI ID ceph: supply snapshot context in ceph_zero_partial_object() MIPS: rb532: Fix MMIO UART resource registration parisc: kernel: replace kfree() with put_device() in create_tree_node() drm/amdkfd: Fix out-of-bounds write in kfd_event_page_set() usb: dwc2: fix resume failure if dr_mode is host btrfs: continue trimming remaining devices on failure kexec: derive purgatory entry from symbol ocfs2: fix reflink preserve cleanup issue ocfs2: fix xattr array entry __counted_by error rapidio: replace rio_free_net() with kfree() in rio_scan_alloc_net() iio: gyro: itg3200: Fix unchecked return value in read_raw dm mpath: make pg_init_delay_msecs settable bus: fsl-mc: fix an error handling in fsl_mc_device_add() md/bitmap: fix GPF in write_page caused by resize race xfs: fix remote xattr valuelblk check xfs: fix freemap adjustments when adding xattrs to leaf blocks xfs: delete attr leaf freemap entries when empty xfs: mark data structures corrupt on EIO and ENODATA mm, page_alloc, thp: prevent reclaim for __GFP_THISNODE THP allocations drm: of: drm_of_panel_bridge_remove(): fix device_node leak dm-unstripe: fix mapping bug when there are multiple targets in a table clk: tegra: tegra124-emc: Fix potential memory leak in tegra124_clk_register_emc() dm: clear cloned request bio pointer when last clone bio completes media: i2c/tw9906: Fix potential memory leak in tw9906_probe() media: i2c/tw9903: Fix potential memory leak in tw9903_probe() media: cx25821: Add missing unmap in snd_cx25821_hw_params() media: cx23885: Add missing unmap in snd_cx23885_hw_params() media: cx88: Add missing unmap in snd_cx88_hw_params() media: radio-keene: fix memory leak in error path HID: prodikeys: Check presence of pm->input_ep82 HID: magicmouse: Do not crash on missing msc->input HID: hid-pl: handle probe errors media: mtk-mdp: Fix a reference leak bug in mtk_mdp_remove() dm-verity: correctly handle dm_bufio_client_create() failure fpga: dfl: use subsys_initcall to allow built-in drivers to be added rpmsg: core: fix race in driver_override_show() and use core helper netfilter: nf_conntrack_h323: fix OOB read in decode_choice() net: consume xmit errors of GSO frames Bluetooth: L2CAP: Fix missing key size check for L2CAP_LE_CONN_REQ Bluetooth: l2cap: Check encryption key size on incoming connection wifi: cfg80211: wext: fix IGTK key ID off-by-one net: usb: lan78xx: scan all MDIO addresses on LAN7801 lan78xx: Fix memory allocation bug lan78xx: Fix race condition in disconnect handling lan78xx: Remove unused pause frame queue net: usb: kaweth: remove TX queue manipulation in kaweth_set_rx_mode ntb: ntb_hw_switchtec: Fix shift-out-of-bounds for 0 mw lut ntb: ntb_hw_switchtec: Fix array-index-out-of-bounds access drm/radeon: Add HAINAN clock adjustment drm/amdgpu: Add HAINAN clock adjustment ARM: 9467/1: mm: Don't use %pK through printk include: uapi: netfilter_bridge.h: Cover for musl libc iio: magnetometer: Remove IRQF_ONESHOT Revert "mfd: da9052-spi: Change read-mask to write-mask" binder: don't use %pK through printk serial: 8250_dw: handle clock enable errors in runtime_resume m68k: nommu: fix memmove() with differently aligned src and dest for 68000 clk: microchip: core: correct return value on *_get_parent() nfc: nxp-nci: remove interrupt trigger type myri10ge: avoid uninitialized variable use PCI: Mark Nvidia GB10 to avoid bus reset PCI: Fix pci_slot_lock () device locking PCI: Mark ASM1164 SATA controller to avoid bus reset net/rds: Clear reconnect pending bit vmw_vsock: bypass false-positive Wnonnull warning with gcc-16 net: usb: sr9700: remove code to drive nonexistent multicast filter Bluetooth: btusb: Add device ID for Realtek RTL8761BU Bluetooth: hci_conn: use mod_delayed_work for active mode timeout ipv4: fib: Annotate access to struct fib_alias.fa_state. wifi: iwlegacy: add missing mutex protection in il3945_store_measurement() wifi: iwlegacy: add missing mutex protection in il4965_store_tx_power() net/rds: No shortcut out of RDS_CONN_ERROR net: usb: r8152: fix transmit queue timeout openrisc: define arch-specific version of nop() netfilter: xt_tcpmss: check remaining length before reading optlen wifi: libertas: fix WARNING in usb_tx_block jfs: nlink overflow in jfs_rename jfs: Add missing set_freezable() for freezable kthread modpost: Amend ppc64 save/restfpr symnames for -Os build ASoC: es8328: Add error unwind in resume HID: multitouch: add eGalaxTouch EXC3188 support drm/atmel-hlcdc: fix use-after-free of drm_crtc_commit after release drm/atmel-hlcdc: fix memory leak from the atomic_destroy_state callback virt: vbox: uapi: Mark inner unions in packed structs as packed hyper-v: Mark inner union in hv_kvp_exchg_msg_value as packed drm: Account property blob allocations to memcg media: cx25821: Fix a resource leak in cx25821_dev_setup() media: solo6x10: Check for out of bounds chip_id media: pvrusb2: fix URB leak in pvr2_send_request_ex media: adv7180: fix frame interval in progressive mode ASoC: wm8962: Add WM8962_ADC_MONOMIX to "3D Coefficients" mask media: omap3isp: set initial format media: omap3isp: isppreview: always clamp in preview_try_format() media: omap3isp: isp_video_mbus_to_pix/pix_to_mbus fixes media: dvb-core: dmxdevfilter must always flush bufs parisc: Prevent interrupts during reboot arm64: tegra: smaug: Add usb-role-switch support pstore: ram_core: fix incorrect success return when vmap() fails mailbox: bcm-ferxrm-mailbox: Use default primary handler clocksource/drivers/sh_tmu: Always leave device running after probe sparc: don't reference obsolete termio struct for TC* constants xenbus: Use .freeze/.thaw to handle xenbus devices ACPICA: Abort AML bytecode execution when executing AML_FATAL_OP EFI/CPER: don't go past the ARM processor CPER record buffer x86/xen/pvh: Enable PAE mode for 32-bit guest only when CONFIG_X86_PAE is set s390/purgatory: Add -Wno-default-const-init-unsafe to KBUILD_CFLAGS tools/power cpupower: Reset errno before strtoull() minix: Add required sanity checking to minix_check_superblock() hfsplus: pretend special inodes as regular files audit: add missing syscalls to read class hfsplus: fix volume corruption issue for generic/498 audit: add fchmodat2() to change attributes class rtc: interface: Alarm race handling should not discard preceding error SUNRPC: fix gss_auth kref leak in gss_alloc_msg error path SUNRPC: auth_gss: fix memory leaks in XDR decoding error paths ata: pata_ftide010: Fix some DMA timings ext4: fix memory leak in ext4_ext_shift_extents() MIPS: Work around LLVM bug when gp is used as global register variable apparmor: fix invalid deref of rawdata when export_binary is unset apparmor: fix rlimit for posix cpu timers apparmor: fix NULL sock in aa_sock_file_perm bonding: alb: fix UAF in rlb_arp_recv during bond up/down macvlan: observe an RCU grace period in macvlan_common_newlink() error path netfilter: nf_conntrack_h323: don't pass uninitialised l3num value net/rds: rds_sendmsg should not discard payload_len xen-netback: reject zero-queue configuration from guest net: usb: catc: enable basic endpoint checking usbb: catc: use correct API for MAC addresses cpuidle: Skip governor when only one idle state is available pinctrl: single: fix refcount leak in pcs_add_gpio_func() iio: sca3000: Fix a resource leak in sca3000_probe() ovl: Fix uninit-value in ovl_fill_real drivers: iio: mpu3050: use dev_err_probe for regulator request mfd: arizona: Fix regulator resource leak on wm5102_clear_write_sequencer() failure Revert "mmc: rtsx_pci_sdmmc: increase power-on settling delay to 5ms" mmc: rtsx_pci_sdmmc: increase power-on settling delay to 5ms mmc: core: Initial support for SD express card/host serial: SH_SCI: improve "DMA support" prompt staging: greybus: lights: avoid NULL deref fbdev: au1200fb: Fix a memory leak in au1200fb_drv_probe() tracing: Remove duplicate ENABLE_EVENT_STR and DISABLE_EVENT_STR macros scsi: csiostor: Fix dereference of null pointer rn pNFS: fix a missing wake up while waiting on NFS_LAYOUT_DRAIN svcrdma: Remove queue-shortening warnings RDMA/core: Fix a couple of obvious typos in comments power: supply: wm97xx_battery: Convert to GPIO descriptor power: supply: bq27xxx: fix wrong errno when bus ops are unsupported power: supply: sbs-battery: Fix use-after-free in power_supply_changed() power: supply: rt9455: Fix use-after-free in power_supply_changed() power: supply: act8945a: Fix use-after-free in power_supply_changed() serial: caif: fix use-after-free in caif_serial ldisc_close() net: atm: fix crash due to unvalidated vcc pointer in sigd_send() procfs: fix missing RCU protection when reading real_parent in do_task_stat() netfilter: nft_set_rbtree: check for partial overlaps in anonymous sets netfilter: nft_set_hash: fix get operation on big endian bonding: only set speed/duplex to unknown, if getting speed failed ucount: check for CAP_SYS_RESOURCE using ns_capable_noaudit() tcp: tcp_tx_timestamp() must look at the rtx queue fat: avoid parent link count underflow in rmdir PCI: Mark 3ware-9650SA Root Port Extended Tags as broken netfilter: nf_conncount: fix tracking of connections from localhost netfilter: nf_conncount: increase the connection clean up limit to 64 netfilter: nf_conncount: make nf_conncount_gc_list() to disable BH wifi: cfg80211: stop NAN and P2P in cfg80211_leave PCI/portdrv: Fix potential resource leak PCI: Do not attempt to set ExtTag for VFs PCI: mediatek: Fix IRQ domain leak when MSI allocation fails Revert "hwmon: (ibmpex) fix use-after-free in high/low store" spi: tools: Add include folder to .gitignore regulator: Flag uncontrollable regulators as always_on regulator: core: Respect off_on_delay at startup smack: /smack/doi: accept previously used values smack: /smack/doi must be > 0 arm64: dts: amlogic: gx: assign the MMC signal clocks ARM: dts: allwinner: sun5i-a13-utoo-p66: delete "power-gpios" property EDAC/i5400: Fix snprintf() limit calculation in calculate_dimm_size() EDAC/i5000: Fix snprintf() size calculation in calculate_dimm_size() pstore/ram: fix buffer overflow in persistent_ram_save_old() sched/rt: Skip currently executing CPU in rto_next_cpu() mfd: wm8350-core: Use IRQF_ONESHOT EDAC/altera: Remove IRQF_ONESHOT hrtimer: Fix trace oddity crypto: cavium - fix dma_free_coherent() size s390/cio: Fix device lifecycle handling in css_alloc_subchannel() PM: sleep: wakeirq: harden dev_pm_clear_wake_irq() against races md/raid10: fix any_working flag handling in raid10_sync_request tpm: st33zp24: Fix missing cleanup on get_burstcount() error tpm: tpm_i2c_infineon: Fix locality leak on get_burstcount() failure gfs2: Add metapath_dibh helper gfs2: Add wrapper for iomap_file_buffered_write fs: add <linux/init_task.h> for 'init_fs' hfsplus: return error when node already exists in hfs_bnode_create auxdisplay: arm-charlcd: fix release_mem_region() size RDMA/umad: Reject negative data_len in ib_umad_write Change-Id: Ice1efa8b2faaaab14d1d1563e5aa6ae36549682b
346 lines
8.9 KiB
C
346 lines
8.9 KiB
C
/*
|
|
* PARISC Architecture-dependent parts of process handling
|
|
* based on the work for i386
|
|
*
|
|
* Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org>
|
|
* Copyright (C) 2000 Martin K Petersen <mkp at mkp.net>
|
|
* Copyright (C) 2000 John Marvin <jsm at parisc-linux.org>
|
|
* Copyright (C) 2000 David Huggins-Daines <dhd with pobox.org>
|
|
* Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org>
|
|
* Copyright (C) 2000 Philipp Rumpf <prumpf with tux.org>
|
|
* Copyright (C) 2000 David Kennedy <dkennedy with linuxcare.com>
|
|
* Copyright (C) 2000 Richard Hirst <rhirst with parisc-linux.org>
|
|
* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org>
|
|
* Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org>
|
|
* Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org>
|
|
* Copyright (C) 2001-2014 Helge Deller <deller@gmx.de>
|
|
* Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <linux/elf.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/cpu.h>
|
|
#include <linux/module.h>
|
|
#include <linux/personality.h>
|
|
#include <linux/ptrace.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/sched/debug.h>
|
|
#include <linux/sched/task.h>
|
|
#include <linux/sched/task_stack.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/stddef.h>
|
|
#include <linux/unistd.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/rcupdate.h>
|
|
#include <linux/random.h>
|
|
#include <linux/nmi.h>
|
|
|
|
#include <asm/io.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/assembly.h>
|
|
#include <asm/pdc.h>
|
|
#include <asm/pdc_chassis.h>
|
|
#include <asm/pgalloc.h>
|
|
#include <asm/unwind.h>
|
|
#include <asm/sections.h>
|
|
|
|
#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
|
|
#define CMD_RESET 5 /* reset any module */
|
|
|
|
/*
|
|
** The Wright Brothers and Gecko systems have a H/W problem
|
|
** (Lasi...'nuf said) may cause a broadcast reset to lockup
|
|
** the system. An HVERSION dependent PDC call was developed
|
|
** to perform a "safe", platform specific broadcast reset instead
|
|
** of kludging up all the code.
|
|
**
|
|
** Older machines which do not implement PDC_BROADCAST_RESET will
|
|
** return (with an error) and the regular broadcast reset can be
|
|
** issued. Obviously, if the PDC does implement PDC_BROADCAST_RESET
|
|
** the PDC call will not return (the system will be reset).
|
|
*/
|
|
void machine_restart(char *cmd)
|
|
{
|
|
#ifdef FASTBOOT_SELFTEST_SUPPORT
|
|
/*
|
|
** If user has modified the Firmware Selftest Bitmap,
|
|
** run the tests specified in the bitmap after the
|
|
** system is rebooted w/PDC_DO_RESET.
|
|
**
|
|
** ftc_bitmap = 0x1AUL "Skip destructive memory tests"
|
|
**
|
|
** Using "directed resets" at each processor with the MEM_TOC
|
|
** vector cleared will also avoid running destructive
|
|
** memory self tests. (Not implemented yet)
|
|
*/
|
|
if (ftc_bitmap) {
|
|
pdc_do_firm_test_reset(ftc_bitmap);
|
|
}
|
|
#endif
|
|
/* set up a new led state on systems shipped with a LED State panel */
|
|
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_SHUTDOWN);
|
|
|
|
/* prevent interrupts during reboot */
|
|
set_eiem(0);
|
|
|
|
/* "Normal" system reset */
|
|
pdc_do_reset();
|
|
|
|
/* Nope...box should reset with just CMD_RESET now */
|
|
gsc_writel(CMD_RESET, COMMAND_GLOBAL);
|
|
|
|
/* Wait for RESET to lay us to rest. */
|
|
while (1) ;
|
|
|
|
}
|
|
|
|
void (*chassis_power_off)(void);
|
|
|
|
/*
|
|
* This routine is called from sys_reboot to actually turn off the
|
|
* machine
|
|
*/
|
|
void machine_power_off(void)
|
|
{
|
|
/* If there is a registered power off handler, call it. */
|
|
if (chassis_power_off)
|
|
chassis_power_off();
|
|
|
|
/* Put the soft power button back under hardware control.
|
|
* If the user had already pressed the power button, the
|
|
* following call will immediately power off. */
|
|
pdc_soft_power_button(0);
|
|
|
|
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_SHUTDOWN);
|
|
|
|
/* ipmi_poweroff may have been installed. */
|
|
if (pm_power_off)
|
|
pm_power_off();
|
|
|
|
/* It seems we have no way to power the system off via
|
|
* software. The user has to press the button himself. */
|
|
|
|
printk("Power off or press RETURN to reboot.\n");
|
|
|
|
/* prevent soft lockup/stalled CPU messages for endless loop. */
|
|
rcu_sysrq_start();
|
|
lockup_detector_soft_poweroff();
|
|
while (1) {
|
|
/* reboot if user presses RETURN key */
|
|
if (pdc_iodc_getc() == 13) {
|
|
printk("Rebooting...\n");
|
|
machine_restart(NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
void (*pm_power_off)(void);
|
|
EXPORT_SYMBOL(pm_power_off);
|
|
|
|
void machine_halt(void)
|
|
{
|
|
machine_power_off();
|
|
}
|
|
|
|
void flush_thread(void)
|
|
{
|
|
/* Only needs to handle fpu stuff or perf monitors.
|
|
** REVISIT: several arches implement a "lazy fpu state".
|
|
*/
|
|
}
|
|
|
|
void release_thread(struct task_struct *dead_task)
|
|
{
|
|
}
|
|
|
|
/*
|
|
* Fill in the FPU structure for a core dump.
|
|
*/
|
|
|
|
int dump_fpu (struct pt_regs * regs, elf_fpregset_t *r)
|
|
{
|
|
if (regs == NULL)
|
|
return 0;
|
|
|
|
memcpy(r, regs->fr, sizeof *r);
|
|
return 1;
|
|
}
|
|
|
|
int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r)
|
|
{
|
|
memcpy(r, tsk->thread.regs.fr, sizeof(*r));
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Idle thread support
|
|
*
|
|
* Detect when running on QEMU with SeaBIOS PDC Firmware and let
|
|
* QEMU idle the host too.
|
|
*/
|
|
|
|
int running_on_qemu __read_mostly;
|
|
EXPORT_SYMBOL(running_on_qemu);
|
|
|
|
void __cpuidle arch_cpu_idle_dead(void)
|
|
{
|
|
/* nop on real hardware, qemu will offline CPU. */
|
|
asm volatile("or %%r31,%%r31,%%r31\n":::);
|
|
}
|
|
|
|
void __cpuidle arch_cpu_idle(void)
|
|
{
|
|
local_irq_enable();
|
|
|
|
/* nop on real hardware, qemu will idle sleep. */
|
|
asm volatile("or %%r10,%%r10,%%r10\n":::);
|
|
}
|
|
|
|
static int __init parisc_idle_init(void)
|
|
{
|
|
if (!running_on_qemu)
|
|
cpu_idle_poll_ctrl(1);
|
|
|
|
return 0;
|
|
}
|
|
arch_initcall(parisc_idle_init);
|
|
|
|
/*
|
|
* Copy architecture-specific thread state
|
|
*/
|
|
int
|
|
copy_thread(unsigned long clone_flags, unsigned long usp,
|
|
unsigned long kthread_arg, struct task_struct *p)
|
|
{
|
|
struct pt_regs *cregs = &(p->thread.regs);
|
|
void *stack = task_stack_page(p);
|
|
|
|
/* We have to use void * instead of a function pointer, because
|
|
* function pointers aren't a pointer to the function on 64-bit.
|
|
* Make them const so the compiler knows they live in .text */
|
|
extern void * const ret_from_kernel_thread;
|
|
extern void * const child_return;
|
|
|
|
if (unlikely(p->flags & PF_KTHREAD)) {
|
|
/* kernel thread */
|
|
memset(cregs, 0, sizeof(struct pt_regs));
|
|
if (!usp) /* idle thread */
|
|
return 0;
|
|
/* Must exit via ret_from_kernel_thread in order
|
|
* to call schedule_tail()
|
|
*/
|
|
cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE;
|
|
cregs->kpc = (unsigned long) &ret_from_kernel_thread;
|
|
/*
|
|
* Copy function and argument to be called from
|
|
* ret_from_kernel_thread.
|
|
*/
|
|
#ifdef CONFIG_64BIT
|
|
cregs->gr[27] = ((unsigned long *)usp)[3];
|
|
cregs->gr[26] = ((unsigned long *)usp)[2];
|
|
#else
|
|
cregs->gr[26] = usp;
|
|
#endif
|
|
cregs->gr[25] = kthread_arg;
|
|
} else {
|
|
/* user thread */
|
|
/* usp must be word aligned. This also prevents users from
|
|
* passing in the value 1 (which is the signal for a special
|
|
* return for a kernel thread) */
|
|
if (usp) {
|
|
usp = ALIGN(usp, 4);
|
|
if (likely(usp))
|
|
cregs->gr[30] = usp;
|
|
}
|
|
cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE;
|
|
cregs->kpc = (unsigned long) &child_return;
|
|
|
|
/* Setup thread TLS area from the 4th parameter in clone */
|
|
if (clone_flags & CLONE_SETTLS)
|
|
cregs->cr27 = cregs->gr[23];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
unsigned long
|
|
get_wchan(struct task_struct *p)
|
|
{
|
|
struct unwind_frame_info info;
|
|
unsigned long ip;
|
|
int count = 0;
|
|
|
|
if (!p || p == current || p->state == TASK_RUNNING)
|
|
return 0;
|
|
|
|
/*
|
|
* These bracket the sleeping functions..
|
|
*/
|
|
|
|
unwind_frame_init_from_blocked_task(&info, p);
|
|
do {
|
|
if (unwind_once(&info) < 0)
|
|
return 0;
|
|
ip = info.ip;
|
|
if (!in_sched_functions(ip))
|
|
return ip;
|
|
} while (count++ < MAX_UNWIND_ENTRIES);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_64BIT
|
|
void *dereference_function_descriptor(void *ptr)
|
|
{
|
|
Elf64_Fdesc *desc = ptr;
|
|
void *p;
|
|
|
|
if (!get_kernel_nofault(p, &desc->addr))
|
|
ptr = p;
|
|
return ptr;
|
|
}
|
|
|
|
void *dereference_kernel_function_descriptor(void *ptr)
|
|
{
|
|
if (ptr < (void *)__start_opd ||
|
|
ptr >= (void *)__end_opd)
|
|
return ptr;
|
|
|
|
return dereference_function_descriptor(ptr);
|
|
}
|
|
#endif
|
|
|
|
static inline unsigned long brk_rnd(void)
|
|
{
|
|
return (get_random_int() & BRK_RND_MASK) << PAGE_SHIFT;
|
|
}
|
|
|
|
unsigned long arch_randomize_brk(struct mm_struct *mm)
|
|
{
|
|
unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd());
|
|
|
|
if (ret < mm->brk)
|
|
return mm->brk;
|
|
return ret;
|
|
}
|