[SeaBIOS] [PATCH 2/2] disk: Avoid stack_hop() path if already on the extra stack

Kevin O'Connor kevin at koconnor.net
Thu Mar 31 20:50:32 CEST 2016


If CONFIG_ENTRY_EXTRASTACK is set (enabled by default) then the 16bit
disk interface code is already running on the extra stack and it is
not necessary to support stack switching on each disk request.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/block.c |  4 ++++
 src/disk.c  | 12 ++++--------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/block.c b/src/block.c
index a383574..f7280cf 100644
--- a/src/block.c
+++ b/src/block.c
@@ -599,6 +599,10 @@ process_op_16(struct disk_op_s *op)
 int
 process_op(struct disk_op_s *op)
 {
+    dprintf(DEBUG_HDL_13, "disk_op d=%p lba=%d buf=%p count=%d cmd=%d\n"
+            , op->drive_gf, (u32)op->lba, op->buf_fl
+            , op->count, op->command);
+
     int ret, origcount = op->count;
     if (origcount * GET_GLOBALFLAT(op->drive_gf->blksize) > 64*1024) {
         op->count = 0;
diff --git a/src/disk.c b/src/disk.c
index bcd6a09..dc0427c 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -87,18 +87,12 @@ getLCHS(struct drive_s *drive_gf)
     return res;
 }
 
-// Execute a "disk_op_s" request - this runs on the extra stack.
+// Execute a "disk_op_s" request after jumping to the extra stack.
 static int
 __send_disk_op(struct disk_op_s *op_far, u16 op_seg)
 {
     struct disk_op_s dop;
-    memcpy_far(GET_SEG(SS), &dop
-               , op_seg, op_far
-               , sizeof(dop));
-
-    dprintf(DEBUG_HDL_13, "disk_op d=%p lba=%d buf=%p count=%d cmd=%d\n"
-            , dop.drive_gf, (u32)dop.lba, dop.buf_fl
-            , dop.count, dop.command);
+    memcpy_far(GET_SEG(SS), &dop, op_seg, op_far, sizeof(dop));
 
     int status = process_op(&dop);
 
@@ -115,6 +109,8 @@ send_disk_op(struct disk_op_s *op)
     ASSERT16();
     if (! CONFIG_DRIVES)
         return -1;
+    if (CONFIG_ENTRY_EXTRASTACK)
+        return process_op(op);
 
     return stack_hop(__send_disk_op, op, GET_SEG(SS));
 }
-- 
2.5.5




More information about the SeaBIOS mailing list