Merge branch 'akpm-incoming-2'
* akpm-incoming-2: (139 commits) epoll: make epoll_wait() use the hrtimer range feature select: rename estimate_accuracy() to select_estimate_accuracy() Remove duplicate includes from many files ramoops: use the platform data structure instead of module params kernel/resource.c: handle reinsertion of an already-inserted resource kfifo: fix kfifo_alloc() to return a signed int value w1: don't allow arbitrary users to remove w1 devices alpha: remove dma64_addr_t usage mips: remove dma64_addr_t usage sparc: remove dma64_addr_t usage fuse: use release_pages() taskstats: use real microsecond granularity for CPU times taskstats: split fill_pid function taskstats: separate taskstats commands delayacct: align to 8 byte boundary on 64-bit systems delay-accounting: reimplement -c for getdelays.c to report information on a target command namespaces Kconfig: move namespace menu location after the cgroup namespaces Kconfig: remove the cgroup device whitelist experimental tag namespaces Kconfig: remove pointless cgroup dependency namespaces Kconfig: make namespace a submenu ...
This commit is contained in:
@@ -223,7 +223,7 @@ iommu_arena_free(struct pci_iommu_arena *arena, long ofs, long n)
|
||||
*/
|
||||
static int pci_dac_dma_supported(struct pci_dev *dev, u64 mask)
|
||||
{
|
||||
dma64_addr_t dac_offset = alpha_mv.pci_dac_offset;
|
||||
dma_addr_t dac_offset = alpha_mv.pci_dac_offset;
|
||||
int ok = 1;
|
||||
|
||||
/* If this is not set, the machine doesn't support DAC at all. */
|
||||
@@ -756,7 +756,7 @@ static void alpha_pci_unmap_sg(struct device *dev, struct scatterlist *sg,
|
||||
spin_lock_irqsave(&arena->lock, flags);
|
||||
|
||||
for (end = sg + nents; sg < end; ++sg) {
|
||||
dma64_addr_t addr;
|
||||
dma_addr_t addr;
|
||||
size_t size;
|
||||
long npages, ofs;
|
||||
dma_addr_t tend;
|
||||
|
||||
@@ -269,7 +269,8 @@ void ptrace_disable(struct task_struct *child)
|
||||
user_disable_single_step(child);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long tmp;
|
||||
size_t copied;
|
||||
@@ -292,7 +293,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
case PTRACE_PEEKUSR:
|
||||
force_successful_syscall_return();
|
||||
ret = get_reg(child, addr);
|
||||
DBG(DBG_MEM, ("peek $%ld->%#lx\n", addr, ret));
|
||||
DBG(DBG_MEM, ("peek $%lu->%#lx\n", addr, ret));
|
||||
break;
|
||||
|
||||
/* When I and D space are separate, this will have to be fixed. */
|
||||
@@ -302,7 +303,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_POKEUSR: /* write the specified register */
|
||||
DBG(DBG_MEM, ("poke $%ld<-%#lx\n", addr, data));
|
||||
DBG(DBG_MEM, ("poke $%lu<-%#lx\n", addr, data));
|
||||
ret = put_reg(child, addr, data);
|
||||
break;
|
||||
default:
|
||||
|
||||
+15
-13
@@ -1075,13 +1075,15 @@ out:
|
||||
}
|
||||
#endif
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_PEEKUSR:
|
||||
ret = ptrace_read_user(child, addr, (unsigned long __user *)data);
|
||||
ret = ptrace_read_user(child, addr, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_POKEUSR:
|
||||
@@ -1089,34 +1091,34 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_GETREGS:
|
||||
ret = ptrace_getregs(child, (void __user *)data);
|
||||
ret = ptrace_getregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = ptrace_setregs(child, (void __user *)data);
|
||||
ret = ptrace_setregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_GETFPREGS:
|
||||
ret = ptrace_getfpregs(child, (void __user *)data);
|
||||
ret = ptrace_getfpregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETFPREGS:
|
||||
ret = ptrace_setfpregs(child, (void __user *)data);
|
||||
ret = ptrace_setfpregs(child, datap);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_IWMMXT
|
||||
case PTRACE_GETWMMXREGS:
|
||||
ret = ptrace_getwmmxregs(child, (void __user *)data);
|
||||
ret = ptrace_getwmmxregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETWMMXREGS:
|
||||
ret = ptrace_setwmmxregs(child, (void __user *)data);
|
||||
ret = ptrace_setwmmxregs(child, datap);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *) data);
|
||||
datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SET_SYSCALL:
|
||||
@@ -1126,21 +1128,21 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
#ifdef CONFIG_CRUNCH
|
||||
case PTRACE_GETCRUNCHREGS:
|
||||
ret = ptrace_getcrunchregs(child, (void __user *)data);
|
||||
ret = ptrace_getcrunchregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETCRUNCHREGS:
|
||||
ret = ptrace_setcrunchregs(child, (void __user *)data);
|
||||
ret = ptrace_setcrunchregs(child, datap);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_VFP
|
||||
case PTRACE_GETVFPREGS:
|
||||
ret = ptrace_getvfpregs(child, (void __user *)data);
|
||||
ret = ptrace_getvfpregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETVFPREGS:
|
||||
ret = ptrace_setvfpregs(child, (void __user *)data);
|
||||
ret = ptrace_setvfpregs(child, datap);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/cnt32_to_63.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/localtimer.h>
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
int idx, type;
|
||||
|
||||
if (kvaddr >= (void *)FIXADDR_START) {
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
idx = type + KM_TYPE_NR * smp_processor_id();
|
||||
|
||||
if (cache_is_vivt())
|
||||
@@ -101,6 +101,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
#else
|
||||
(void) idx; /* to kill a warning */
|
||||
#endif
|
||||
kmap_atomic_idx_pop();
|
||||
} else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) {
|
||||
/* this address was obtained through kmap_high_get() */
|
||||
kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)]));
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
/* dev types for memcpy */
|
||||
#define STEDMA40_DEV_DST_MEMORY (-1)
|
||||
|
||||
@@ -146,9 +146,11 @@ static int ptrace_setregs(struct task_struct *tsk, const void __user *uregs)
|
||||
return ret;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
void __user *datap = (void __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* Read the word at location addr in the child process */
|
||||
@@ -158,8 +160,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_PEEKUSR:
|
||||
ret = ptrace_read_user(child, addr,
|
||||
(unsigned long __user *)data);
|
||||
ret = ptrace_read_user(child, addr, datap);
|
||||
break;
|
||||
|
||||
/* Write the word in data at location addr */
|
||||
@@ -173,11 +174,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_GETREGS:
|
||||
ret = ptrace_getregs(child, (void __user *)data);
|
||||
ret = ptrace_getregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = ptrace_setregs(child, (const void __user *)data);
|
||||
ret = ptrace_setregs(child, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -38,12 +38,13 @@
|
||||
* Get contents of register REGNO in task TASK.
|
||||
*/
|
||||
static inline long
|
||||
get_reg(struct task_struct *task, long regno, unsigned long __user *datap)
|
||||
get_reg(struct task_struct *task, unsigned long regno,
|
||||
unsigned long __user *datap)
|
||||
{
|
||||
long tmp;
|
||||
struct pt_regs *regs = task_pt_regs(task);
|
||||
|
||||
if (regno & 3 || regno > PT_LAST_PSEUDO || regno < 0)
|
||||
if (regno & 3 || regno > PT_LAST_PSEUDO)
|
||||
return -EIO;
|
||||
|
||||
switch (regno) {
|
||||
@@ -74,11 +75,11 @@ get_reg(struct task_struct *task, long regno, unsigned long __user *datap)
|
||||
* Write contents of register REGNO in task TASK.
|
||||
*/
|
||||
static inline int
|
||||
put_reg(struct task_struct *task, long regno, unsigned long data)
|
||||
put_reg(struct task_struct *task, unsigned long regno, unsigned long data)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(task);
|
||||
|
||||
if (regno & 3 || regno > PT_LAST_PSEUDO || regno < 0)
|
||||
if (regno & 3 || regno > PT_LAST_PSEUDO)
|
||||
return -EIO;
|
||||
|
||||
switch (regno) {
|
||||
@@ -240,7 +241,8 @@ void user_disable_single_step(struct task_struct *child)
|
||||
clear_tsk_thread_flag(child, TIF_SINGLESTEP);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *)data;
|
||||
@@ -368,14 +370,14 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_bfin_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
pr_debug("ptrace: PTRACE_SETREGS\n");
|
||||
return copy_regset_from_user(child, &user_bfin_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
|
||||
case_default:
|
||||
default:
|
||||
|
||||
@@ -76,9 +76,11 @@ ptrace_disable(struct task_struct *child)
|
||||
* (in user space) where the result of the ptrace call is written (instead of
|
||||
* being returned).
|
||||
*/
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned int regno = addr >> 2;
|
||||
unsigned long __user *datap = (unsigned long __user *)data;
|
||||
|
||||
switch (request) {
|
||||
@@ -93,10 +95,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
unsigned long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
|
||||
if ((addr & 3) || regno > PT_MAX)
|
||||
break;
|
||||
|
||||
tmp = get_reg(child, addr >> 2);
|
||||
tmp = get_reg(child, regno);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
}
|
||||
@@ -110,19 +112,17 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
/* Write the word at location address in the USER area. */
|
||||
case PTRACE_POKEUSR:
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
|
||||
if ((addr & 3) || regno > PT_MAX)
|
||||
break;
|
||||
|
||||
addr >>= 2;
|
||||
|
||||
if (addr == PT_DCCR) {
|
||||
if (regno == PT_DCCR) {
|
||||
/* don't allow the tracing process to change stuff like
|
||||
* interrupt enable, kernel/user bit, dma enables etc.
|
||||
*/
|
||||
data &= DCCR_MASK;
|
||||
data |= get_reg(child, PT_DCCR) & ~DCCR_MASK;
|
||||
}
|
||||
if (put_reg(child, addr, data))
|
||||
if (put_reg(child, regno, data))
|
||||
break;
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -141,7 +141,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
}
|
||||
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -165,7 +165,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
put_reg(child, i, tmp);
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -126,9 +126,11 @@ ptrace_disable(struct task_struct *child)
|
||||
}
|
||||
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned int regno = addr >> 2;
|
||||
unsigned long __user *datap = (unsigned long __user *)data;
|
||||
|
||||
switch (request) {
|
||||
@@ -163,10 +165,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
unsigned long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
|
||||
if ((addr & 3) || regno > PT_MAX)
|
||||
break;
|
||||
|
||||
tmp = get_reg(child, addr >> 2);
|
||||
tmp = get_reg(child, regno);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
}
|
||||
@@ -180,19 +182,17 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
/* Write the word at location address in the USER area. */
|
||||
case PTRACE_POKEUSR:
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
|
||||
if ((addr & 3) || regno > PT_MAX)
|
||||
break;
|
||||
|
||||
addr >>= 2;
|
||||
|
||||
if (addr == PT_CCS) {
|
||||
if (regno == PT_CCS) {
|
||||
/* don't allow the tracing process to change stuff like
|
||||
* interrupt enable, kernel/user bit, dma enables etc.
|
||||
*/
|
||||
data &= CCS_MASK;
|
||||
data |= get_reg(child, PT_CCS) & ~CCS_MASK;
|
||||
}
|
||||
if (put_reg(child, addr, data))
|
||||
if (put_reg(child, regno, data))
|
||||
break;
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
+15
-17
@@ -254,23 +254,26 @@ void ptrace_disable(struct task_struct *child)
|
||||
user_disable_single_step(child);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long tmp;
|
||||
int ret;
|
||||
int regno = addr >> 2;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
case PTRACE_PEEKUSR: {
|
||||
tmp = 0;
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0)
|
||||
if (addr & 3)
|
||||
break;
|
||||
|
||||
ret = 0;
|
||||
switch (addr >> 2) {
|
||||
switch (regno) {
|
||||
case 0 ... PT__END - 1:
|
||||
tmp = get_reg(child, addr >> 2);
|
||||
tmp = get_reg(child, regno);
|
||||
break;
|
||||
|
||||
case PT__END + 0:
|
||||
@@ -299,23 +302,18 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
ret = put_user(tmp, (unsigned long *) data);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
}
|
||||
|
||||
case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0)
|
||||
if (addr & 3)
|
||||
break;
|
||||
|
||||
ret = 0;
|
||||
switch (addr >> 2) {
|
||||
switch (regno) {
|
||||
case 0 ... PT__END - 1:
|
||||
ret = put_reg(child, addr >> 2, data);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EIO;
|
||||
ret = put_reg(child, regno, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -324,25 +322,25 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_frv_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(child->thread.user->i),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_SETREGS: /* Set all integer regs in the child. */
|
||||
return copy_regset_from_user(child, &user_frv_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(child->thread.user->i),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_GETFPREGS: /* Get the child FP/Media state. */
|
||||
return copy_regset_to_user(child, &user_frv_native_view,
|
||||
REGSET_FPMEDIA,
|
||||
0, sizeof(child->thread.user->f),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_SETFPREGS: /* Set the child FP/Media state. */
|
||||
return copy_regset_from_user(child, &user_frv_native_view,
|
||||
REGSET_FPMEDIA,
|
||||
0, sizeof(child->thread.user->f),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
|
||||
@@ -68,7 +68,7 @@ EXPORT_SYMBOL(__kmap_atomic);
|
||||
|
||||
void __kunmap_atomic(void *kvaddr)
|
||||
{
|
||||
int type = kmap_atomic_idx_pop();
|
||||
int type = kmap_atomic_idx();
|
||||
switch (type) {
|
||||
case 0: __kunmap_atomic_primary(4, 6); break;
|
||||
case 1: __kunmap_atomic_primary(5, 7); break;
|
||||
@@ -83,6 +83,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
kmap_atomic_idx_pop();
|
||||
pagefault_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__kunmap_atomic);
|
||||
|
||||
+17
-16
@@ -50,27 +50,29 @@ void ptrace_disable(struct task_struct *child)
|
||||
user_disable_single_step(child);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
int regno = addr >> 2;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
case PTRACE_PEEKUSR: {
|
||||
unsigned long tmp = 0;
|
||||
|
||||
if ((addr & 3) || addr < 0 || addr >= sizeof(struct user)) {
|
||||
if ((addr & 3) || addr >= sizeof(struct user)) {
|
||||
ret = -EIO;
|
||||
break ;
|
||||
}
|
||||
|
||||
ret = 0; /* Default return condition */
|
||||
addr = addr >> 2; /* temporary hack. */
|
||||
|
||||
if (addr < H8300_REGS_NO)
|
||||
tmp = h8300_get_reg(child, addr);
|
||||
if (regno < H8300_REGS_NO)
|
||||
tmp = h8300_get_reg(child, regno);
|
||||
else {
|
||||
switch(addr) {
|
||||
switch (regno) {
|
||||
case 49:
|
||||
tmp = child->mm->start_code;
|
||||
break ;
|
||||
@@ -88,24 +90,23 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
}
|
||||
if (!ret)
|
||||
ret = put_user(tmp,(unsigned long *) data);
|
||||
ret = put_user(tmp, datap);
|
||||
break ;
|
||||
}
|
||||
|
||||
/* when I and D space are separate, this will have to be fixed. */
|
||||
case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
|
||||
if ((addr & 3) || addr < 0 || addr >= sizeof(struct user)) {
|
||||
if ((addr & 3) || addr >= sizeof(struct user)) {
|
||||
ret = -EIO;
|
||||
break ;
|
||||
}
|
||||
addr = addr >> 2; /* temporary hack. */
|
||||
|
||||
if (addr == PT_ORIG_ER0) {
|
||||
if (regno == PT_ORIG_ER0) {
|
||||
ret = -EIO;
|
||||
break ;
|
||||
}
|
||||
if (addr < H8300_REGS_NO) {
|
||||
ret = h8300_put_reg(child, addr, data);
|
||||
if (regno < H8300_REGS_NO) {
|
||||
ret = h8300_put_reg(child, regno, data);
|
||||
break ;
|
||||
}
|
||||
ret = -EIO;
|
||||
@@ -116,11 +117,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
unsigned long tmp;
|
||||
for (i = 0; i < H8300_REGS_NO; i++) {
|
||||
tmp = h8300_get_reg(child, i);
|
||||
if (put_user(tmp, (unsigned long *) data)) {
|
||||
if (put_user(tmp, datap)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -130,12 +131,12 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
int i;
|
||||
unsigned long tmp;
|
||||
for (i = 0; i < H8300_REGS_NO; i++) {
|
||||
if (get_user(tmp, (unsigned long *) data)) {
|
||||
if (get_user(tmp, datap)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
h8300_put_reg(child, i, tmp);
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
@@ -56,10 +56,10 @@ typedef u64 cputime64_t;
|
||||
#define jiffies64_to_cputime64(__jif) ((__jif) * (NSEC_PER_SEC / HZ))
|
||||
|
||||
/*
|
||||
* Convert cputime <-> milliseconds
|
||||
* Convert cputime <-> microseconds
|
||||
*/
|
||||
#define cputime_to_msecs(__ct) ((__ct) / NSEC_PER_MSEC)
|
||||
#define msecs_to_cputime(__msecs) ((__msecs) * NSEC_PER_MSEC)
|
||||
#define cputime_to_usecs(__ct) ((__ct) / NSEC_PER_USEC)
|
||||
#define usecs_to_cputime(__usecs) ((__usecs) * NSEC_PER_USEC)
|
||||
|
||||
/*
|
||||
* Convert cputime <-> seconds
|
||||
|
||||
@@ -1177,7 +1177,8 @@ ptrace_disable (struct task_struct *child)
|
||||
}
|
||||
|
||||
long
|
||||
arch_ptrace (struct task_struct *child, long request, long addr, long data)
|
||||
arch_ptrace (struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
switch (request) {
|
||||
case PTRACE_PEEKTEXT:
|
||||
|
||||
@@ -622,9 +622,11 @@ void ptrace_disable(struct task_struct *child)
|
||||
}
|
||||
|
||||
long
|
||||
arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/*
|
||||
@@ -639,8 +641,7 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
* read the word at location addr in the USER area.
|
||||
*/
|
||||
case PTRACE_PEEKUSR:
|
||||
ret = ptrace_read_user(child, addr,
|
||||
(unsigned long __user *)data);
|
||||
ret = ptrace_read_user(child, addr, datap);
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -661,11 +662,11 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_GETREGS:
|
||||
ret = ptrace_getregs(child, (void __user *)data);
|
||||
ret = ptrace_getregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = ptrace_setregs(child, (void __user *)data);
|
||||
ret = ptrace_setregs(child, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
+26
-25
@@ -156,55 +156,57 @@ void user_disable_single_step(struct task_struct *child)
|
||||
singlestep_disable(child);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long tmp;
|
||||
int i, ret = 0;
|
||||
int regno = addr >> 2; /* temporary hack. */
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
case PTRACE_PEEKUSR:
|
||||
if (addr & 3)
|
||||
goto out_eio;
|
||||
addr >>= 2; /* temporary hack. */
|
||||
|
||||
if (addr >= 0 && addr < 19) {
|
||||
tmp = get_reg(child, addr);
|
||||
} else if (addr >= 21 && addr < 49) {
|
||||
tmp = child->thread.fp[addr - 21];
|
||||
if (regno >= 0 && regno < 19) {
|
||||
tmp = get_reg(child, regno);
|
||||
} else if (regno >= 21 && regno < 49) {
|
||||
tmp = child->thread.fp[regno - 21];
|
||||
/* Convert internal fpu reg representation
|
||||
* into long double format
|
||||
*/
|
||||
if (FPU_IS_EMU && (addr < 45) && !(addr % 3))
|
||||
if (FPU_IS_EMU && (regno < 45) && !(regno % 3))
|
||||
tmp = ((tmp & 0xffff0000) << 15) |
|
||||
((tmp & 0x0000ffff) << 16);
|
||||
} else
|
||||
goto out_eio;
|
||||
ret = put_user(tmp, (unsigned long *)data);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
|
||||
case PTRACE_POKEUSR:
|
||||
/* write the word at location addr in the USER area */
|
||||
if (addr & 3)
|
||||
goto out_eio;
|
||||
addr >>= 2; /* temporary hack. */
|
||||
|
||||
if (addr == PT_SR) {
|
||||
if (regno == PT_SR) {
|
||||
data &= SR_MASK;
|
||||
data |= get_reg(child, PT_SR) & ~SR_MASK;
|
||||
}
|
||||
if (addr >= 0 && addr < 19) {
|
||||
if (put_reg(child, addr, data))
|
||||
if (regno >= 0 && regno < 19) {
|
||||
if (put_reg(child, regno, data))
|
||||
goto out_eio;
|
||||
} else if (addr >= 21 && addr < 48) {
|
||||
} else if (regno >= 21 && regno < 48) {
|
||||
/* Convert long double format
|
||||
* into internal fpu reg representation
|
||||
*/
|
||||
if (FPU_IS_EMU && (addr < 45) && !(addr % 3)) {
|
||||
data = (unsigned long)data << 15;
|
||||
if (FPU_IS_EMU && (regno < 45) && !(regno % 3)) {
|
||||
data <<= 15;
|
||||
data = (data & 0xffff0000) |
|
||||
((data & 0x0000ffff) >> 1);
|
||||
}
|
||||
child->thread.fp[addr - 21] = data;
|
||||
child->thread.fp[regno - 21] = data;
|
||||
} else
|
||||
goto out_eio;
|
||||
break;
|
||||
@@ -212,16 +214,16 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
case PTRACE_GETREGS: /* Get all gp regs from the child. */
|
||||
for (i = 0; i < 19; i++) {
|
||||
tmp = get_reg(child, i);
|
||||
ret = put_user(tmp, (unsigned long *)data);
|
||||
ret = put_user(tmp, datap);
|
||||
if (ret)
|
||||
break;
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS: /* Set all gp regs in the child. */
|
||||
for (i = 0; i < 19; i++) {
|
||||
ret = get_user(tmp, (unsigned long *)data);
|
||||
ret = get_user(tmp, datap);
|
||||
if (ret)
|
||||
break;
|
||||
if (i == PT_SR) {
|
||||
@@ -229,25 +231,24 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
tmp |= get_reg(child, PT_SR) & ~SR_MASK;
|
||||
}
|
||||
put_reg(child, i, tmp);
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
break;
|
||||
|
||||
case PTRACE_GETFPREGS: /* Get the child FPU state. */
|
||||
if (copy_to_user((void *)data, &child->thread.fp,
|
||||
if (copy_to_user(datap, &child->thread.fp,
|
||||
sizeof(struct user_m68kfp_struct)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
|
||||
case PTRACE_SETFPREGS: /* Set the child FPU state. */
|
||||
if (copy_from_user(&child->thread.fp, (void *)data,
|
||||
if (copy_from_user(&child->thread.fp, datap,
|
||||
sizeof(struct user_m68kfp_struct)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *)data);
|
||||
ret = put_user(task_thread_info(child)->tp_value, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -112,9 +112,12 @@ void ptrace_disable(struct task_struct *child)
|
||||
user_disable_single_step(child);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
int regno = addr >> 2;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
@@ -122,53 +125,48 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
unsigned long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 ||
|
||||
addr > sizeof(struct user) - 3)
|
||||
if ((addr & 3) || addr > sizeof(struct user) - 3)
|
||||
break;
|
||||
|
||||
tmp = 0; /* Default return condition */
|
||||
addr = addr >> 2; /* temporary hack. */
|
||||
ret = -EIO;
|
||||
if (addr < 19) {
|
||||
tmp = get_reg(child, addr);
|
||||
if (addr == PT_SR)
|
||||
if (regno < 19) {
|
||||
tmp = get_reg(child, regno);
|
||||
if (regno == PT_SR)
|
||||
tmp >>= 16;
|
||||
} else if (addr >= 21 && addr < 49) {
|
||||
tmp = child->thread.fp[addr - 21];
|
||||
} else if (addr == 49) {
|
||||
} else if (regno >= 21 && regno < 49) {
|
||||
tmp = child->thread.fp[regno - 21];
|
||||
} else if (regno == 49) {
|
||||
tmp = child->mm->start_code;
|
||||
} else if (addr == 50) {
|
||||
} else if (regno == 50) {
|
||||
tmp = child->mm->start_data;
|
||||
} else if (addr == 51) {
|
||||
} else if (regno == 51) {
|
||||
tmp = child->mm->end_code;
|
||||
} else
|
||||
break;
|
||||
ret = put_user(tmp,(unsigned long *) data);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
}
|
||||
|
||||
case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 ||
|
||||
addr > sizeof(struct user) - 3)
|
||||
if ((addr & 3) || addr > sizeof(struct user) - 3)
|
||||
break;
|
||||
|
||||
addr = addr >> 2; /* temporary hack. */
|
||||
|
||||
if (addr == PT_SR) {
|
||||
if (regno == PT_SR) {
|
||||
data &= SR_MASK;
|
||||
data <<= 16;
|
||||
data |= get_reg(child, PT_SR) & ~(SR_MASK << 16);
|
||||
}
|
||||
if (addr < 19) {
|
||||
if (put_reg(child, addr, data))
|
||||
if (regno < 19) {
|
||||
if (put_reg(child, regno, data))
|
||||
break;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
if (addr >= 21 && addr < 48)
|
||||
if (regno >= 21 && regno < 48)
|
||||
{
|
||||
child->thread.fp[addr - 21] = data;
|
||||
child->thread.fp[regno - 21] = data;
|
||||
ret = 0;
|
||||
}
|
||||
break;
|
||||
@@ -180,11 +178,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
tmp = get_reg(child, i);
|
||||
if (i == PT_SR)
|
||||
tmp >>= 16;
|
||||
if (put_user(tmp, (unsigned long *) data)) {
|
||||
if (put_user(tmp, datap)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -194,7 +192,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
int i;
|
||||
unsigned long tmp;
|
||||
for (i = 0; i < 19; i++) {
|
||||
if (get_user(tmp, (unsigned long *) data)) {
|
||||
if (get_user(tmp, datap)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -204,7 +202,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
tmp |= get_reg(child, PT_SR) & ~(SR_MASK << 16);
|
||||
}
|
||||
put_reg(child, i, tmp);
|
||||
data += sizeof(long);
|
||||
datap++;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
@@ -213,7 +211,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
#ifdef PTRACE_GETFPREGS
|
||||
case PTRACE_GETFPREGS: { /* Get the child FPU state. */
|
||||
ret = 0;
|
||||
if (copy_to_user((void *)data, &child->thread.fp,
|
||||
if (copy_to_user(datap, &child->thread.fp,
|
||||
sizeof(struct user_m68kfp_struct)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
@@ -223,7 +221,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
#ifdef PTRACE_SETFPREGS
|
||||
case PTRACE_SETFPREGS: { /* Set the child FPU state. */
|
||||
ret = 0;
|
||||
if (copy_from_user(&child->thread.fp, (void *)data,
|
||||
if (copy_from_user(&child->thread.fp, datap,
|
||||
sizeof(struct user_m68kfp_struct)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
@@ -231,8 +229,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
#endif
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *)data);
|
||||
ret = put_user(task_thread_info(child)->tp_value, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -73,7 +73,8 @@ static microblaze_reg_t *reg_save_addr(unsigned reg_offs,
|
||||
return (microblaze_reg_t *)((char *)regs + reg_offs);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int rval;
|
||||
unsigned long val = 0;
|
||||
@@ -99,7 +100,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
} else {
|
||||
rval = -EIO;
|
||||
}
|
||||
} else if (addr >= 0 && addr < PT_SIZE && (addr & 0x3) == 0) {
|
||||
} else if (addr < PT_SIZE && (addr & 0x3) == 0) {
|
||||
microblaze_reg_t *reg_addr = reg_save_addr(addr, child);
|
||||
if (request == PTRACE_PEEKUSR)
|
||||
val = *reg_addr;
|
||||
|
||||
@@ -839,7 +839,7 @@ struct bridge_controller {
|
||||
nasid_t nasid;
|
||||
unsigned int widget_id;
|
||||
unsigned int irq_cpu;
|
||||
dma64_addr_t baddr;
|
||||
u64 baddr;
|
||||
unsigned int pci_int[8];
|
||||
};
|
||||
|
||||
|
||||
+13
-12
@@ -255,9 +255,13 @@ int ptrace_set_watch_regs(struct task_struct *child,
|
||||
return 0;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
void __user *addrp = (void __user *) addr;
|
||||
void __user *datavp = (void __user *) data;
|
||||
unsigned long __user *datalp = (void __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* when I and D space are separate, these will need to be fixed. */
|
||||
@@ -386,7 +390,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
ret = put_user(tmp, (unsigned long __user *) data);
|
||||
ret = put_user(tmp, datalp);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -478,34 +482,31 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
case PTRACE_GETREGS:
|
||||
ret = ptrace_getregs(child, (__s64 __user *) data);
|
||||
ret = ptrace_getregs(child, datavp);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = ptrace_setregs(child, (__s64 __user *) data);
|
||||
ret = ptrace_setregs(child, datavp);
|
||||
break;
|
||||
|
||||
case PTRACE_GETFPREGS:
|
||||
ret = ptrace_getfpregs(child, (__u32 __user *) data);
|
||||
ret = ptrace_getfpregs(child, datavp);
|
||||
break;
|
||||
|
||||
case PTRACE_SETFPREGS:
|
||||
ret = ptrace_setfpregs(child, (__u32 __user *) data);
|
||||
ret = ptrace_setfpregs(child, datavp);
|
||||
break;
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *) data);
|
||||
ret = put_user(task_thread_info(child)->tp_value, datalp);
|
||||
break;
|
||||
|
||||
case PTRACE_GET_WATCH_REGS:
|
||||
ret = ptrace_get_watch_regs(child,
|
||||
(struct pt_watch_regs __user *) addr);
|
||||
ret = ptrace_get_watch_regs(child, addrp);
|
||||
break;
|
||||
|
||||
case PTRACE_SET_WATCH_REGS:
|
||||
ret = ptrace_set_watch_regs(child,
|
||||
(struct pt_watch_regs __user *) addr);
|
||||
ret = ptrace_set_watch_regs(child, addrp);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -74,7 +74,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
return;
|
||||
}
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
{
|
||||
int idx = type + KM_TYPE_NR * smp_processor_id();
|
||||
@@ -89,6 +89,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
local_flush_tlb_one(vaddr);
|
||||
}
|
||||
#endif
|
||||
kmap_atomic_idx_pop();
|
||||
pagefault_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__kunmap_atomic);
|
||||
|
||||
@@ -101,7 +101,7 @@ static inline void __kunmap_atomic(unsigned long vaddr)
|
||||
return;
|
||||
}
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
|
||||
#if HIGHMEM_DEBUG
|
||||
{
|
||||
@@ -119,6 +119,8 @@ static inline void __kunmap_atomic(unsigned long vaddr)
|
||||
__flush_tlb_one(vaddr);
|
||||
}
|
||||
#endif
|
||||
|
||||
kmap_atomic_idx_pop();
|
||||
pagefault_enable();
|
||||
}
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -295,31 +295,31 @@ void ptrace_disable(struct task_struct *child)
|
||||
/*
|
||||
* handle the arch-specific side of process tracing
|
||||
*/
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long tmp;
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
case PTRACE_PEEKUSR:
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 ||
|
||||
addr > sizeof(struct user) - 3)
|
||||
if ((addr & 3) || addr > sizeof(struct user) - 3)
|
||||
break;
|
||||
|
||||
tmp = 0; /* Default return condition */
|
||||
if (addr < NR_PTREGS << 2)
|
||||
tmp = get_stack_long(child,
|
||||
ptrace_regid_to_frame[addr]);
|
||||
ret = put_user(tmp, (unsigned long *) data);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
|
||||
/* write the word at location addr in the USER area */
|
||||
case PTRACE_POKEUSR:
|
||||
ret = -EIO;
|
||||
if ((addr & 3) || addr < 0 ||
|
||||
addr > sizeof(struct user) - 3)
|
||||
if ((addr & 3) || addr > sizeof(struct user) - 3)
|
||||
break;
|
||||
|
||||
ret = 0;
|
||||
@@ -332,25 +332,25 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_mn10300_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, NR_PTREGS * sizeof(long),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_SETREGS: /* Set all integer regs in the child. */
|
||||
return copy_regset_from_user(child, &user_mn10300_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, NR_PTREGS * sizeof(long),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_GETFPREGS: /* Get the child FPU state. */
|
||||
return copy_regset_to_user(child, &user_mn10300_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct fpu_state_struct),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
|
||||
case PTRACE_SETFPREGS: /* Set the child FPU state. */
|
||||
return copy_regset_from_user(child, &user_mn10300_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct fpu_state_struct),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
|
||||
@@ -110,7 +110,8 @@ void user_enable_block_step(struct task_struct *task)
|
||||
pa_psw(task)->l = 0;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long tmp;
|
||||
long ret = -EIO;
|
||||
@@ -120,11 +121,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
/* Read the word at location addr in the USER area. For ptraced
|
||||
processes, the kernel saves all regs on a syscall. */
|
||||
case PTRACE_PEEKUSR:
|
||||
if ((addr & (sizeof(long)-1)) ||
|
||||
(unsigned long) addr >= sizeof(struct pt_regs))
|
||||
if ((addr & (sizeof(unsigned long)-1)) ||
|
||||
addr >= sizeof(struct pt_regs))
|
||||
break;
|
||||
tmp = *(unsigned long *) ((char *) task_regs(child) + addr);
|
||||
ret = put_user(tmp, (unsigned long *) data);
|
||||
ret = put_user(tmp, (unsigned long __user *) data);
|
||||
break;
|
||||
|
||||
/* Write the word at location addr in the USER area. This will need
|
||||
@@ -151,8 +152,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
}
|
||||
|
||||
if ((addr & (sizeof(long)-1)) ||
|
||||
(unsigned long) addr >= sizeof(struct pt_regs))
|
||||
if ((addr & (sizeof(unsigned long)-1)) ||
|
||||
addr >= sizeof(struct pt_regs))
|
||||
break;
|
||||
if ((addr >= PT_GR1 && addr <= PT_GR31) ||
|
||||
addr == PT_IAOQ0 || addr == PT_IAOQ1 ||
|
||||
|
||||
@@ -124,23 +124,23 @@ static inline u64 cputime64_to_jiffies64(const cputime_t ct)
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert cputime <-> milliseconds
|
||||
* Convert cputime <-> microseconds
|
||||
*/
|
||||
extern u64 __cputime_msec_factor;
|
||||
|
||||
static inline unsigned long cputime_to_msecs(const cputime_t ct)
|
||||
static inline unsigned long cputime_to_usecs(const cputime_t ct)
|
||||
{
|
||||
return mulhdu(ct, __cputime_msec_factor);
|
||||
return mulhdu(ct, __cputime_msec_factor) * USEC_PER_MSEC;
|
||||
}
|
||||
|
||||
static inline cputime_t msecs_to_cputime(const unsigned long ms)
|
||||
static inline cputime_t usecs_to_cputime(const unsigned long us)
|
||||
{
|
||||
cputime_t ct;
|
||||
unsigned long sec;
|
||||
|
||||
/* have to be a little careful about overflow */
|
||||
ct = ms % 1000;
|
||||
sec = ms / 1000;
|
||||
ct = us % 1000000;
|
||||
sec = us / 1000000;
|
||||
if (ct) {
|
||||
ct *= tb_ticks_per_sec;
|
||||
do_div(ct, 1000);
|
||||
|
||||
@@ -1406,37 +1406,42 @@ static long ppc_del_hwdebug(struct task_struct *child, long addr, long data)
|
||||
* Here are the old "legacy" powerpc specific getregs/setregs ptrace calls,
|
||||
* we mark them as obsolete now, they will be removed in a future version
|
||||
*/
|
||||
static long arch_ptrace_old(struct task_struct *child, long request, long addr,
|
||||
long data)
|
||||
static long arch_ptrace_old(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
void __user *datavp = (void __user *) data;
|
||||
|
||||
switch (request) {
|
||||
case PPC_PTRACE_GETREGS: /* Get GPRs 0 - 31. */
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_GPR, 0, 32 * sizeof(long),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PPC_PTRACE_SETREGS: /* Set GPRs 0 - 31. */
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_GPR, 0, 32 * sizeof(long),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PPC_PTRACE_GETFPREGS: /* Get FPRs 0 - 31. */
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_FPR, 0, 32 * sizeof(double),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PPC_PTRACE_SETFPREGS: /* Set FPRs 0 - 31. */
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_FPR, 0, 32 * sizeof(double),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
}
|
||||
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret = -EPERM;
|
||||
void __user *datavp = (void __user *) data;
|
||||
unsigned long __user *datalp = datavp;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
@@ -1446,11 +1451,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
ret = -EIO;
|
||||
/* convert to index and check */
|
||||
#ifdef CONFIG_PPC32
|
||||
index = (unsigned long) addr >> 2;
|
||||
index = addr >> 2;
|
||||
if ((addr & 3) || (index > PT_FPSCR)
|
||||
|| (child->thread.regs == NULL))
|
||||
#else
|
||||
index = (unsigned long) addr >> 3;
|
||||
index = addr >> 3;
|
||||
if ((addr & 7) || (index > PT_FPSCR))
|
||||
#endif
|
||||
break;
|
||||
@@ -1463,7 +1468,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
tmp = ((unsigned long *)child->thread.fpr)
|
||||
[TS_FPRWIDTH * (index - PT_FPR0)];
|
||||
}
|
||||
ret = put_user(tmp,(unsigned long __user *) data);
|
||||
ret = put_user(tmp, datalp);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1474,11 +1479,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
ret = -EIO;
|
||||
/* convert to index and check */
|
||||
#ifdef CONFIG_PPC32
|
||||
index = (unsigned long) addr >> 2;
|
||||
index = addr >> 2;
|
||||
if ((addr & 3) || (index > PT_FPSCR)
|
||||
|| (child->thread.regs == NULL))
|
||||
#else
|
||||
index = (unsigned long) addr >> 3;
|
||||
index = addr >> 3;
|
||||
if ((addr & 7) || (index > PT_FPSCR))
|
||||
#endif
|
||||
break;
|
||||
@@ -1525,11 +1530,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
dbginfo.features = 0;
|
||||
#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, data,
|
||||
if (!access_ok(VERIFY_WRITE, datavp,
|
||||
sizeof(struct ppc_debug_info)))
|
||||
return -EFAULT;
|
||||
ret = __copy_to_user((struct ppc_debug_info __user *)data,
|
||||
&dbginfo, sizeof(struct ppc_debug_info)) ?
|
||||
ret = __copy_to_user(datavp, &dbginfo,
|
||||
sizeof(struct ppc_debug_info)) ?
|
||||
-EFAULT : 0;
|
||||
break;
|
||||
}
|
||||
@@ -1537,11 +1542,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
case PPC_PTRACE_SETHWDEBUG: {
|
||||
struct ppc_hw_breakpoint bp_info;
|
||||
|
||||
if (!access_ok(VERIFY_READ, data,
|
||||
if (!access_ok(VERIFY_READ, datavp,
|
||||
sizeof(struct ppc_hw_breakpoint)))
|
||||
return -EFAULT;
|
||||
ret = __copy_from_user(&bp_info,
|
||||
(struct ppc_hw_breakpoint __user *)data,
|
||||
ret = __copy_from_user(&bp_info, datavp,
|
||||
sizeof(struct ppc_hw_breakpoint)) ?
|
||||
-EFAULT : 0;
|
||||
if (!ret)
|
||||
@@ -1560,11 +1564,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
if (addr > 0)
|
||||
break;
|
||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
||||
ret = put_user(child->thread.dac1,
|
||||
(unsigned long __user *)data);
|
||||
ret = put_user(child->thread.dac1, datalp);
|
||||
#else
|
||||
ret = put_user(child->thread.dabr,
|
||||
(unsigned long __user *)data);
|
||||
ret = put_user(child->thread.dabr, datalp);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -1580,7 +1582,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_GPR,
|
||||
0, sizeof(struct pt_regs),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
case PTRACE_SETREGS64:
|
||||
@@ -1589,19 +1591,19 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_GPR,
|
||||
0, sizeof(struct pt_regs),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PTRACE_GETFPREGS: /* Get the child FPU state (FPR0...31 + FPSCR) */
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_FPR,
|
||||
0, sizeof(elf_fpregset_t),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PTRACE_SETFPREGS: /* Set the child FPU state (FPR0...31 + FPSCR) */
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_FPR,
|
||||
0, sizeof(elf_fpregset_t),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
case PTRACE_GETVRREGS:
|
||||
@@ -1609,40 +1611,40 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
REGSET_VMX,
|
||||
0, (33 * sizeof(vector128) +
|
||||
sizeof(u32)),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PTRACE_SETVRREGS:
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_VMX,
|
||||
0, (33 * sizeof(vector128) +
|
||||
sizeof(u32)),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
#endif
|
||||
#ifdef CONFIG_VSX
|
||||
case PTRACE_GETVSRREGS:
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_VSX,
|
||||
0, 32 * sizeof(double),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PTRACE_SETVSRREGS:
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_VSX,
|
||||
0, 32 * sizeof(double),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
#endif
|
||||
#ifdef CONFIG_SPE
|
||||
case PTRACE_GETEVRREGS:
|
||||
/* Get the child spe register state. */
|
||||
return copy_regset_to_user(child, &user_ppc_native_view,
|
||||
REGSET_SPE, 0, 35 * sizeof(u32),
|
||||
(void __user *) data);
|
||||
datavp);
|
||||
|
||||
case PTRACE_SETEVRREGS:
|
||||
/* Set the child spe register state. */
|
||||
return copy_regset_from_user(child, &user_ppc_native_view,
|
||||
REGSET_SPE, 0, 35 * sizeof(u32),
|
||||
(const void __user *) data);
|
||||
datavp);
|
||||
#endif
|
||||
|
||||
/* Old reverse args ptrace callss */
|
||||
|
||||
@@ -62,7 +62,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
return;
|
||||
}
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
{
|
||||
@@ -79,6 +79,8 @@ void __kunmap_atomic(void *kvaddr)
|
||||
local_flush_tlb_page(NULL, vaddr);
|
||||
}
|
||||
#endif
|
||||
|
||||
kmap_atomic_idx_pop();
|
||||
pagefault_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__kunmap_atomic);
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
#define RIO_ATMU_REGS_OFFSET 0x10c00
|
||||
#define RIO_P_MSG_REGS_OFFSET 0x11000
|
||||
#define RIO_S_MSG_REGS_OFFSET 0x13000
|
||||
#define RIO_GCCSR 0x13c
|
||||
#define RIO_ESCSR 0x158
|
||||
#define RIO_CCSR 0x15c
|
||||
#define RIO_LTLEDCSR 0x0608
|
||||
@@ -87,6 +88,9 @@
|
||||
#define RIO_IPWSR_PWD 0x00000008
|
||||
#define RIO_IPWSR_PWB 0x00000004
|
||||
|
||||
#define RIO_EPWISR_PINT 0x80000000
|
||||
#define RIO_EPWISR_PW 0x00000001
|
||||
|
||||
#define RIO_MSG_DESC_SIZE 32
|
||||
#define RIO_MSG_BUFFER_SIZE 4096
|
||||
#define RIO_MIN_TX_RING_SIZE 2
|
||||
@@ -1082,19 +1086,13 @@ fsl_rio_port_write_handler(int irq, void *dev_instance)
|
||||
struct rio_priv *priv = port->priv;
|
||||
u32 epwisr, tmp;
|
||||
|
||||
epwisr = in_be32(priv->regs_win + RIO_EPWISR);
|
||||
if (!(epwisr & RIO_EPWISR_PW))
|
||||
goto pw_done;
|
||||
|
||||
ipwmr = in_be32(&priv->msg_regs->pwmr);
|
||||
ipwsr = in_be32(&priv->msg_regs->pwsr);
|
||||
|
||||
epwisr = in_be32(priv->regs_win + RIO_EPWISR);
|
||||
if (epwisr & 0x80000000) {
|
||||
tmp = in_be32(priv->regs_win + RIO_LTLEDCSR);
|
||||
pr_info("RIO_LTLEDCSR = 0x%x\n", tmp);
|
||||
out_be32(priv->regs_win + RIO_LTLEDCSR, 0);
|
||||
}
|
||||
|
||||
if (!(epwisr & 0x00000001))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
#ifdef DEBUG_PW
|
||||
pr_debug("PW Int->IPWMR: 0x%08x IPWSR: 0x%08x (", ipwmr, ipwsr);
|
||||
if (ipwsr & RIO_IPWSR_QF)
|
||||
@@ -1109,20 +1107,6 @@ fsl_rio_port_write_handler(int irq, void *dev_instance)
|
||||
pr_debug(" PWB");
|
||||
pr_debug(" )\n");
|
||||
#endif
|
||||
out_be32(&priv->msg_regs->pwsr,
|
||||
ipwsr & (RIO_IPWSR_TE | RIO_IPWSR_QFI | RIO_IPWSR_PWD));
|
||||
|
||||
if ((ipwmr & RIO_IPWMR_EIE) && (ipwsr & RIO_IPWSR_TE)) {
|
||||
priv->port_write_msg.err_count++;
|
||||
pr_info("RIO: Port-Write Transaction Err (%d)\n",
|
||||
priv->port_write_msg.err_count);
|
||||
}
|
||||
if (ipwsr & RIO_IPWSR_PWD) {
|
||||
priv->port_write_msg.discard_count++;
|
||||
pr_info("RIO: Port Discarded Port-Write Msg(s) (%d)\n",
|
||||
priv->port_write_msg.discard_count);
|
||||
}
|
||||
|
||||
/* Schedule deferred processing if PW was received */
|
||||
if (ipwsr & RIO_IPWSR_QFI) {
|
||||
/* Save PW message (if there is room in FIFO),
|
||||
@@ -1134,16 +1118,43 @@ fsl_rio_port_write_handler(int irq, void *dev_instance)
|
||||
RIO_PW_MSG_SIZE);
|
||||
} else {
|
||||
priv->port_write_msg.discard_count++;
|
||||
pr_info("RIO: ISR Discarded Port-Write Msg(s) (%d)\n",
|
||||
pr_debug("RIO: ISR Discarded Port-Write Msg(s) (%d)\n",
|
||||
priv->port_write_msg.discard_count);
|
||||
}
|
||||
/* Clear interrupt and issue Clear Queue command. This allows
|
||||
* another port-write to be received.
|
||||
*/
|
||||
out_be32(&priv->msg_regs->pwsr, RIO_IPWSR_QFI);
|
||||
out_be32(&priv->msg_regs->pwmr, ipwmr | RIO_IPWMR_CQ);
|
||||
|
||||
schedule_work(&priv->pw_work);
|
||||
}
|
||||
|
||||
/* Issue Clear Queue command. This allows another
|
||||
* port-write to be received.
|
||||
*/
|
||||
out_be32(&priv->msg_regs->pwmr, ipwmr | RIO_IPWMR_CQ);
|
||||
if ((ipwmr & RIO_IPWMR_EIE) && (ipwsr & RIO_IPWSR_TE)) {
|
||||
priv->port_write_msg.err_count++;
|
||||
pr_debug("RIO: Port-Write Transaction Err (%d)\n",
|
||||
priv->port_write_msg.err_count);
|
||||
/* Clear Transaction Error: port-write controller should be
|
||||
* disabled when clearing this error
|
||||
*/
|
||||
out_be32(&priv->msg_regs->pwmr, ipwmr & ~RIO_IPWMR_PWE);
|
||||
out_be32(&priv->msg_regs->pwsr, RIO_IPWSR_TE);
|
||||
out_be32(&priv->msg_regs->pwmr, ipwmr);
|
||||
}
|
||||
|
||||
if (ipwsr & RIO_IPWSR_PWD) {
|
||||
priv->port_write_msg.discard_count++;
|
||||
pr_debug("RIO: Port Discarded Port-Write Msg(s) (%d)\n",
|
||||
priv->port_write_msg.discard_count);
|
||||
out_be32(&priv->msg_regs->pwsr, RIO_IPWSR_PWD);
|
||||
}
|
||||
|
||||
pw_done:
|
||||
if (epwisr & RIO_EPWISR_PINT) {
|
||||
tmp = in_be32(priv->regs_win + RIO_LTLEDCSR);
|
||||
pr_debug("RIO_LTLEDCSR = 0x%x\n", tmp);
|
||||
out_be32(priv->regs_win + RIO_LTLEDCSR, 0);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1461,6 +1472,7 @@ int fsl_rio_setup(struct platform_device *dev)
|
||||
port->host_deviceid = fsl_rio_get_hdid(port->id);
|
||||
|
||||
port->priv = priv;
|
||||
port->phys_efptr = 0x100;
|
||||
rio_register_mport(port);
|
||||
|
||||
priv->regs_win = ioremap(regs.start, regs.end - regs.start + 1);
|
||||
@@ -1508,6 +1520,12 @@ int fsl_rio_setup(struct platform_device *dev)
|
||||
dev_info(&dev->dev, "RapidIO Common Transport System size: %d\n",
|
||||
port->sys_size ? 65536 : 256);
|
||||
|
||||
if (port->host_deviceid >= 0)
|
||||
out_be32(priv->regs_win + RIO_GCCSR, RIO_PORT_GEN_HOST |
|
||||
RIO_PORT_GEN_MASTER | RIO_PORT_GEN_DISCOVERED);
|
||||
else
|
||||
out_be32(priv->regs_win + RIO_GCCSR, 0x00000000);
|
||||
|
||||
priv->atmu_regs = (struct rio_atmu_regs *)(priv->regs_win
|
||||
+ RIO_ATMU_REGS_OFFSET);
|
||||
priv->maint_atmu_regs = priv->atmu_regs + 1;
|
||||
|
||||
@@ -73,18 +73,18 @@ cputime64_to_jiffies64(cputime64_t cputime)
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert cputime to milliseconds and back.
|
||||
* Convert cputime to microseconds and back.
|
||||
*/
|
||||
static inline unsigned int
|
||||
cputime_to_msecs(const cputime_t cputime)
|
||||
cputime_to_usecs(const cputime_t cputime)
|
||||
{
|
||||
return cputime_div(cputime, 4096000);
|
||||
return cputime_div(cputime, 4096);
|
||||
}
|
||||
|
||||
static inline cputime_t
|
||||
msecs_to_cputime(const unsigned int m)
|
||||
usecs_to_cputime(const unsigned int m)
|
||||
{
|
||||
return (cputime_t) m * 4096000;
|
||||
return (cputime_t) m * 4096;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -343,7 +343,8 @@ poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
||||
return __poke_user(child, addr, data);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
ptrace_area parea;
|
||||
int copied, ret;
|
||||
|
||||
@@ -325,7 +325,8 @@ void ptrace_disable(struct task_struct *child)
|
||||
}
|
||||
|
||||
long
|
||||
arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (void __user *)data;
|
||||
@@ -335,14 +336,14 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
ret = copy_regset_to_user(child, &user_score_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(void __user *)datap);
|
||||
datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = copy_regset_from_user(child, &user_score_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(const void __user *)datap);
|
||||
datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
+25
-20
@@ -365,9 +365,9 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
|
||||
return &user_sh_native_view;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
struct user * dummy = NULL;
|
||||
unsigned long __user *datap = (unsigned long __user *)data;
|
||||
int ret;
|
||||
|
||||
@@ -383,17 +383,20 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
if (addr < sizeof(struct pt_regs))
|
||||
tmp = get_stack_long(child, addr);
|
||||
else if (addr >= (long) &dummy->fpu &&
|
||||
addr < (long) &dummy->u_fpvalid) {
|
||||
else if (addr >= offsetof(struct user, fpu) &&
|
||||
addr < offsetof(struct user, u_fpvalid)) {
|
||||
if (!tsk_used_math(child)) {
|
||||
if (addr == (long)&dummy->fpu.fpscr)
|
||||
if (addr == offsetof(struct user, fpu.fpscr))
|
||||
tmp = FPSCR_INIT;
|
||||
else
|
||||
tmp = 0;
|
||||
} else
|
||||
tmp = ((long *)child->thread.xstate)
|
||||
[(addr - (long)&dummy->fpu) >> 2];
|
||||
} else if (addr == (long) &dummy->u_fpvalid)
|
||||
} else {
|
||||
unsigned long index;
|
||||
index = addr - offsetof(struct user, fpu);
|
||||
tmp = ((unsigned long *)child->thread.xstate)
|
||||
[index >> 2];
|
||||
}
|
||||
} else if (addr == offsetof(struct user, u_fpvalid))
|
||||
tmp = !!tsk_used_math(child);
|
||||
else if (addr == PT_TEXT_ADDR)
|
||||
tmp = child->mm->start_code;
|
||||
@@ -417,13 +420,15 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
if (addr < sizeof(struct pt_regs))
|
||||
ret = put_stack_long(child, addr, data);
|
||||
else if (addr >= (long) &dummy->fpu &&
|
||||
addr < (long) &dummy->u_fpvalid) {
|
||||
else if (addr >= offsetof(struct user, fpu) &&
|
||||
addr < offsetof(struct user, u_fpvalid)) {
|
||||
unsigned long index;
|
||||
index = addr - offsetof(struct user, fpu);
|
||||
set_stopped_child_used_math(child);
|
||||
((long *)child->thread.xstate)
|
||||
[(addr - (long)&dummy->fpu) >> 2] = data;
|
||||
((unsigned long *)child->thread.xstate)
|
||||
[index >> 2] = data;
|
||||
ret = 0;
|
||||
} else if (addr == (long) &dummy->u_fpvalid) {
|
||||
} else if (addr == offsetof(struct user, u_fpvalid)) {
|
||||
conditional_stopped_child_used_math(data, child);
|
||||
ret = 0;
|
||||
}
|
||||
@@ -433,35 +438,35 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_sh_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
case PTRACE_SETREGS:
|
||||
return copy_regset_from_user(child, &user_sh_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
#ifdef CONFIG_SH_FPU
|
||||
case PTRACE_GETFPREGS:
|
||||
return copy_regset_to_user(child, &user_sh_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct user_fpu_struct),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
case PTRACE_SETFPREGS:
|
||||
return copy_regset_from_user(child, &user_sh_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct user_fpu_struct),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
#endif
|
||||
#ifdef CONFIG_SH_DSP
|
||||
case PTRACE_GETDSPREGS:
|
||||
return copy_regset_to_user(child, &user_sh_native_view,
|
||||
REGSET_DSP,
|
||||
0, sizeof(struct pt_dspregs),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
case PTRACE_SETDSPREGS:
|
||||
return copy_regset_from_user(child, &user_sh_native_view,
|
||||
REGSET_DSP,
|
||||
0, sizeof(struct pt_dspregs),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
#endif
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
|
||||
@@ -383,9 +383,11 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
|
||||
return &user_sh64_native_view;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *) data;
|
||||
|
||||
switch (request) {
|
||||
/* read the word at location addr in the USER area. */
|
||||
@@ -400,13 +402,15 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
tmp = get_stack_long(child, addr);
|
||||
else if ((addr >= offsetof(struct user, fpu)) &&
|
||||
(addr < offsetof(struct user, u_fpvalid))) {
|
||||
tmp = get_fpu_long(child, addr - offsetof(struct user, fpu));
|
||||
unsigned long index;
|
||||
index = addr - offsetof(struct user, fpu);
|
||||
tmp = get_fpu_long(child, index);
|
||||
} else if (addr == offsetof(struct user, u_fpvalid)) {
|
||||
tmp = !!tsk_used_math(child);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
ret = put_user(tmp, (unsigned long *)data);
|
||||
ret = put_user(tmp, datap);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -437,7 +441,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
else if ((addr >= offsetof(struct user, fpu)) &&
|
||||
(addr < offsetof(struct user, u_fpvalid))) {
|
||||
ret = put_fpu_long(child, addr - offsetof(struct user, fpu), data);
|
||||
unsigned long index;
|
||||
index = addr - offsetof(struct user, fpu);
|
||||
ret = put_fpu_long(child, index, data);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -445,23 +451,23 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return copy_regset_to_user(child, &user_sh64_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
case PTRACE_SETREGS:
|
||||
return copy_regset_from_user(child, &user_sh64_native_view,
|
||||
REGSET_GENERAL,
|
||||
0, sizeof(struct pt_regs),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
#ifdef CONFIG_SH_FPU
|
||||
case PTRACE_GETFPREGS:
|
||||
return copy_regset_to_user(child, &user_sh64_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct user_fpu_struct),
|
||||
(void __user *)data);
|
||||
datap);
|
||||
case PTRACE_SETFPREGS:
|
||||
return copy_regset_from_user(child, &user_sh64_native_view,
|
||||
REGSET_FPU,
|
||||
0, sizeof(struct user_fpu_struct),
|
||||
(const void __user *)data);
|
||||
datap);
|
||||
#endif
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
@@ -471,7 +477,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage int sh64_ptrace(long request, long pid, long addr, long data)
|
||||
asmlinkage int sh64_ptrace(long request, long pid,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
#define WPC_DBRMODE 0x0d104008
|
||||
static unsigned long first_call;
|
||||
|
||||
@@ -207,6 +207,21 @@ _memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
|
||||
|
||||
#define memset_io(d,c,sz) _memset_io(d,c,sz)
|
||||
|
||||
static inline void
|
||||
_sbus_memcpy_fromio(void *dst, const volatile void __iomem *src,
|
||||
__kernel_size_t n)
|
||||
{
|
||||
char *d = dst;
|
||||
|
||||
while (n--) {
|
||||
char tmp = sbus_readb(src);
|
||||
*d++ = tmp;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
#define sbus_memcpy_fromio(d, s, sz) _sbus_memcpy_fromio(d, s, sz)
|
||||
|
||||
static inline void
|
||||
_memcpy_fromio(void *dst, const volatile void __iomem *src, __kernel_size_t n)
|
||||
{
|
||||
@@ -221,6 +236,22 @@ _memcpy_fromio(void *dst, const volatile void __iomem *src, __kernel_size_t n)
|
||||
|
||||
#define memcpy_fromio(d,s,sz) _memcpy_fromio(d,s,sz)
|
||||
|
||||
static inline void
|
||||
_sbus_memcpy_toio(volatile void __iomem *dst, const void *src,
|
||||
__kernel_size_t n)
|
||||
{
|
||||
const char *s = src;
|
||||
volatile void __iomem *d = dst;
|
||||
|
||||
while (n--) {
|
||||
char tmp = *s++;
|
||||
sbus_writeb(tmp, d);
|
||||
d++;
|
||||
}
|
||||
}
|
||||
|
||||
#define sbus_memcpy_toio(d, s, sz) _sbus_memcpy_toio(d, s, sz)
|
||||
|
||||
static inline void
|
||||
_memcpy_toio(volatile void __iomem *dst, const void *src, __kernel_size_t n)
|
||||
{
|
||||
|
||||
@@ -418,6 +418,21 @@ _memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
|
||||
|
||||
#define memset_io(d,c,sz) _memset_io(d,c,sz)
|
||||
|
||||
static inline void
|
||||
_sbus_memcpy_fromio(void *dst, const volatile void __iomem *src,
|
||||
__kernel_size_t n)
|
||||
{
|
||||
char *d = dst;
|
||||
|
||||
while (n--) {
|
||||
char tmp = sbus_readb(src);
|
||||
*d++ = tmp;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
#define sbus_memcpy_fromio(d, s, sz) _sbus_memcpy_fromio(d, s, sz)
|
||||
|
||||
static inline void
|
||||
_memcpy_fromio(void *dst, const volatile void __iomem *src, __kernel_size_t n)
|
||||
{
|
||||
@@ -432,6 +447,22 @@ _memcpy_fromio(void *dst, const volatile void __iomem *src, __kernel_size_t n)
|
||||
|
||||
#define memcpy_fromio(d,s,sz) _memcpy_fromio(d,s,sz)
|
||||
|
||||
static inline void
|
||||
_sbus_memcpy_toio(volatile void __iomem *dst, const void *src,
|
||||
__kernel_size_t n)
|
||||
{
|
||||
const char *s = src;
|
||||
volatile void __iomem *d = dst;
|
||||
|
||||
while (n--) {
|
||||
char tmp = *s++;
|
||||
sbus_writeb(tmp, d);
|
||||
d++;
|
||||
}
|
||||
}
|
||||
|
||||
#define sbus_memcpy_toio(d, s, sz) _sbus_memcpy_toio(d, s, sz)
|
||||
|
||||
static inline void
|
||||
_memcpy_toio(volatile void __iomem *dst, const void *src, __kernel_size_t n)
|
||||
{
|
||||
|
||||
@@ -38,7 +38,7 @@ static inline void pcibios_penalize_isa_irq(int irq, int active)
|
||||
* types on sparc64. However, it requires that the device
|
||||
* can drive enough of the 64 bits.
|
||||
*/
|
||||
#define PCI64_REQUIRED_MASK (~(dma64_addr_t)0)
|
||||
#define PCI64_REQUIRED_MASK (~(u64)0)
|
||||
#define PCI64_ADDR_BASE 0xfffc000000000000UL
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
||||
@@ -323,18 +323,35 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
|
||||
return &user_sparc32_view;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
struct fps {
|
||||
unsigned long regs[32];
|
||||
unsigned long fsr;
|
||||
unsigned long flags;
|
||||
unsigned long extra;
|
||||
unsigned long fpqd;
|
||||
struct fq {
|
||||
unsigned long *insnaddr;
|
||||
unsigned long insn;
|
||||
} fpq[16];
|
||||
};
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4];
|
||||
void __user *addr2p;
|
||||
const struct user_regset_view *view;
|
||||
struct pt_regs __user *pregs;
|
||||
struct fps __user *fps;
|
||||
int ret;
|
||||
|
||||
view = task_user_regset_view(current);
|
||||
addr2p = (void __user *) addr2;
|
||||
pregs = (struct pt_regs __user *) addr;
|
||||
fps = (struct fps __user *) addr;
|
||||
|
||||
switch(request) {
|
||||
case PTRACE_GETREGS: {
|
||||
struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
|
||||
|
||||
ret = copy_regset_to_user(child, view, REGSET_GENERAL,
|
||||
32 * sizeof(u32),
|
||||
4 * sizeof(u32),
|
||||
@@ -348,8 +365,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
case PTRACE_SETREGS: {
|
||||
struct pt_regs __user *pregs = (struct pt_regs __user *) addr;
|
||||
|
||||
ret = copy_regset_from_user(child, view, REGSET_GENERAL,
|
||||
32 * sizeof(u32),
|
||||
4 * sizeof(u32),
|
||||
@@ -363,19 +378,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
case PTRACE_GETFPREGS: {
|
||||
struct fps {
|
||||
unsigned long regs[32];
|
||||
unsigned long fsr;
|
||||
unsigned long flags;
|
||||
unsigned long extra;
|
||||
unsigned long fpqd;
|
||||
struct fq {
|
||||
unsigned long *insnaddr;
|
||||
unsigned long insn;
|
||||
} fpq[16];
|
||||
};
|
||||
struct fps __user *fps = (struct fps __user *) addr;
|
||||
|
||||
ret = copy_regset_to_user(child, view, REGSET_FP,
|
||||
0 * sizeof(u32),
|
||||
32 * sizeof(u32),
|
||||
@@ -397,19 +399,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
}
|
||||
|
||||
case PTRACE_SETFPREGS: {
|
||||
struct fps {
|
||||
unsigned long regs[32];
|
||||
unsigned long fsr;
|
||||
unsigned long flags;
|
||||
unsigned long extra;
|
||||
unsigned long fpqd;
|
||||
struct fq {
|
||||
unsigned long *insnaddr;
|
||||
unsigned long insn;
|
||||
} fpq[16];
|
||||
};
|
||||
struct fps __user *fps = (struct fps __user *) addr;
|
||||
|
||||
ret = copy_regset_from_user(child, view, REGSET_FP,
|
||||
0 * sizeof(u32),
|
||||
32 * sizeof(u32),
|
||||
@@ -424,8 +413,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_READTEXT:
|
||||
case PTRACE_READDATA:
|
||||
ret = ptrace_readdata(child, addr,
|
||||
(void __user *) addr2, data);
|
||||
ret = ptrace_readdata(child, addr, addr2p, data);
|
||||
|
||||
if (ret == data)
|
||||
ret = 0;
|
||||
@@ -435,8 +423,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_WRITETEXT:
|
||||
case PTRACE_WRITEDATA:
|
||||
ret = ptrace_writedata(child, (void __user *) addr2,
|
||||
addr, data);
|
||||
ret = ptrace_writedata(child, addr2p, addr, data);
|
||||
|
||||
if (ret == data)
|
||||
ret = 0;
|
||||
|
||||
@@ -969,16 +969,19 @@ struct fps {
|
||||
unsigned long fsr;
|
||||
};
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
const struct user_regset_view *view = task_user_regset_view(current);
|
||||
unsigned long addr2 = task_pt_regs(current)->u_regs[UREG_I4];
|
||||
struct pt_regs __user *pregs;
|
||||
struct fps __user *fps;
|
||||
void __user *addr2p;
|
||||
int ret;
|
||||
|
||||
pregs = (struct pt_regs __user *) (unsigned long) addr;
|
||||
fps = (struct fps __user *) (unsigned long) addr;
|
||||
pregs = (struct pt_regs __user *) addr;
|
||||
fps = (struct fps __user *) addr;
|
||||
addr2p = (void __user *) addr2;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_PEEKUSR:
|
||||
@@ -1029,8 +1032,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_READTEXT:
|
||||
case PTRACE_READDATA:
|
||||
ret = ptrace_readdata(child, addr,
|
||||
(char __user *)addr2, data);
|
||||
ret = ptrace_readdata(child, addr, addr2p, data);
|
||||
if (ret == data)
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
@@ -1039,8 +1041,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_WRITETEXT:
|
||||
case PTRACE_WRITEDATA:
|
||||
ret = ptrace_writedata(child, (char __user *) addr2,
|
||||
addr, data);
|
||||
ret = ptrace_writedata(child, addr2p, addr, data);
|
||||
if (ret == data)
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
|
||||
@@ -75,7 +75,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
return;
|
||||
}
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
{
|
||||
@@ -104,6 +104,8 @@ void __kunmap_atomic(void *kvaddr)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
kmap_atomic_idx_pop();
|
||||
pagefault_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__kunmap_atomic);
|
||||
|
||||
@@ -58,6 +58,9 @@ config ARCH_SUPPORTS_OPTIMIZED_INLINING
|
||||
config ARCH_PHYS_ADDR_T_64BIT
|
||||
def_bool y
|
||||
|
||||
config ARCH_DMA_ADDR_T_64BIT
|
||||
def_bool y
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
def_bool y
|
||||
|
||||
|
||||
@@ -45,7 +45,8 @@ void ptrace_disable(struct task_struct *child)
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
unsigned long __user *datap = (long __user __force *)data;
|
||||
unsigned long tmp;
|
||||
@@ -57,7 +58,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
switch (request) {
|
||||
|
||||
case PTRACE_PEEKUSR: /* Read register from pt_regs. */
|
||||
if (addr < 0 || addr >= PTREGS_SIZE)
|
||||
if (addr >= PTREGS_SIZE)
|
||||
break;
|
||||
childreg = (char *)task_pt_regs(child) + addr;
|
||||
#ifdef CONFIG_COMPAT
|
||||
@@ -76,7 +77,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_POKEUSR: /* Write register in pt_regs. */
|
||||
if (addr < 0 || addr >= PTREGS_SIZE)
|
||||
if (addr >= PTREGS_SIZE)
|
||||
break;
|
||||
childreg = (char *)task_pt_regs(child) + addr;
|
||||
#ifdef CONFIG_COMPAT
|
||||
@@ -98,7 +99,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
if (!access_ok(VERIFY_WRITE, datap, PTREGS_SIZE))
|
||||
break;
|
||||
childregs = (long *)task_pt_regs(child);
|
||||
for (i = 0; i < sizeof(struct pt_regs)/sizeof(long); ++i) {
|
||||
for (i = 0; i < sizeof(struct pt_regs)/sizeof(unsigned long);
|
||||
++i) {
|
||||
ret = __put_user(childregs[i], &datap[i]);
|
||||
if (ret != 0)
|
||||
break;
|
||||
@@ -109,7 +111,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
if (!access_ok(VERIFY_READ, datap, PTREGS_SIZE))
|
||||
break;
|
||||
childregs = (long *)task_pt_regs(child);
|
||||
for (i = 0; i < sizeof(struct pt_regs)/sizeof(long); ++i) {
|
||||
for (i = 0; i < sizeof(struct pt_regs)/sizeof(unsigned long);
|
||||
++i) {
|
||||
ret = __get_user(childregs[i], &datap[i]);
|
||||
if (ret != 0)
|
||||
break;
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
#include <linux/timex.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
@@ -241,7 +241,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
pte_t pteval = *pte;
|
||||
int idx, type;
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
idx = type + KM_TYPE_NR*smp_processor_id();
|
||||
|
||||
/*
|
||||
@@ -252,6 +252,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
BUG_ON(!pte_present(pteval) && !pte_migrating(pteval));
|
||||
kmap_atomic_unregister(pte_page(pteval), vaddr);
|
||||
kpte_clear_flush(pte, vaddr);
|
||||
kmap_atomic_idx_pop();
|
||||
} else {
|
||||
/* Must be a lowmem page */
|
||||
BUG_ON(vaddr < PAGE_OFFSET);
|
||||
|
||||
+11
-12
@@ -42,10 +42,12 @@ void ptrace_disable(struct task_struct *child)
|
||||
extern int peek_user(struct task_struct * child, long addr, long data);
|
||||
extern int poke_user(struct task_struct * child, long addr, long data);
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int i, ret;
|
||||
unsigned long __user *p = (void __user *)(unsigned long)data;
|
||||
unsigned long __user *p = (void __user *)data;
|
||||
void __user *vp = p;
|
||||
|
||||
switch (request) {
|
||||
/* read word at location addr. */
|
||||
@@ -107,24 +109,20 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
#endif
|
||||
#ifdef PTRACE_GETFPREGS
|
||||
case PTRACE_GETFPREGS: /* Get the child FPU state. */
|
||||
ret = get_fpregs((struct user_i387_struct __user *) data,
|
||||
child);
|
||||
ret = get_fpregs(vp, child);
|
||||
break;
|
||||
#endif
|
||||
#ifdef PTRACE_SETFPREGS
|
||||
case PTRACE_SETFPREGS: /* Set the child FPU state. */
|
||||
ret = set_fpregs((struct user_i387_struct __user *) data,
|
||||
child);
|
||||
ret = set_fpregs(vp, child);
|
||||
break;
|
||||
#endif
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = ptrace_get_thread_area(child, addr,
|
||||
(struct user_desc __user *) data);
|
||||
ret = ptrace_get_thread_area(child, addr, vp);
|
||||
break;
|
||||
|
||||
case PTRACE_SET_THREAD_AREA:
|
||||
ret = ptrace_set_thread_area(child, addr,
|
||||
(struct user_desc __user *) data);
|
||||
ret = ptrace_set_thread_area(child, addr, datavp);
|
||||
break;
|
||||
|
||||
case PTRACE_FAULTINFO: {
|
||||
@@ -134,7 +132,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
* On i386, ptrace_faultinfo is smaller!
|
||||
*/
|
||||
ret = copy_to_user(p, &child->thread.arch.faultinfo,
|
||||
sizeof(struct ptrace_faultinfo));
|
||||
sizeof(struct ptrace_faultinfo)) ?
|
||||
-EIO : 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -158,7 +157,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
#ifdef PTRACE_ARCH_PRCTL
|
||||
case PTRACE_ARCH_PRCTL:
|
||||
/* XXX Calls ptrace on the host - needs some SMP thinking */
|
||||
ret = arch_prctl(child, data, (void *) addr);
|
||||
ret = arch_prctl(child, data, (void __user *) addr);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
||||
@@ -203,8 +203,8 @@ int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child)
|
||||
(unsigned long *) &fpregs);
|
||||
}
|
||||
|
||||
long subarch_ptrace(struct task_struct *child, long request, long addr,
|
||||
long data)
|
||||
long subarch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -175,19 +175,18 @@ int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child)
|
||||
return restore_fp_registers(userspace_pid[cpu], fpregs);
|
||||
}
|
||||
|
||||
long subarch_ptrace(struct task_struct *child, long request, long addr,
|
||||
long data)
|
||||
long subarch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret = -EIO;
|
||||
void __user *datap = (void __user *) data;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_GETFPXREGS: /* Get the child FPU state. */
|
||||
ret = get_fpregs((struct user_i387_struct __user *) data,
|
||||
child);
|
||||
ret = get_fpregs(datap, child);
|
||||
break;
|
||||
case PTRACE_SETFPXREGS: /* Set the child FPU state. */
|
||||
ret = set_fpregs((struct user_i387_struct __user *) data,
|
||||
child);
|
||||
ret = set_fpregs(datap, child);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -801,7 +801,8 @@ void ptrace_disable(struct task_struct *child)
|
||||
static const struct user_regset_view user_x86_32_view; /* Initialized below. */
|
||||
#endif
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret;
|
||||
unsigned long __user *datap = (unsigned long __user *)data;
|
||||
@@ -812,8 +813,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
unsigned long tmp;
|
||||
|
||||
ret = -EIO;
|
||||
if ((addr & (sizeof(data) - 1)) || addr < 0 ||
|
||||
addr >= sizeof(struct user))
|
||||
if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
|
||||
break;
|
||||
|
||||
tmp = 0; /* Default return condition */
|
||||
@@ -830,8 +830,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
|
||||
ret = -EIO;
|
||||
if ((addr & (sizeof(data) - 1)) || addr < 0 ||
|
||||
addr >= sizeof(struct user))
|
||||
if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user))
|
||||
break;
|
||||
|
||||
if (addr < sizeof(struct user_regs_struct))
|
||||
@@ -888,17 +887,17 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
if (addr < 0)
|
||||
if ((int) addr < 0)
|
||||
return -EIO;
|
||||
ret = do_get_thread_area(child, addr,
|
||||
(struct user_desc __user *) data);
|
||||
(struct user_desc __user *)data);
|
||||
break;
|
||||
|
||||
case PTRACE_SET_THREAD_AREA:
|
||||
if (addr < 0)
|
||||
if ((int) addr < 0)
|
||||
return -EIO;
|
||||
ret = do_set_thread_area(child, addr,
|
||||
(struct user_desc __user *) data, 0);
|
||||
(struct user_desc __user *)data, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
|
||||
int idx, type;
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
idx = type + KM_TYPE_NR * smp_processor_id();
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
@@ -87,6 +87,7 @@ void __kunmap_atomic(void *kvaddr)
|
||||
* attributes or becomes a protected page in a hypervisor.
|
||||
*/
|
||||
kpte_clear_flush(kmap_pte-idx, vaddr);
|
||||
kmap_atomic_idx_pop();
|
||||
}
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
else {
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include <asm/numa.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
static int __init parse_direct_gbpages_off(char *arg)
|
||||
{
|
||||
|
||||
@@ -98,7 +98,7 @@ iounmap_atomic(void __iomem *kvaddr)
|
||||
vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
|
||||
int idx, type;
|
||||
|
||||
type = kmap_atomic_idx_pop();
|
||||
type = kmap_atomic_idx();
|
||||
idx = type + KM_TYPE_NR * smp_processor_id();
|
||||
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
@@ -111,6 +111,7 @@ iounmap_atomic(void __iomem *kvaddr)
|
||||
* attributes or becomes a protected page in a hypervisor.
|
||||
*/
|
||||
kpte_clear_flush(kmap_pte-idx, vaddr);
|
||||
kmap_atomic_idx_pop();
|
||||
}
|
||||
|
||||
pagefault_enable();
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/stackprotector.h>
|
||||
#include <asm/hypervisor.h>
|
||||
|
||||
|
||||
@@ -256,9 +256,11 @@ int ptrace_pokeusr(struct task_struct *child, long regno, long val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
long arch_ptrace(struct task_struct *child, long request,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
int ret = -EPERM;
|
||||
void __user *datap = (void __user *) data;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||
@@ -267,7 +269,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_PEEKUSR: /* read register specified by addr. */
|
||||
ret = ptrace_peekusr(child, addr, (void __user *) data);
|
||||
ret = ptrace_peekusr(child, addr, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_POKETEXT: /* write the word at location addr. */
|
||||
@@ -280,19 +282,19 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
break;
|
||||
|
||||
case PTRACE_GETREGS:
|
||||
ret = ptrace_getregs(child, (void __user *) data);
|
||||
ret = ptrace_getregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETREGS:
|
||||
ret = ptrace_setregs(child, (void __user *) data);
|
||||
ret = ptrace_setregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_GETXTREGS:
|
||||
ret = ptrace_getxregs(child, (void __user *) data);
|
||||
ret = ptrace_getxregs(child, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_SETXTREGS:
|
||||
ret = ptrace_setxregs(child, (void __user *) data);
|
||||
ret = ptrace_setxregs(child, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user