/* Save BIST result */ movl %eax, %ebp /* check if SPAD0 is cleared. If yes, it means this was a hard reset */ movl $0x800080d0, %eax movw $0xcf8, %dx outl %eax, %dx addw $4, %dx inl %dx, %eax cmp $0, %eax je no_reset /* perform hard reset */ movw $0xcf9, %dx movb $0x06, %al outb %al, %dx loop0: hlt jmp loop0 no_reset: /* Read the semaphore register of i5000 (BOFL0). If it returns zero, it means there was already another read by another CPU */ movl $0x800080c0, %eax movw $0xcf8, %dx outl %eax, %dx addw $4, %dx inl %dx, %eax cmp $0, %eax jne 1f /* degrade BSP to AP */ mov $0x1b, %ecx rdmsr andl $(~0x100), %eax wrmsr cli loop: hlt jmp loop 1: /* set magic value for soft reset detection */ movl $0x800080d0, %eax movw $0xcf8, %dx outl %eax, %dx addw $4, %dx movl $0x12345678, %eax outl %eax, %dx /* Restore BIST */ mov %ebp, %eax