Page 1 of 1

Console implemtation based on VESA

Posted: Thu Apr 07, 2005 12:27 pm
by amirsadig
I have implement a TTY console which can work with normal text mode or VESA mode. my kernel during initialization read all available VESA mode. this done by activate real mode and call 16 bit code which do all the work I need to access VESA in real mode. so I am not depending of any other tool to set for the VBE mode I need.

everything in BUCHS & VMWARE work as expected, but in real PC my kernel it crash with traditional error ;D (page fault) #14 after reading VBE modes (I have not yet set the video mode example 800x600).
when deactivate VBE in my kernel and use only the text mode, every thing work fine.

have someone any issues I should notice with VESA and the real PC when developing with it?
which mechanism you use to support VESA in your kernel?

Re:Console implemtation based on VESA

Posted: Thu Apr 07, 2005 12:37 pm
by DruG5t0r3
So if I understand well, after coming back from real mode after getting all the available VESA modes you get a Page fault?. Most probably means that you are accessing or executing code/data that isn't mapped by your page table. Or maybe you didn't reinitialise paging properly. My guess is that you stored all those VESA modes somewhere in memory and that when in Protected mode you try to access them you get page fault.

Re:Console implemtation based on VESA

Posted: Thu Apr 07, 2005 12:58 pm
by amirsadig
maybe you didn't reinitialise paging properly. My guess is that you stored all those VESA modes somewhere in memory and that when in Protected mode you try to access them you get page fault.
I can't guess this, because I got all modes and I list (print it on screen) the wanted mode , all this happend in protected mode with paging enabled.
as I said in BUCHS & VMWARE using VESA work fine,

Re:Console implemtation based on VESA

Posted: Thu Apr 07, 2005 1:58 pm
by amirsadig
here is the 32/16 code I use to get/set the video mode. this code are loaded by boot loader and my kernel move it then to address x1000. did I done somewrong? note that in my kernel this code has been called to twice one time to get modes and secondly to set modes and both has been executed successfully, after that page faul appear!

Code: Select all

org     0x1000  
SECTION .text

[BITS 32]
vbe_main
      ;push eax
      ;cli
; ------ Ensure that code- and stack-segment limits are 64KB.
      push    ebx
      push   ecx
      mov   ebx,eax
      mov   eax, 40h
      mov   ss, eax
      jmp   dword 38h:return.2
return:
      pop     ecx
      pop     ebx
      retf
[BITS 16]
; ------ Disable protected mode; jump to real-mode segment.
    .2:
      mov   eax, cr0
                and   eax, 0xFE
                mov   cr0, eax
                jmp   word 0x00:.3
; ------ Load stack- and data-segment registers
; ------ with proper real-mode segment numbers.
   .3:      
         xor   ax, ax
           mov   ds, ax
      mov   es, ax
      mov   fs, ax
      mov   gs, ax
      ;mov   ax, 0x1000
       mov   ss, ax
      ;mov sp,0xFFF8      ; Load IP SI DI SP BP
      ;xor bp,bp
      sidt [idt_ptr1]
      lidt [idt_ptr]
      cmp   bx, 1
      je      get_mode
      cmp   bx, 2
      je      set_mode
      jmp   return_pm

get_mode:
      mov    ax, 4F01h
      ;mov    cx, 140h
      mov    di, 2000h
      int    10h
      jmp   return_pm
set_mode:
      mov    ax, 4F02h
      mov    bx, cx
      int    10h
      jmp   return_pm
get_pixel_clock:
      mov    ax, 4F0Bh
      mov    bx, cx
      int    10h
      jmp   return_pm
return_pm:
; return to PM

      mov   eax, cr0
      or   al, 1
      mov   cr0, eax
      ;lidt [idt_ptr1]
      mov    ax,10h
      mov    ds,ax
      mov    es,ax
      mov    ss,ax
      mov    fs,ax
      mov    gs,ax
      ;mov eax, [ptr_code]
      jmp    0x18:return
      
SECTION .data      
idt_ptr:
   dw 0xFFFF      ; IDT limit
   dd 0
idt_ptr1:
   dw 0xFFFF      ; IDT limit
   dd 0
 
