Index: arch/ia32/Makefile.inc
===================================================================
--- arch/ia32/Makefile.inc	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/Makefile.inc	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -14,5 +14,5 @@
 
 CPPFLAGS=$(DEFS) -nostdinc -I../include
-CFLAGS=$(CPPFLAGS) -nostdlib -fno-builtin -fomit-frame-pointer -Wmissing-prototypes -Werror -O3
+CFLAGS=$(CPPFLAGS) -nostdlib -fno-builtin -fomit-frame-pointer -Wmissing-prototypes -Werror -O1
 LFLAGS=-M -no-check-sections -T ../arch/ia32/_link.ld
 
Index: arch/ia32/_link.ld
===================================================================
--- arch/ia32/_link.ld	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/_link.ld	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -14,9 +14,11 @@
 	ktext_start = .;
 	*(K_TEXT_START);
+	delta_start = .;
+	*(K_DATA_START);
+	delta_end = .;			
 	*(.text);
 	ktext_end = .;
 
 	kdata_start = .;
-	*(K_DATA_START);
 	*(.data);		/* initialized data */
 	*(.rodata*);		/* string literals */
@@ -29,10 +31,10 @@
     . = ABSOLUTE(hardcoded_ktext_size);
     .patch_1 : {
-        LONG(ktext_end - ktext_start);
+        LONG(ktext_end - ktext_start - (delta_end - delta_start));
     }
 
     . = ABSOLUTE(hardcoded_kdata_size);
     .patch_2 : {
-        LONG(kdata_end - kdata_start);
+        LONG(kdata_end - kdata_start + (delta_end - delta_start));
     }
 
