mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
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:
@@ -21,6 +21,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <linux/genetlink.h>
|
||||
@@ -266,11 +267,13 @@ int main(int argc, char *argv[])
|
||||
int containerset = 0;
|
||||
char containerpath[1024];
|
||||
int cfd = 0;
|
||||
int forking = 0;
|
||||
sigset_t sigset;
|
||||
|
||||
struct msgtemplate msg;
|
||||
|
||||
while (1) {
|
||||
c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:");
|
||||
while (!forking) {
|
||||
c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:c:");
|
||||
if (c < 0)
|
||||
break;
|
||||
|
||||
@@ -319,6 +322,28 @@ int main(int argc, char *argv[])
|
||||
err(1, "Invalid pid\n");
|
||||
cmd_type = TASKSTATS_CMD_ATTR_PID;
|
||||
break;
|
||||
case 'c':
|
||||
|
||||
/* Block SIGCHLD for sigwait() later */
|
||||
if (sigemptyset(&sigset) == -1)
|
||||
err(1, "Failed to empty sigset");
|
||||
if (sigaddset(&sigset, SIGCHLD))
|
||||
err(1, "Failed to set sigchld in sigset");
|
||||
sigprocmask(SIG_BLOCK, &sigset, NULL);
|
||||
|
||||
/* fork/exec a child */
|
||||
tid = fork();
|
||||
if (tid < 0)
|
||||
err(1, "Fork failed\n");
|
||||
if (tid == 0)
|
||||
if (execvp(argv[optind - 1],
|
||||
&argv[optind - 1]) < 0)
|
||||
exit(-1);
|
||||
|
||||
/* Set the command type and avoid further processing */
|
||||
cmd_type = TASKSTATS_CMD_ATTR_PID;
|
||||
forking = 1;
|
||||
break;
|
||||
case 'v':
|
||||
printf("debug on\n");
|
||||
dbg = 1;
|
||||
@@ -370,6 +395,15 @@ int main(int argc, char *argv[])
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we forked a child, wait for it to exit. Cannot use waitpid()
|
||||
* as all the delicious data would be reaped as part of the wait
|
||||
*/
|
||||
if (tid && forking) {
|
||||
int sig_received;
|
||||
sigwait(&sigset, &sig_received);
|
||||
}
|
||||
|
||||
if (tid) {
|
||||
rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET,
|
||||
cmd_type, &tid, sizeof(__u32));
|
||||
|
||||
@@ -18,7 +18,8 @@ CONTENTS:
|
||||
1.2 Why are cgroups needed ?
|
||||
1.3 How are cgroups implemented ?
|
||||
1.4 What does notify_on_release do ?
|
||||
1.5 How do I use cgroups ?
|
||||
1.5 What does clone_children do ?
|
||||
1.6 How do I use cgroups ?
|
||||
2. Usage Examples and Syntax
|
||||
2.1 Basic Usage
|
||||
2.2 Attaching processes
|
||||
@@ -293,7 +294,16 @@ notify_on_release in the root cgroup at system boot is disabled
|
||||
value of their parents notify_on_release setting. The default value of
|
||||
a cgroup hierarchy's release_agent path is empty.
|
||||
|
||||
1.5 How do I use cgroups ?
|
||||
1.5 What does clone_children do ?
|
||||
---------------------------------
|
||||
|
||||
If the clone_children flag is enabled (1) in a cgroup, then all
|
||||
cgroups created beneath will call the post_clone callbacks for each
|
||||
subsystem of the newly created cgroup. Usually when this callback is
|
||||
implemented for a subsystem, it copies the values of the parent
|
||||
subsystem, this is the case for the cpuset.
|
||||
|
||||
1.6 How do I use cgroups ?
|
||||
--------------------------
|
||||
|
||||
To start a new job that is to be contained within a cgroup, using
|
||||
|
||||
@@ -526,6 +526,23 @@ Who: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: namespace cgroup (ns_cgroup)
|
||||
When: 2.6.38
|
||||
Why: The ns_cgroup leads to some problems:
|
||||
* cgroup creation is out-of-control
|
||||
* cgroup name can conflict when pids are looping
|
||||
* it is not possible to have a single process handling
|
||||
a lot of namespaces without falling in a exponential creation time
|
||||
* we may want to create a namespace without creating a cgroup
|
||||
|
||||
The ns_cgroup is replaced by a compatibility flag 'clone_children',
|
||||
where a newly created cgroup will copy the parent cgroup values.
|
||||
The userspace has to manually create a cgroup and add a task to
|
||||
the 'tasks' file.
|
||||
Who: Daniel Lezcano <daniel.lezcano@free.fr>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: iwlwifi disable_hw_scan module parameters
|
||||
When: 2.6.40
|
||||
Why: Hareware scan is the prefer method for iwlwifi devices for
|
||||
|
||||
@@ -136,6 +136,7 @@ Table 1-1: Process specific entries in /proc
|
||||
statm Process memory status information
|
||||
status Process status in human readable form
|
||||
wchan If CONFIG_KALLSYMS is set, a pre-decoded wchan
|
||||
pagemap Page table
|
||||
stack Report full stack trace, enable via CONFIG_STACKTRACE
|
||||
smaps a extension based on maps, showing the memory consumption of
|
||||
each mapping
|
||||
@@ -370,6 +371,7 @@ Shared_Dirty: 0 kB
|
||||
Private_Clean: 0 kB
|
||||
Private_Dirty: 0 kB
|
||||
Referenced: 892 kB
|
||||
Anonymous: 0 kB
|
||||
Swap: 0 kB
|
||||
KernelPageSize: 4 kB
|
||||
MMUPageSize: 4 kB
|
||||
@@ -378,9 +380,15 @@ The first of these lines shows the same information as is displayed for the
|
||||
mapping in /proc/PID/maps. The remaining lines show the size of the mapping
|
||||
(size), the amount of the mapping that is currently resident in RAM (RSS), the
|
||||
process' proportional share of this mapping (PSS), the number of clean and
|
||||
dirty shared pages in the mapping, and the number of clean and dirty private
|
||||
pages in the mapping. The "Referenced" indicates the amount of memory
|
||||
currently marked as referenced or accessed.
|
||||
dirty private pages in the mapping. Note that even a page which is part of a
|
||||
MAP_SHARED mapping, but has only a single pte mapped, i.e. is currently used
|
||||
by only one process, is accounted as private and not as shared. "Referenced"
|
||||
indicates the amount of memory currently marked as referenced or accessed.
|
||||
"Anonymous" shows the amount of memory that does not belong to any file. Even
|
||||
a mapping associated with a file may contain anonymous pages: when MAP_PRIVATE
|
||||
and a page is modified, the file page is replaced by a private anonymous copy.
|
||||
"Swap" shows how much would-be-anonymous memory is also used, but out on
|
||||
swap.
|
||||
|
||||
This file is only present if the CONFIG_MMU kernel configuration option is
|
||||
enabled.
|
||||
@@ -397,6 +405,9 @@ To clear the bits for the file mapped pages associated with the process
|
||||
> echo 3 > /proc/PID/clear_refs
|
||||
Any other value written to /proc/PID/clear_refs will have no effect.
|
||||
|
||||
The /proc/pid/pagemap gives the PFN, which can be used to find the pageflags
|
||||
using /proc/kpageflags and number of times a page is mapped using
|
||||
/proc/kpagecount. For detailed explanation, see Documentation/vm/pagemap.txt.
|
||||
|
||||
1.2 Kernel data
|
||||
---------------
|
||||
|
||||
@@ -80,8 +80,10 @@ dirty_background_bytes
|
||||
Contains the amount of dirty memory at which the pdflush background writeback
|
||||
daemon will start writeback.
|
||||
|
||||
If dirty_background_bytes is written, dirty_background_ratio becomes a function
|
||||
of its value (dirty_background_bytes / the amount of dirtyable system memory).
|
||||
Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only
|
||||
one of them may be specified at a time. When one sysctl is written it is
|
||||
immediately taken into account to evaluate the dirty memory limits and the
|
||||
other appears as 0 when read.
|
||||
|
||||
==============================================================
|
||||
|
||||
@@ -97,8 +99,10 @@ dirty_bytes
|
||||
Contains the amount of dirty memory at which a process generating disk writes
|
||||
will itself start writeback.
|
||||
|
||||
If dirty_bytes is written, dirty_ratio becomes a function of its value
|
||||
(dirty_bytes / the amount of dirtyable system memory).
|
||||
Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be
|
||||
specified at a time. When one sysctl is written it is immediately taken into
|
||||
account to evaluate the dirty memory limits and the other appears as 0 when
|
||||
read.
|
||||
|
||||
Note: the minimum value allowed for dirty_bytes is two pages (in bytes); any
|
||||
value lower than this limit will be ignored and the old configuration will be
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user