wei@hpctdls.HP.COM (Bill Ives) (04/13/89)
I have written code to switch an AT class machine ( namely an HP ES/12 ) to protected mode and back. I manage to get into protected mode and even am able to set up valid descriptors in my global discriptor table -- for writing directly to the screen etc. I have not as yet set up a task state segment since I do not intend to switch to another task. For lack of anything better to do when I have finished with my tests -- I have paused with wait loops then triggered a reset via int 0 -- this works since I was nulling out my interrupt descritor table register. In the hopes of avoiding this reset time ( and because I know its possible ) I have modified my code to switch back to real mode in a more graceful manner -- namely via the shut-down vector for a soft-reset. The procedure for this is as follows: In real mode at start of program move target address(seg:off) for return from protected mode into address 40h:67h. set cmos shut-down byte ( cmos addr 0fh ) to 5 so that the reset jumps via the address at 40h:67h when returning to real mode. disable the keyboard interface controller so that it does not interrupt while in protected mode. This is the 8041 chip, and is accomplished by writting 0adh to port 64h. move into protected mode by switching PE bit and setting up IDT to null. I do not set up the GDTR or LDTR for this simple case since I immediately switch back to real mode. In protected mode print out message saying I made it. ( this works ) enable address line 20 ( for use in prot mode ) by using 8041 again. write 0dfh to port 64h. force shut-down reset to return to real mode by pulsing the system reset line using the 8041. write 0f7h to port 64h target for return from protected mode. disable interrupts retore stack etc. disable address line 20 for real mode. write 0ddh to port 64h enable keyboard interface. write 0aeh to port 64h see if keyboard is okay by issuing self test command to the 8041 - write 0aah to 64h then look for 55h in port 60h ( the self test report no problem ) enable interrupts restore cmos shut-down byte so that next reset causes POST to occur. return to DOS via int 20h The current behavior shows the DOS prompt returning to the screen then locks up the system. At first I thought it was the keyboard controller not being correctly configured - but the selftest checked this as well as a keyboard power-on reset command I issued to the 8041. I also thought it might be the interrupt controllers -- namely the 8259s, but when I included initialization code for them after the return to real mode, the system not only hung - but its entire CMOS was blanked out. I have attempted to eliminate the interrupt problem in protected mode by nulling out the IDTR as well as disabling interrupts for the entire time I was in protected mode. I do not write to any memory - other than screen memory - while in prot mode so I believe the real mode interrupt vector table should be uncorrupted -- my return to DOS via int 20h and the subsequent display of the DOS prompt lead me to believe the table is okay. As an aside, my code is written in COM file format and like I said earlier all my prot mode stuff works fine in a more complete version of this code - I took out the test stuff to simplify this code. Any help from anyone with experience doing this switch would be greatly appreciated. If it has been covered before -- I'm sorry. Postings to this news group or mail is fine -- I do read this group nearly everyday. Sorry for the long note too... Thanx Bill Ives HP CTD