Index: arch/ia32/boot/boot.ld
===================================================================
--- arch/ia32/boot/boot.ld	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/boot/boot.ld	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -1,2 +1,4 @@
+OUTPUT_FORMAT(binary)
+ENTRY(main)
 SECTIONS {
     .text 0x7c00 : AT (0x0) { *(.text) }
Index: arch/ia32/include/cpu.h
===================================================================
--- arch/ia32/include/cpu.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/include/cpu.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -30,6 +30,13 @@
 #define __ia32_CPU_H__
 
+#include <config.h>
 #include <typedefs.h>
 #include <arch/pm.h>
+
+#ifdef __SMP__
+#define CPU_ID_ARCH	(config.cpu_count>1?l_apic_id():0)
+#else
+#define CPU_ID_ARCH	(0)
+#endif
 
 struct cpu_arch {
Index: arch/ia32/include/smp/apic.h
===================================================================
--- arch/ia32/include/smp/apic.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/include/smp/apic.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -96,4 +96,6 @@
 #define L_APIC_ID	(0x020/sizeof(__u32))
 #define L_APIC_IDClear	(~(0xf<<24))
+#define L_APIC_IDShift	24
+#define L_APIC_IDMask	0xf
 
 /* IO APIC */
@@ -121,4 +123,5 @@
 extern void l_apic_debug(void);
 extern void l_apic_timer_interrupt(__u8 n, __u32 stack[]);
+extern __u8 l_apic_id(void);
 
 extern __u32 io_apic_read(__u8 address);
Index: arch/ia32/src/cpu/cpu.c
===================================================================
--- arch/ia32/src/cpu/cpu.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/src/cpu/cpu.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -35,4 +35,6 @@
 #include <print.h>
 #include <typedefs.h>
+
+#include <arch/smp/apic.h>
 
 /*
Index: arch/ia32/src/pm.c
===================================================================
--- arch/ia32/src/pm.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/src/pm.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -67,5 +67,5 @@
 
 /* gdtr changes everytime new CPU is initialized */
-struct ptr_16_32 gdtr = { .limit = sizeof(gdt), .base = (__address) gdt };
+struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = (__address) gdt };
 struct ptr_16_32 idtr = { .limit = sizeof(idt), .base = (__address) idt };
 
Index: arch/ia32/src/smp/apic.c
===================================================================
--- arch/ia32/src/smp/apic.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/ia32/src/smp/apic.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -27,6 +27,4 @@
  */
 
-#ifdef __SMP__
-
 #include <arch/types.h>
 #include <arch/smp/apic.h>
@@ -39,4 +37,6 @@
 #include <arch/asm.h>
 #include <arch.h>
+
+#ifdef __SMP__
 
 /*
@@ -222,5 +222,17 @@
 {
 	__u32 tmp, t1, t2;
-	
+	int cpu_id = config.cpu_active - 1;
+	
+
+	/*
+	 * Here we set local APIC ID's so that they match operating system's CPU ID's
+	 * This operation is dangerous as it is model specific.
+	 * TODO: some care should be taken.
+	 * NOTE: CPU may not be used to define APIC ID
+	 */
+	if (l_apic_id() != cpu_id) {
+		l_apic[L_APIC_ID] &= L_APIC_IDClear;
+		l_apic[L_APIC_ID] |= (l_apic[L_APIC_ID]&L_APIC_IDClear)|((cpu_id)<<L_APIC_IDShift);
+	}
 
 	l_apic[LVT_Err] |= (1<<16);
@@ -271,5 +283,5 @@
 	int i, lint;
 
-	printf("LVT on cpu%d, LAPIC ID: %d\n", CPU->id, (l_apic[L_APIC_ID] >> 24)&0xf);
+	printf("LVT on cpu%d, LAPIC ID: %d\n", CPU->id, l_apic_id());
 
 	printf("LVT_Tm: ");
@@ -305,5 +317,5 @@
 	 * This register is supported only on P6 and higher.
 	 */
-	if (CPU->family > 5) {
+	if (CPU->arch.family > 5) {
 		printf("LVT_PCINT: ");
 		if (l_apic[LVT_PCINT] & (1<<16)) printf("masked"); else printf("not masked"); putchar(',');
@@ -324,4 +336,9 @@
 	l_apic_eoi();
 	clock();
+}
+
+__u8 l_apic_id(void)
+{
+	return (l_apic[L_APIC_ID] >> L_APIC_IDShift)&L_APIC_IDMask;
 }
 
Index: arch/mips/include/cpu.h
===================================================================
--- arch/mips/include/cpu.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ arch/mips/include/cpu.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -32,4 +32,6 @@
 #include <typedefs.h>
 
+#define CPU_ID_ARCH	0
+
 struct cpu_arch {
         int imp_num;
Index: include/arch.h
===================================================================
--- include/arch.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ include/arch.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -34,10 +34,9 @@
 
 #include <cpu.h>
+#include <arch/cpu.h>
 
-#define CPU		(the->cpu)
-#define THREAD		(the->thread)
-#define TASK		(the->task)
-
-extern cpu_private_page_t *the;
+#define CPU		(cpu_private_data[CPU_ID_ARCH].cpu)
+#define THREAD		(cpu_private_data[CPU_ID_ARCH].thread)
+#define TASK		(cpu_private_data[CPU_ID_ARCH].task)
 
 extern void arch_init(void);
Index: include/cpu.h
===================================================================
--- include/cpu.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ include/cpu.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -69,5 +69,9 @@
 };
 
-struct cpu_private_page {
+/*
+ * read/write by associated CPU
+ * read only by other CPUs
+ */
+struct cpu_private_data {
 	cpu_t *cpu;
 	thread_t *thread;
@@ -75,4 +79,5 @@
 };
 
+extern cpu_private_data_t *cpu_private_data;
 extern cpu_t *cpus;
 
Index: include/typedefs.h
===================================================================
--- include/typedefs.h	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ include/typedefs.h	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -31,5 +31,5 @@
 
 typedef struct config config_t;
-typedef struct cpu_private_page cpu_private_page_t;
+typedef struct cpu_private_data cpu_private_data_t;
 typedef struct cpu_info cpu_info_t;
 
Index: src/Makefile.config
===================================================================
--- src/Makefile.config	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ src/Makefile.config	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -12,5 +12,5 @@
 
 # Deadlock detection support for spinlocks.
-DEBUG_SPINLOCK=DEBUG_SPINLOCK
+#DEBUG_SPINLOCK=DEBUG_SPINLOCK
 
 # Uncomment if you want to run in the test mode
Index: src/cpu/cpu.c
===================================================================
--- src/cpu/cpu.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ src/cpu/cpu.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -40,6 +40,5 @@
 #include <list.h>
 
-cpu_private_page_t *the = NULL;
-
+cpu_private_data_t *cpu_private_data;
 cpu_t *cpus;
 
@@ -50,4 +49,8 @@
 	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)
@@ -55,4 +58,5 @@
 
 		/* 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);
     
@@ -71,20 +75,12 @@
 				list_initialize(&cpus[i].rq[j].rq_head);
 			}
+			
+			cpu_private_data[i].cpu = &cpus[i];
 		}
 		
-		the = (cpu_private_page_t *) frame_alloc(FRAME_KA | FRAME_PANIC);
-		memsetb((__address) the, PAGE_SIZE, 0);
 	#ifdef __SMP__
-	}
-	else {
-		__address frame;
-		
-		frame = frame_alloc(FRAME_KA | FRAME_PANIC);
-		memsetb(frame, PAGE_SIZE, 0);
-		map_page_to_frame((__address) the, frame, PAGE_CACHEABLE, 1);
 	}
 	#endif /* __SMP__ */
 	
-	CPU = &cpus[config.cpu_active-1];	
 	cpu_identify();
 	cpu_arch_init();
Index: src/main/main.c
===================================================================
--- src/main/main.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ src/main/main.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -104,4 +104,5 @@
 	arch_init();
 
+
 	printf("%s, %s\n", project, copyright);
 
Index: src/proc/thread.c
===================================================================
--- src/proc/thread.c	(revision 43114c515872442297f5b1b8a327743ef24c825a)
+++ src/proc/thread.c	(revision 8262010e7e7fe13508b9f3ccd85fc91dc8978f35)
@@ -100,5 +100,5 @@
 	i = (t->pri < RQ_COUNT -1) ? ++t->pri : t->pri;
 	
-	cpu = the->cpu;
+	cpu = CPU;
 	if (t->flags & X_WIRED) {
 		cpu = t->cpu;
