[SeaBIOS] [PATCH 2/2] swcursor: Concentrate swcursor logic in swcursor.c

Kevin O'Connor kevin at koconnor.net
Fri Aug 5 16:44:17 CEST 2016


The software cursor code is not frequently used (only the coreboot
framebuffer vga code uses it).  Move its logic out of the main code
and into swcursor.c.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 vgasrc/swcursor.c | 37 +++++++++++++++++++++++++++++++++----
 vgasrc/vgabios.c  |  8 ++------
 vgasrc/vgabios.h  |  5 +++--
 vgasrc/vgafb.c    |  5 -----
 vgasrc/vgainit.c  |  4 +---
 5 files changed, 39 insertions(+), 20 deletions(-)

diff --git a/vgasrc/swcursor.c b/vgasrc/swcursor.c
index 35f857a..83f4822 100644
--- a/vgasrc/swcursor.c
+++ b/vgasrc/swcursor.c
@@ -5,6 +5,7 @@
 // This file may be distributed under the terms of the GNU LGPLv3 license.
 
 #include "biosvar.h" // GET_BDA
+#include "bregs.h" // struct bregs
 #include "vgabios.h" // handle_gfx_op
 
 // Draw/undraw a cursor on the framebuffer by xor'ing the cursor cell
@@ -32,11 +33,9 @@ gfx_set_swcursor(struct vgamode_s *vmode_g, int enable, struct cursorpos cp)
 }
 
 // Draw/undraw a cursor on the screen
-void
-vgafb_set_swcursor(int enable)
+static void
+set_swcursor(int enable)
 {
-    if (!vga_emulate_text())
-        return;
     u8 flags = GET_BDA_EXT(flags);
     if (!!(flags & BF_SWCURSOR) == enable)
         // Already in requested mode.
@@ -63,3 +62,33 @@ vgafb_set_swcursor(int enable)
     attr = (attr >> 4) | (attr << 4);
     SET_FARVAR(GET_GLOBAL(vmode_g->sstart), *(u8*)dest_far, attr);
 }
+
+// Disable virtual cursor if a vgabios call accesses the framebuffer
+void
+swcursor_pre_handle10(struct bregs *regs)
+{
+    if (!vga_emulate_text())
+        return;
+    switch (regs->ah) {
+    case 0x4f:
+        if (!CONFIG_VGA_VBE || regs->al != 0x02)
+            break;
+        // NO BREAK
+    case 0x00 ... 0x02:
+    case 0x05 ... 0x0e:
+    case 0x13:
+        set_swcursor(0);
+        break;
+    default:
+        break;
+    }
+}
+
+// Called by periodic (18.2hz) timer
+void
+swcursor_check_event(void)
+{
+    if (!vga_emulate_text())
+        return;
+    set_swcursor(GET_BDA(timer_counter) % 18 < 9);
+}
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 2c8cc79..4e897c4 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -74,7 +74,6 @@ get_cursor_shape(void)
 static void
 set_cursor_shape(u16 cursor_type)
 {
-    vgafb_set_swcursor(0);
     SET_BDA(cursor_type, cursor_type);
     if (CONFIG_VGA_STDVGA_PORTS)
         stdvga_set_cursor_shape(get_cursor_shape());
@@ -89,7 +88,6 @@ set_cursor_pos(struct cursorpos cp)
 
     if (cp.page == GET_BDA(video_page)) {
         // Update cursor in hardware
-        vgafb_set_swcursor(0);
         if (CONFIG_VGA_STDVGA_PORTS)
             stdvga_set_cursor_pos((int)text_address(cp));
     }
@@ -118,8 +116,6 @@ 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);
@@ -268,8 +264,6 @@ 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)
         return ret;
@@ -1103,6 +1097,8 @@ void VISIBLE16
 handle_10(struct bregs *regs)
 {
     debug_enter(regs, DEBUG_VGA_10);
+    swcursor_pre_handle10(regs);
+
     switch (regs->ah) {
     case 0x00: handle_1000(regs); break;
     case 0x01: handle_1001(regs); break;
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index 9764020..ffbb729 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -134,7 +134,9 @@ void vgafb_write_pixel(u8 color, u16 x, u16 y);
 u8 vgafb_read_pixel(u16 x, u16 y);
 
 // swcursor.c
-void vgafb_set_swcursor(int enable);
+struct bregs;
+void swcursor_pre_handle10(struct bregs *regs);
+void swcursor_check_event(void);
 
 // vbe.c
 extern u32 VBE_total_memory;
@@ -145,7 +147,6 @@ extern u16 VBE_win_granularity;
 #define VBE_VENDOR_STRING "SeaBIOS Developers"
 #define VBE_PRODUCT_STRING "SeaBIOS VBE Adapter"
 #define VBE_REVISION_STRING "Rev. 1"
-struct bregs;
 void handle_104f(struct bregs *regs);
 
 #endif // vgabios.h
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index 46a1ab8..57ecc9b 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -504,7 +504,6 @@ vgafb_write_pixel(u8 color, u16 x, u16 y)
     struct vgamode_s *vmode_g = get_current_mode();
     if (!vmode_g)
         return;
-    vgafb_set_swcursor(0);
 
     struct gfx_op op;
     init_gfx_op(&op, vmode_g);
@@ -529,7 +528,6 @@ vgafb_read_pixel(u16 x, u16 y)
     struct vgamode_s *vmode_g = get_current_mode();
     if (!vmode_g)
         return 0;
-    vgafb_set_swcursor(0);
 
     struct gfx_op op;
     init_gfx_op(&op, vmode_g);
@@ -599,7 +597,6 @@ void
 vgafb_scroll(struct cursorpos win, struct cursorpos winsize
              , int lines, struct carattr ca)
 {
-    vgafb_set_swcursor(0);
     if (!lines) {
         // Clear window
         vgafb_clear_chars(win, winsize, ca);
@@ -630,7 +627,6 @@ vgafb_write_char(struct cursorpos cp, struct carattr ca)
     struct vgamode_s *vmode_g = get_current_mode();
     if (!vmode_g)
         return;
-    vgafb_set_swcursor(0);
 
     if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT) {
         gfx_write_char(vmode_g, cp, ca);
@@ -653,7 +649,6 @@ vgafb_read_char(struct cursorpos cp)
     struct vgamode_s *vmode_g = get_current_mode();
     if (!vmode_g)
         return (struct carattr){0, 0, 0};
-    vgafb_set_swcursor(0);
 
     if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT)
         return gfx_read_char(vmode_g, cp);
diff --git a/vgasrc/vgainit.c b/vgasrc/vgainit.c
index 40997db..6249e66 100644
--- a/vgasrc/vgainit.c
+++ b/vgasrc/vgainit.c
@@ -96,9 +96,7 @@ struct segoff_s Timer_Hook_Resume VAR16 VISIBLE16;
 void VISIBLE16
 handle_timer_hook(void)
 {
-    if (!vga_emulate_text())
-        return;
-    vgafb_set_swcursor(GET_BDA(timer_counter) % 18 < 9);
+    swcursor_check_event();
 }
 
 static void
-- 
2.5.5




More information about the SeaBIOS mailing list