Reboots after ''OR AL,1 MOV CR0, EAX'' on some computers.
john at essenz.com
john at essenz.com
Fri Jul 16 09:24:24 PDT 2004
Ha...
I thought this email was spam, with a subject resembling ORAL MOVIES !!
-john
----------------------------------------------------
>From : breath <breath at unix.net>
To : freebsd-hackers at freebsd.org
Subject : Reboots after "OR AL,1 MOV CR0, EAX" on some computers.
Date : Fri, 16 Jul 2004 00:34:46 +0400
> Hi. I need some help. I think you'll be interested. I develop a little
OS
> that will boot from floppy. It's still under construction and has about
> five thousand lines of assembly source now. I use Bochs emulator to
debug
> it and after that I test it on my real computer. I have all working
> correctly on my compter. But I started to test it around other machines
> recently and encountered a problem I can't solve. But I'm sure there are
> lot of minds in FreeBSD world who know how to help me. I can't figure
out
> what happens because on my computer I get all things well, but I can't
> conduct test of this kind on other computers.
>
> Here is the problem. My OS's boot loader (after loading the main module)
> switches CPU to very limited protected mode and jumps to module's entry
> point. After it, main module reloads all tables like GDT etc to make a
> good free environment for initialization and further running. Shortly:
ON
> SOME COMPUTERS (MAYBE CPUS) I GET REBOOTING JUST ON 'JMP' INSTRUCTION
> AFTER PE BIT IS ENABLED. I've got no reboots on all i386, i486, i586
> computers that I tryed to boot from. I have a Pentium III Celeron
> (Coppermine) 900MHz - no reboots. Also tested on some Pentium II 400MHz
-
> no reboots. But on other side Pentium IV (don't remember speed) gave me
a
> reboot. And other computer I was not able to see processor model (maybe
> PentiumIV !?) gave me a reboot too. Using endless loop stop points I
> figured out that reboot is before any instruction pointed by 'protected'
> label and that reboot happens after setting the PE bit.
>
> Here's very diminished boot sector code that reflects the error. It must
> be compiled with nasm as a binary so that result will be a floppy disk
> image file. Then it must be written to a floppy from scratch (from boot
> sector). Created floppy is expected to be bootable disk.
>
> Normal:
> When you boot from the floppy you get something like black screen and
> computer hangs up (but not reboots)
>
> Abnormal:
> When you boot from the floppy you get a screen splash and then back to
> reboot POST procedure.
>
> Here goes the code. PLEASE, even if you're not interested in this
> 'puzzle':( MAKE AND TEST IT ON YOUR COMPUTER. EMAIL ME RESULTS AND
> COMPUTER MODEL.
>
> It was HARD work to make this OS. I believe that some people understand
me
> and will give me a clue. From my side I'll show them the full version.
>
> ;---------------------------------------------------------------------
>
> ; Compile: %nasm thisfile.asm -o fd
> ; Insert a floppy
> ; Write (as root): #dd if=fd of=/dev/fd0
>
> org 0x7C00 ; Expecting to be loaded at 7C00 by BIOS
>
> bits 16
>
> real:
> cli
> xor ax, ax
> mov ss, ax
> mov sp, 0x7C00 ; Temp stack just under myself
>
> call real_open_A20 ; For 32 bit address space
> call real_init_gdt ; Load GDTR
>
> mov eax, cr0
> or al, 0x1 ; cr0 |= PE
> mov cr0, eax
> ; If I place 'jmp $' here all computers stop here normally
> jmp 0x10: protected
>
> real_open_A20:
> .l1: in al, 0x64
> test al, 0x2
> jnz .l1
> mov al, 0xD1
> out 0x64, al
> .l2: in al, 0x64
> test al, 0x2
> jnz .l2
> mov al, 0xDF
> out 0x60, al
> ret
>
> real_init_gdt:
> lgdt [.gdtr]
> ret
> .gdt0 dw 0x0000, 0x0000, 0x0000, 0x0000
> .data dw 0xFFFF, 0x0000, 0x9200, 0x00CF
> .code dw 0xFFFF, 0x0000, 0x9800, 0x00CF
> .gdtr dw $ - .gdt0 - 1
> dd .gdt0
>
> bits 32
>
> protected:
> ; Wherever I place 'jmp $' after the 'protected' label,
> ; on some computers I get reboot to hell.
> ; (In that case CS:IP is never points to 'jmp $'
> ; - something happens before)
> mov ax, 0x8
> mov ds, ax
> mov es, ax
> mov fs, ax
> mov gs, ax
> mov ss, ax
> mov esp, 0x7C00
> jmp $
>
> times 512 - 2 - ($ - $$) db 0 ; Fill the rest of sector
> dw 0xAA55 ; Bootable sector sign
>
> times 1474560 - ($ - $$) db 0 ; Fill the rest of floppy
>
> ;---------------------------------------------------------------------
>
> Best regards,
> Yuri Grebenkin
> breath at unix.net
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to
"freebsd-hackers-unsubscribe at freebsd.org"
More information about the freebsd-hackers
mailing list