dragon-nx32: Optimized bank copy routine for fork
authorTormod Volden <debian.tormod@gmail.com>
Sun, 26 Apr 2015 16:50:01 +0000 (18:50 +0200)
committerAlan Cox <alan@linux.intel.com>
Sun, 26 Apr 2015 17:07:48 +0000 (18:07 +0100)
Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Kernel/platform-dragon-nx32/mem-nx32.s
Kernel/platform-dragon-nx32/tricks.s

index 39d7955..2a1ebf5 100644 (file)
@@ -14,6 +14,7 @@
        .globl map_process_always
        .globl map_save
        .globl map_restore
+       .globl copybank
 
        ; imported
        .globl _ramsize
@@ -96,6 +97,19 @@ map_restore
        lda map_store
        bra map_set_a
 
+; optimized bank copy for fork
+; src bank in A, dst bank in B, start in X, end in U
+copybank
+       stu cmpend+1    ; self-modiying code FTW
+copyf  sta banksel
+       ldu ,x
+       stb banksel
+       stu ,x++
+cmpend cmpx #0
+       blo copyf
+       stb map_copy
+       rts
+
 map_store      .db 0
 map_copy       .db 0
 
index d636a6c..ef6cbd6 100644 (file)
@@ -13,6 +13,7 @@
         .globl map_process
         .globl map_process_a
         .globl map_process_always
+        .globl copybank
 
        # exported
         .globl _switchout
@@ -207,15 +208,8 @@ fork_copy:
        ldb P_TAB__P_PAGE_OFFSET+1,x    ; new bank
        lda U_DATA__U_PAGE+1            ; old bank
        ldx #0x8000                     ; PROGBASE
-copyf:
-       jsr map_process_a
-       ldu ,x
-       exg a,b
-       jsr map_process_a       ; preserves A and B
-       stu ,x++
-       exg a,b
-       cmpx U_DATA__U_TOP
-       blo copyf
+       ldu U_DATA__U_TOP
+       jsr copybank            ; preserves A,B, clobbers X,U
 
 ; stash parent urea (including kernel stack)
        jsr map_process_a