Commit 5fd52203 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] fix kmalloc(0) in arch/ia64/pci/pci.c
  [IA64] Only unwind non-running tasks.
  [IA64] Improve unwind checking.
  [IA64] Yet another section mismatch warning
  [IA64] Fix bogus messages about system calls not implemented.
parents 5453e772 a66aa704
...@@ -763,6 +763,9 @@ get_wchan (struct task_struct *p) ...@@ -763,6 +763,9 @@ get_wchan (struct task_struct *p)
unsigned long ip; unsigned long ip;
int count = 0; int count = 0;
if (!p || p == current || p->state == TASK_RUNNING)
return 0;
/* /*
* Note: p may not be a blocked task (it could be current or * Note: p may not be a blocked task (it could be current or
* another process running on some other CPU. Rather than * another process running on some other CPU. Rather than
...@@ -773,6 +776,8 @@ get_wchan (struct task_struct *p) ...@@ -773,6 +776,8 @@ get_wchan (struct task_struct *p)
*/ */
unw_init_from_blocked_task(&info, p); unw_init_from_blocked_task(&info, p);
do { do {
if (p->state == TASK_RUNNING)
return 0;
if (unw_unwind(&info) < 0) if (unw_unwind(&info) < 0)
return 0; return 0;
unw_get_ip(&info, &ip); unw_get_ip(&info, &ip);
......
...@@ -1860,7 +1860,7 @@ int ...@@ -1860,7 +1860,7 @@ int
unw_unwind (struct unw_frame_info *info) unw_unwind (struct unw_frame_info *info)
{ {
unsigned long prev_ip, prev_sp, prev_bsp; unsigned long prev_ip, prev_sp, prev_bsp;
unsigned long ip, pr, num_regs; unsigned long ip, pr, num_regs, rp_loc, pfs_loc;
STAT(unsigned long start, flags;) STAT(unsigned long start, flags;)
int retval; int retval;
...@@ -1870,14 +1870,16 @@ unw_unwind (struct unw_frame_info *info) ...@@ -1870,14 +1870,16 @@ unw_unwind (struct unw_frame_info *info)
prev_sp = info->sp; prev_sp = info->sp;
prev_bsp = info->bsp; prev_bsp = info->bsp;
/* restore the ip */ /* validate the return IP pointer */
if (!info->rp_loc) { rp_loc = (unsigned long) info->rp_loc;
if ((rp_loc < info->regstk.limit) || (rp_loc > info->regstk.top)) {
/* FIXME: should really be level 0 but it occurs too often. KAO */ /* FIXME: should really be level 0 but it occurs too often. KAO */
UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n", UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n",
__FUNCTION__, info->ip); __FUNCTION__, info->ip);
STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
return -1; return -1;
} }
/* restore the ip */
ip = info->ip = *info->rp_loc; ip = info->ip = *info->rp_loc;
if (ip < GATE_ADDR) { if (ip < GATE_ADDR) {
UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __FUNCTION__, ip); UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __FUNCTION__, ip);
...@@ -1885,12 +1887,14 @@ unw_unwind (struct unw_frame_info *info) ...@@ -1885,12 +1887,14 @@ unw_unwind (struct unw_frame_info *info)
return -1; return -1;
} }
/* restore the cfm: */ /* validate the previous stack frame pointer */
if (!info->pfs_loc) { pfs_loc = (unsigned long) info->pfs_loc;
if ((pfs_loc < info->regstk.limit) || (pfs_loc > info->regstk.top)) {
UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __FUNCTION__); UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __FUNCTION__);
STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
return -1; return -1;
} }
/* restore the cfm: */
info->cfm_loc = info->pfs_loc; info->cfm_loc = info->pfs_loc;
/* restore the bsp: */ /* restore the bsp: */
...@@ -1992,13 +1996,16 @@ init_frame_info (struct unw_frame_info *info, struct task_struct *t, ...@@ -1992,13 +1996,16 @@ init_frame_info (struct unw_frame_info *info, struct task_struct *t,
memset(info, 0, sizeof(*info)); memset(info, 0, sizeof(*info));
rbslimit = (unsigned long) t + IA64_RBS_OFFSET; rbslimit = (unsigned long) t + IA64_RBS_OFFSET;
stklimit = (unsigned long) t + IA64_STK_OFFSET;
rbstop = sw->ar_bspstore; rbstop = sw->ar_bspstore;
if (rbstop - (unsigned long) t >= IA64_STK_OFFSET) if (rbstop > stklimit || rbstop < rbslimit)
rbstop = rbslimit; rbstop = rbslimit;
stklimit = (unsigned long) t + IA64_STK_OFFSET;
if (stktop <= rbstop) if (stktop <= rbstop)
stktop = rbstop; stktop = rbstop;
if (stktop > stklimit)
stktop = stklimit;
info->regstk.limit = rbslimit; info->regstk.limit = rbslimit;
info->regstk.top = rbstop; info->regstk.top = rbstop;
......
...@@ -354,10 +354,13 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) ...@@ -354,10 +354,13 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
&windows); &windows);
controller->window = kmalloc_node(sizeof(*controller->window) * windows, if (windows) {
controller->window =
kmalloc_node(sizeof(*controller->window) * windows,
GFP_KERNEL, controller->node); GFP_KERNEL, controller->node);
if (!controller->window) if (!controller->window)
goto out2; goto out2;
}
name = kmalloc(16, GFP_KERNEL); name = kmalloc(16, GFP_KERNEL);
if (!name) if (!name)
......
...@@ -194,7 +194,7 @@ void __init early_sn_setup(void) ...@@ -194,7 +194,7 @@ void __init early_sn_setup(void)
} }
extern int platform_intr_list[]; extern int platform_intr_list[];
static int __initdata shub_1_1_found; static int __cpuinitdata shub_1_1_found;
/* /*
* sn_check_for_wars * sn_check_for_wars
......
...@@ -305,6 +305,19 @@ ...@@ -305,6 +305,19 @@
#define NR_syscalls 286 /* length of syscall table */ #define NR_syscalls 286 /* length of syscall table */
/*
* The following defines stop scripts/checksyscalls.sh from complaining about
* unimplemented system calls. Glibc provides for each of these by using
* more modern equivalent system calls.
*/
#define __IGNORE_fork /* clone() */
#define __IGNORE_time /* gettimeofday() */
#define __IGNORE_alarm /* setitimer(ITIMER_REAL, ... */
#define __IGNORE_pause /* rt_sigprocmask(), rt_sigsuspend() */
#define __IGNORE_utime /* utimes() */
#define __IGNORE_getpgrp /* getpgid() */
#define __IGNORE_vfork /* clone() */
#define __ARCH_WANT_SYS_RT_SIGACTION #define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_RT_SIGSUSPEND
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment