Reboots after OR AL,1 MOV CR0, EAX on some computers.

2004-07-16 Thread breath
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
callreal_open_A20   ; For 32 bit address space
callreal_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  0x, 0x, 0x, 0x
.data   dw  0x, 0x, 0x9200, 0x00CF
.code   dw  0x, 0x, 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
[EMAIL PROTECTED]
___
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Reboots after OR AL,1 MOV CR0, EAX on some computers.

2004-07-16 Thread Sergey Zaharchenko
On Fri, Jul 16, 2004 at 12:32:24AM +0400,
 breath probably wrote:

 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.

Heh. The only thing I can think of right now is an interrupt not masked
by the cli you issued. You could try inserting a `mov ss, something'
just before the jump. This will prevent any processor from doing any
interrupts, as the immediately next instruction should be `mov sp,
something' (it was documented somewhere). Like

   mov eax, cr0
   or  al, 0x1 ; cr0 |= PE

mov dx, 0x8

   mov cr0, eax

mov ss, dx

   jmp 0x10: protected

snip

 .gdt0 dw  0x, 0x, 0x, 0x
 .data dw  0x, 0x, 0x9200, 0x00CF
 .code dw  0x, 0x, 0x9800, 0x00CF
 .gdtr dw  $ - .gdt0 - 1

And why `-1'?

   dd  .gdt0

You could also try adding CPUID's between all instructions for
synchronization, in case it's that kind of issue.

 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.

As soon as I have access to the 'puter with nasm, maybe.

P.S. Does booting DOS, and running a DOS-extended program succeed or
fail?

-- 
DoubleF
New York is real.  The rest is done with mirrors.


pgpl4lyIP4UZt.pgp
Description: PGP signature