Index: arch/ia32/src/asm.S
===================================================================
--- arch/ia32/src/asm.S	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia32/src/asm.S	(revision f8973c00ab95663b68ec2c542ab9e3bb2a84d454)
@@ -81,6 +81,13 @@
 	push %eax
 
-	# Test if this is interrupt with error word or not
-	movl $(1<<\i), %eax
+	/*
+	 * Test if this is interrupt with error word or not.
+	 * Be careful about width of the shift.
+	 */
+	.iflt \i-32
+		movl $(1<<\i), %eax
+	.else
+		movl $0, %eax
+	.endif
 	andl $ERROR_WORD_INTERRUPT_LIST,%eax
 
Index: arch/ia32/src/interrupt.c
===================================================================
--- arch/ia32/src/interrupt.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
+++ arch/ia32/src/interrupt.c	(revision f8973c00ab95663b68ec2c542ab9e3bb2a84d454)
@@ -50,19 +50,24 @@
 void (* eoi_function)(void) = NULL;
 
-#define PRINT_INFO_ERRCODE(istate) do { \
-	char *symbol = get_symtab_entry(istate->eip); \
-	if (!symbol) \
-		symbol = ""; \
-	printf("----------------EXCEPTION OCCURED----------------\n"); \
-	printf("%%eip: %X (%s)\n",istate->eip,symbol); \
-	printf("ERROR_WORD=%X\n", istate->error_word); \
-	printf("%%cs=%X,flags=%X\n", istate->cs, istate->eflags); \
-	printf("%%eax=%X, %%ebx=%X, %%ecx=%X, %%edx=%X\n",\
-	       istate->eax,istate->ebx,istate->ecx,istate->edx); \
-	printf("%%esi=%X, %%edi=%X, %%ebp=%X, %%esp=%X\n",\
-	       istate->esi,istate->edi,istate->ebp,istate->esp); \
-	printf("stack: %X, %X, %X, %X\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); \
-	printf("       %X, %X, %X, %X\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); \
-} while(0)
+static void PRINT_INFO_ERRCODE(istate_t *istate)
+{
+	char *symbol = get_symtab_entry(istate->eip);
+
+	if (!symbol)
+		symbol = "";
+
+	if (CPU)
+		printf("----------------EXCEPTION OCCURED (cpu%d)----------------\n", CPU->id);
+	else
+		printf("----------------EXCEPTION OCCURED----------------\n");
+		
+	printf("%%eip: %X (%s)\n",istate->eip,symbol);
+	printf("ERROR_WORD=%X\n", istate->error_word);
+	printf("%%cs=%X,flags=%X\n", istate->cs, istate->eflags);
+	printf("%%eax=%X, %%ebx=%X, %%ecx=%X, %%edx=%X\n",  istate->eax,istate->ebx,istate->ecx,istate->edx);
+	printf("%%esi=%X, %%edi=%X, %%ebp=%X, %%esp=%X\n",  istate->esi,istate->edi,istate->ebp,istate->esp);
+	printf("stack: %X, %X, %X, %X\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]);
+	printf("       %X, %X, %X, %X\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]);
+}
 
 void null_interrupt(int n, istate_t *istate)
