patch-2.4.22 linux-2.4.22/arch/arm/kernel/process.c
Next file: linux-2.4.22/arch/arm/kernel/ptrace.c
Previous file: linux-2.4.22/arch/arm/kernel/oldlatches.c
Back to the patch index
Back to the overall index
- Lines: 182
- Date:
2003-08-25 04:44:39.000000000 -0700
- Orig file:
linux-2.4.21/arch/arm/kernel/process.c
- Orig date:
2003-06-13 07:51:29.000000000 -0700
diff -urN linux-2.4.21/arch/arm/kernel/process.c linux-2.4.22/arch/arm/kernel/process.c
@@ -24,18 +24,10 @@
#include <linux/interrupt.h>
#include <linux/init.h>
-#include <asm/leds.h>
#include <asm/system.h>
+#include <asm/leds.h>
#include <asm/uaccess.h>
-/*
- * Values for cpu_do_idle()
- */
-#define IDLE_WAIT_SLOW 0
-#define IDLE_WAIT_FAST 1
-#define IDLE_CLOCK_SLOW 2
-#define IDLE_CLOCK_FAST 3
-
extern const char *processor_modes[];
extern void setup_mm_for_reboot(char mode);
@@ -75,6 +67,18 @@
void (*pm_power_off)(void);
/*
+ * This is our default idle handler. We need to disable
+ * interrupts here to ensure we don't miss a wakeup call.
+ */
+void default_idle(void)
+{
+ local_irq_disable();
+ if (!current->need_resched && !hlt_counter)
+ arch_idle();
+ local_irq_enable();
+}
+
+/*
* The idle thread. We try to conserve power, while trying to keep
* overall latency low. The architecture specific idle is passed
* a value to indicate the level of "idleness" of the system.
@@ -89,7 +93,7 @@
while (1) {
void (*idle)(void) = pm_idle;
if (!idle)
- idle = arch_idle;
+ idle = default_idle;
leds_event(led_idle_start);
while (!current->need_resched)
idle();
@@ -176,15 +180,15 @@
flags & CC_Z_BIT ? 'Z' : 'z',
flags & CC_C_BIT ? 'C' : 'c',
flags & CC_V_BIT ? 'V' : 'v');
- printk(" IRQs %s FIQs %s Mode %s%s Segment %s\n",
- interrupts_enabled(regs) ? "on" : "off",
- fast_interrupts_enabled(regs) ? "on" : "off",
+ printk(" IRQs o%s FIQs o%s Mode %s%s Segment %s\n",
+ interrupts_enabled(regs) ? "n" : "ff",
+ fast_interrupts_enabled(regs) ? "n" : "ff",
processor_modes[processor_mode(regs)],
thumb_mode(regs) ? " (T)" : "",
get_fs() == get_ds() ? "kernel" : "user");
#if defined(CONFIG_CPU_32)
{
- int ctrl, transbase, dac;
+ unsigned int ctrl, transbase, dac;
__asm__ (
" mrc p15, 0, %0, c1, c0\n"
" mrc p15, 0, %1, c2, c0\n"
@@ -282,12 +286,22 @@
{
}
+static void default_fp_init(union fp_state *fp)
+{
+ memset(fp, 0, sizeof(union fp_state));
+}
+
+void (*fp_init)(union fp_state *) = default_fp_init;
+
void flush_thread(void)
{
- memset(¤t->thread.debug, 0, sizeof(struct debug_info));
- memset(¤t->thread.fpstate, 0, sizeof(union fp_state));
- current->used_math = 0;
- current->flags &= ~PF_USEDFPU;
+ struct task_struct *tsk = current;
+
+ tsk->flags &= ~PF_USEDFPU;
+ tsk->used_math = 0;
+
+ memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
+ fp_init(&tsk->thread.fpstate);
}
void release_thread(struct task_struct *dead_task)
@@ -296,16 +310,16 @@
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
-int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
- unsigned long unused,
- struct task_struct * p, struct pt_regs * regs)
+int
+copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
+ unsigned long unused, struct task_struct * p, struct pt_regs * regs)
{
- struct pt_regs * childregs;
+ struct pt_regs *childregs;
struct context_save_struct * save;
atomic_set(&p->thread.refcount, 1);
- childregs = ((struct pt_regs *)((unsigned long)p + 8192)) - 1;
+ childregs = ((struct pt_regs *)((unsigned long)p + 8192 - 8)) - 1;
*childregs = *regs;
childregs->ARM_r0 = 0;
childregs->ARM_sp = esp;
@@ -324,10 +338,12 @@
*/
int dump_fpu (struct pt_regs *regs, struct user_fp *fp)
{
- if (current->used_math)
+ int used_math = current->used_math;
+
+ if (used_math)
memcpy(fp, ¤t->thread.fpstate.soft, sizeof (*fp));
- return current->used_math;
+ return used_math;
}
/*
@@ -347,8 +363,8 @@
dump->u_debugreg[0] = tsk->thread.debug.bp[0].address;
dump->u_debugreg[1] = tsk->thread.debug.bp[1].address;
- dump->u_debugreg[2] = tsk->thread.debug.bp[0].insn;
- dump->u_debugreg[3] = tsk->thread.debug.bp[1].insn;
+ dump->u_debugreg[2] = tsk->thread.debug.bp[0].insn.arm;
+ dump->u_debugreg[3] = tsk->thread.debug.bp[1].insn.arm;
dump->u_debugreg[4] = tsk->thread.debug.nsaved;
if (dump->start_stack < 0x04000000)
@@ -371,18 +387,18 @@
pid_t __ret;
__asm__ __volatile__(
- "orr r0, %1, %2 @ kernel_thread sys_clone
- mov r1, #0
- "__syscall(clone)"
- movs %0, r0 @ if we are the child
- bne 1f
- mov fp, #0 @ ensure that fp is zero
- mov r0, %4
- mov lr, pc
- mov pc, %3
- b sys_exit
+ "orr r0, %1, %2 @ kernel_thread sys_clone \n\
+ mov r1, #0 \n\
+ "__syscall(clone)" \n\
+ movs %0, r0 @ if we are the child \n\
+ bne 1f \n\
+ mov fp, #0 @ ensure that fp is zero \n\
+ mov r0, %4 \n\
+ mov lr, pc \n\
+ mov pc, %3 \n\
+ b sys_exit \n\
1: "
- : "=r" (__ret)
+ : "=&r" (__ret)
: "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg)
: "r0", "r1", "lr");
return __ret;
@@ -405,7 +421,7 @@
return 0;
stack_page = 4096 + (unsigned long)p;
- fp = get_css_fp(&p->thread);
+ fp = thread_saved_fp(&p->thread);
do {
if (fp < stack_page || fp > 4092+stack_page)
return 0;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)