[SeaBIOS] [PATCH 1/2] vgabios: Add stubs for software cursor enable/disable

Kevin O'Connor kevin at koconnor.net
Sat Oct 18 20:56:24 CEST 2014


Add stub function vgafb_set_swcursor(), and add calls to it any place
that may read/write the framebuffer or may modify the cursor
shape/position.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 vgasrc/vgabios.c | 38 +++++++++++++++++++++++++++++++++-----
 vgasrc/vgabios.h |  1 +
 vgasrc/vgafb.c   |  5 +++++
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 8ec6aa6..85a060e 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -56,9 +56,13 @@ set_cursor_shape(u8 start, u8 end)
     start &= 0x3f;
     end &= 0x1f;
 
+    vgafb_set_swcursor(0);
+
     u16 curs = (start << 8) + end;
     SET_BDA(cursor_type, curs);
 
+    vgafb_set_swcursor(1);
+
     if (!CONFIG_VGA_STDVGA_PORTS)
         return;
 
@@ -134,6 +138,8 @@ set_active_page(u8 page)
     if (!vmode_g)
         return;
 
+    vgafb_set_swcursor(0);
+
     // Calculate memory address of start of page
     struct cursorpos cp = {0, 0, page};
     int address = (int)text_address(cp);
@@ -147,6 +153,8 @@ set_active_page(u8 page)
 
     // Display the cursor, now the page is active
     set_cursor_pos(get_cursor_pos(page));
+
+    vgafb_set_swcursor(1);
 }
 
 static void
@@ -287,9 +295,13 @@ vga_set_mode(int mode, int flags)
     if (!vmode_g)
         return VBE_RETURN_STATUS_FAILED;
 
+    vgafb_set_swcursor(0);
+
     int ret = vgahw_set_mode(vmode_g, flags);
-    if (ret)
+    if (ret) {
+        vgafb_set_swcursor(1);
         return ret;
+    }
 
     // Set the BIOS mem
     int width = GET_GLOBAL(vmode_g->width);
@@ -348,6 +360,7 @@ vga_set_mode(int mode, int flags)
         break;
     }
 
+    vgafb_set_swcursor(1);
     return 0;
 }
 
@@ -386,7 +399,9 @@ static void
 handle_1002(struct bregs *regs)
 {
     struct cursorpos cp = {regs->dl, regs->dh, regs->bh};
+    vgafb_set_swcursor(0);
     set_cursor_pos(cp);
+    vgafb_set_swcursor(1);
 }
 
 static void
@@ -426,6 +441,7 @@ verify_scroll(struct bregs *regs, int dir)
     if (wincols <= 0 || winrows <= 0)
         return;
 
+    vgafb_set_swcursor(0);
     u8 page = GET_BDA(video_page);
     int clearlines = regs->al, movelines = winrows - clearlines;
     if (!clearlines || movelines <= 0) {
@@ -434,10 +450,7 @@ verify_scroll(struct bregs *regs, int dir)
         struct carattr attr = {' ', regs->bh, 1};
         struct cursorpos clrsize = {wincols, winrows};
         vgafb_clear_chars(clr, attr, clrsize);
-        return;
-    }
-
-    if (dir > 0) {
+    } else if (dir > 0) {
         // Normal scroll
         struct cursorpos dest = {ulx, uly, page};
         struct cursorpos src = {ulx, uly + clearlines, page};
@@ -460,6 +473,7 @@ verify_scroll(struct bregs *regs, int dir)
         struct cursorpos clrsize = {wincols, clearlines};
         vgafb_clear_chars(clr, attr, clrsize);
     }
+    vgafb_set_swcursor(1);
 }
 
 static void
@@ -477,9 +491,11 @@ handle_1007(struct bregs *regs)
 static void
 handle_1008(struct bregs *regs)
 {
+    vgafb_set_swcursor(0);
     struct carattr ca = vgafb_read_char(get_cursor_pos(regs->bh));
     regs->al = ca.car;
     regs->ah = ca.attr;
+    vgafb_set_swcursor(1);
 }
 
 static void noinline
@@ -487,9 +503,11 @@ handle_1009(struct bregs *regs)
 {
     struct carattr ca = {regs->al, regs->bl, 1};
     struct cursorpos cp = get_cursor_pos(regs->bh);
+    vgafb_set_swcursor(0);
     int count = regs->cx;
     while (count--)
         write_char(&cp, ca);
+    vgafb_set_swcursor(1);
 }
 
 static void noinline
@@ -497,9 +515,11 @@ handle_100a(struct bregs *regs)
 {
     struct carattr ca = {regs->al, regs->bl, 0};
     struct cursorpos cp = get_cursor_pos(regs->bh);
+    vgafb_set_swcursor(0);
     int count = regs->cx;
     while (count--)
         write_char(&cp, ca);
+    vgafb_set_swcursor(1);
 }
 
 
@@ -540,14 +560,18 @@ static void
 handle_100c(struct bregs *regs)
 {
     // XXX - page (regs->bh) is unused
+    vgafb_set_swcursor(0);
     vgafb_write_pixel(regs->al, regs->cx, regs->dx);
+    vgafb_set_swcursor(1);
 }
 
 static void
 handle_100d(struct bregs *regs)
 {
     // XXX - page (regs->bh) is unused
+    vgafb_set_swcursor(0);
     regs->al = vgafb_read_pixel(regs->cx, regs->dx);
+    vgafb_set_swcursor(1);
 }
 
 static void noinline
@@ -557,8 +581,10 @@ handle_100e(struct bregs *regs)
     // We do output only on the current page !
     struct carattr ca = {regs->al, regs->bl, 0};
     struct cursorpos cp = get_cursor_pos(0xff);
+    vgafb_set_swcursor(0);
     write_teletype(&cp, ca);
     set_cursor_pos(cp);
+    vgafb_set_swcursor(1);
 }
 
 static void
@@ -1040,6 +1066,7 @@ handle_1013(struct bregs *regs)
     else
         cp = (struct cursorpos) {regs->dl, regs->dh, regs->bh};
 
+    vgafb_set_swcursor(0);
     u16 count = regs->cx;
     u8 *offset_far = (void*)(regs->bp + 0);
     u8 attr = regs->bl;
@@ -1057,6 +1084,7 @@ handle_1013(struct bregs *regs)
 
     if (regs->al & 1)
         set_cursor_pos(cp);
+    vgafb_set_swcursor(1);
 }
 
 
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index fc8d45a..e07309a 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -131,6 +131,7 @@ void vgafb_write_char(struct cursorpos cp, struct carattr ca);
 struct carattr vgafb_read_char(struct cursorpos cp);
 void vgafb_write_pixel(u8 color, u16 x, u16 y);
 u8 vgafb_read_pixel(u16 x, u16 y);
+void vgafb_set_swcursor(int enable);
 
 // vbe.c
 extern u32 VBE_total_memory;
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index 9652683..f179584 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -595,3 +595,8 @@ fail: ;
     struct carattr ca2 = {0, 0, 0};
     return ca2;
 }
+
+void
+vgafb_set_swcursor(int enable)
+{
+}
-- 
1.9.3




More information about the SeaBIOS mailing list