here the code in my kernel which jump to my real mode code

Code: Select all

vbe_real_code:
      push ebp
      mov ebp, esp
      mov eax, [ebp+8]
      mov ecx, [ebp+12]
      call   0x18:0x1000
      lgdt [gdt_ptr]
      lidt [idt_ptr]
      pop ebp
      retn
I am note a assemply programmer :D

Re:Console implemtation based on VESA

Posted: Thu Apr 07, 2005 5:29 pm
by amirsadig
I have catch my problem :-[. it is also as usual ;a forgotten code I have done before a while. normaly my kernel use the address oxD0000000 as start for HEAP and memory management for kernel. unfortuantly my graphic card uses this address also as their physical address of framebuffer. what I do always, is maping this framebuffer to a virtual address equal to framebuffer address. in this my kernel is currupted and thus I fall on page fault.
secondly after switch to realmode and go back to pmode I should reinitialize PIC again, or timer and keyboard and FDC doesn't work. this happend only on my real PC. :'(

Re:Console implemtation based on VESA

Posted: Fri Apr 08, 2005 11:37 am
by Dex4u
I call these functions on going and coming back from realmode to sort the pic problem
This one on going to realmode:

Code: Select all

mask_irqs:
        cli
        mov  al,255       ; mask all irqs
        out  0xa1,al
        out  0x21,al
        ret
and on return this:

Code: Select all

unmask_irqs:
        mov  al,0         ; unmask irq's
        out  0xa1,al
        out  0x21,al
        sti
        ret
I have made a demo for going to and from realmode and enable vesa, with asm code, if you want to take a look let me know.
Note: No paging is implemented.

Re:Console implemtation based on VESA

Posted: Fri Apr 08, 2005 4:38 pm
by amirsadig
many thanks.
I have got VESA to run on any 32 bits mode. I also added to it 7 virtual console, all console now support some sort of posix terminal specification and application can control their terminal throw termios structure (throw syscall).
I will devide my consoles such as 1 for kernel shell (adminstrative shell) and console 2 .. 4 for text mode applications and console 5 will be the GUI, which I study now how to implement it.

Re:Console implemtation based on VESA

Posted: Mon Apr 11, 2005 2:59 am
by Pointer
Dex4u wrote: I call these functions on going and coming back from realmode to sort the pic problem
This one on going to realmode:

Code: Select all

mask_irqs:
        cli
        mov  al,255       ; mask all irqs
        out  0xa1,al
        out  0x21,al
        ret
and on return this:

Code: Select all

unmask_irqs:
        mov  al,0         ; unmask irq's
        out  0xa1,al
        out  0x21,al
        sti
        ret
I have made a demo for going to and from realmode and enable vesa, with asm code, if you want to take a look let me know.
Note: No paging is implemented.
I would be interested in that.

Re:Console implemtation based on VESA

Posted: Mon Apr 11, 2005 11:46 am
by Dex4u
You can get it here: http://board.flatassembler.net/topic.php?p=22043#22043

Its called "VesaDemo.zip"

Re:Console implemtation based on VESA

Posted: Sat Feb 23, 2008 11:43 am
by Wave
Dex4u wrote:You can get it here: http://board.flatassembler.net/topic.php?p=22043#22043

Its called "VesaDemo.zip"
For some reason that only shows me that I'm in text mode when I test it in VMware. What is wrong?

Posted: Sat Feb 23, 2008 1:15 pm
by lukem95
could you not have messaged him rather than dragging up a topic over two years old?

Re:Console implemtation based on VESA

Posted: Sat Feb 23, 2008 2:41 pm
by Dex
Wave wrote:
Dex4u wrote:You can get it here: http://board.flatassembler.net/topic.php?p=22043#22043

Its called "VesaDemo.zip"
For some reason that only shows me that I'm in text mode when I test it in VMware. What is wrong?
I have not tested it in VMware, it works fine in broch or qemu or real pc.
It will most likely be that VMware will need setting to use vesa, have you used vesa in VMware before ?.

Posted: Sat Feb 23, 2008 4:13 pm
by Wave
Not my own code. But other ("real") vesa drivers work.