Index: arch/amd64/include/cpu.h
===================================================================
--- arch/amd64/include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/amd64/include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -36,10 +36,4 @@
 #include <arch/asm.h>
 
-#ifdef __SMP__
-#define CPU_ID_ARCH	(read_dr0())
-#else
-#define CPU_ID_ARCH	(0)
-#endif
-
 struct cpu_arch {
 	int vendor;
Index: arch/ia32/include/asm.h
===================================================================
--- arch/ia32/include/asm.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ia32/include/asm.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -84,20 +84,4 @@
 static inline __u32 read_cr3(void) { __u32 v; __asm__ volatile ("movl %%cr3,%0" : "=r" (v)); return v; }
 
-/** Write DR0
- *
- * Write value to DR0.
- *
- * @param v Value to be written.
- */
-static inline void write_dr0(__u32 v) { __asm__ volatile ("movl %0,%%dr0\n" : : "r" (v)); }
-
-/** Read DR0
- *
- * Return value in DR0
- *
- * @return Value read.
- */
-static inline __u32 read_dr0(void) { __u32 v; __asm__ volatile ("movl %%dr0,%0" : "=r" (v)); return v; }
-
 /** Set priority level low
  *
Index: arch/ia32/include/cpu.h
===================================================================
--- arch/ia32/include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ia32/include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -34,10 +34,4 @@
 #include <arch/asm.h>
 
-#ifdef __SMP__
-#define CPU_ID_ARCH	(read_dr0())
-#else
-#define CPU_ID_ARCH	(0)
-#endif
-
 struct cpu_arch {
 	int vendor;
Index: arch/ia32/src/ia32.c
===================================================================
--- arch/ia32/src/ia32.c	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ia32/src/ia32.c	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -52,6 +52,4 @@
 	pm_init();
 
-	write_dr0(config.cpu_active - 1);
-
 	if (config.cpu_active == 1) {
 		bios_init();
Index: arch/ia64/include/cpu.h
===================================================================
--- arch/ia64/include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ia64/include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -32,6 +32,4 @@
 #include <typedefs.h>
 
-#define CPU_ID_ARCH	0
-
 struct cpu_arch {
 };
Index: arch/mips/include/cpu.h
===================================================================
--- arch/mips/include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/mips/include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -30,6 +30,4 @@
 #define __mips_CPU_H__
 
-#define CPU_ID_ARCH	0
-
 struct cpu_arch {
 	int imp_num;
Index: arch/ppc/include/cpu.h
===================================================================
--- arch/ppc/include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ppc/include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -32,6 +32,4 @@
 #include <typedefs.h>
 
-#define CPU_ID_ARCH	0
-
 struct cpu_arch {
 };
Index: include/arch.h
===================================================================
--- include/arch.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ include/arch.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -40,14 +40,7 @@
 #include <proc/task.h>
 
-/*
- * NOTE:
- * CPU, THREAD and TASK are not preemption-safe.
- * Provisions must be made to prevent preemption prior
- * to using these macros. Simple cpu_priority_high()
- * call will suffice.
- */
-#define CPU		(&cpus[CPU_ID_ARCH])
-#define THREAD		(cpu_private_data[CPU_ID_ARCH].thread)
-#define TASK		(cpu_private_data[CPU_ID_ARCH].task)
+#define CPU		THE->cpu
+#define THREAD		THE->thread
+#define TASK		THE->task
 
 /*
Index: include/cpu.h
===================================================================
--- include/cpu.h	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ include/cpu.h	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -72,14 +72,4 @@
 };
 
-/*
- * read/write by associated CPU
- * read only by other CPUs
- */
-struct cpu_private_data {
-	thread_t *thread;
-	task_t *task;
-};
-
-extern cpu_private_data_t *cpu_private_data;
 extern cpu_t *cpus;
 
Index: src/Makefile.config
===================================================================
--- src/Makefile.config	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ src/Makefile.config	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -21,5 +21,5 @@
 
 # Uncomment if you want to run in the test mode
-TEST=__TEST__
+#TEST=__TEST__
 
 TEST_FILE=test.c
@@ -34,3 +34,3 @@
 #TEST_DIR=synch/semaphore2/
 #TEST_DIR=fpu/fpu1
-TEST_DIR=print/print1
+#TEST_DIR=print/print1
Index: src/cpu/cpu.c
===================================================================
--- src/cpu/cpu.c	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ src/cpu/cpu.c	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -40,8 +40,5 @@
 #include <list.h>
 
-
-cpu_private_data_t *cpu_private_data;
 cpu_t *cpus;
-
 
 /** Initialize CPUs
@@ -56,8 +53,4 @@
 	if (config.cpu_active == 1) {
 	#endif /* __SMP__ */
-		cpu_private_data = (cpu_private_data_t *) malloc(sizeof(cpu_private_data_t) * config.cpu_count);
-		if (!cpu_private_data)
-			panic("malloc/cpu_private_data");
-
 		cpus = (cpu_t *) malloc(sizeof(cpu_t) * config.cpu_count);
 		if (!cpus)
@@ -65,9 +58,8 @@
 
 		/* initialize everything */
-		memsetb((__address) cpu_private_data, sizeof(cpu_private_data_t) * config.cpu_count, 0);
 		memsetb((__address) cpus, sizeof(cpu_t) * config.cpu_count, 0);
 
 		for (i=0; i < config.cpu_count; i++) {
-			cpus[i].stack = (__u8 *) malloc(CPU_STACK_SIZE);
+			cpus[i].stack = (__u8 *) frame_alloc(FRAME_KA | FRAME_PANIC);
 			if (!cpus[i].stack)
 				panic("malloc/cpus[%d].stack\n", i);
@@ -87,4 +79,6 @@
 	}
 	#endif /* __SMP__ */
+
+	CPU = &cpus[config.cpu_active-1];
 	
 	CPU->active = 1;
Index: src/main/main.c
===================================================================
--- src/main/main.c	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ src/main/main.c	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -180,5 +180,4 @@
 	t = thread_create(kinit, NULL, k, 0);
 	if (!t) panic("can't create kinit thread\n");
-
 	thread_ready(t);
 
@@ -211,4 +210,9 @@
 	config.cpu_active++;
 
+	/*
+	 * The THE structure is well defined because ctx.sp is used as stack.
+	 */
+	the_initialize(THE);
+
 	arch_pre_mm_init();
 	frame_init();
@@ -222,4 +226,5 @@
 	l_apic_debug();
 
+	the_copy(THE, (the_t *) CPU->stack);
 
 	/*
Index: src/proc/scheduler.c
===================================================================
--- src/proc/scheduler.c	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ src/proc/scheduler.c	(revision 7ce9284bc15563efd319a02a5e85675909c33208)
@@ -364,5 +364,5 @@
 	priority = THREAD->pri;
 	spinlock_unlock(&THREAD->lock);	
-	
+
 	relink_rq(priority);		
 
