wok annotate linld/stuff/src/JUMP.ASM @ rev 19900

linld/tazboot: memcpy32 bug workaround
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Apr 08 18:04:44 2017 +0200 (2017-04-08)
parents 9e8f9b54bd83
children 485b1db348fd
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@19515 5 %crefref
pascal@19515 6 %noincl
pascal@19515 7 %nomacs
pascal@19636 8 ifdef NO386
pascal@19636 9 p8086
pascal@19636 10 else
pascal@19515 11 p386
pascal@19636 12 endif
pascal@19515 13
pascal@19515 14 group DGROUP _TEXT,_BSS
pascal@19515 15 assume cs:DGROUP,ds:DGROUP
pascal@19515 16
pascal@19515 17 segment _BSS byte public use16 'BSS'
pascal@19515 18
pascal@19899 19 global _imgs:dword
pascal@19515 20
pascal@19515 21 ends _BSS
pascal@19515 22
pascal@19515 23
pascal@19515 24 segment _TEXT byte public use16 'CODE'
pascal@19515 25
pascal@19515 26 ;***************************************************************
pascal@19571 27 ;void set_sregs_jump_seg_ofs(u32 csip);
pascal@19515 28 ;****** Never returns
pascal@19515 29 ;***************************************************************
pascal@19515 30 global _set_sregs_jump_seg_ofs:near
pascal@19515 31 proc _set_sregs_jump_seg_ofs near
pascal@19515 32
pascal@19515 33 extrn dos_shutdown:near
pascal@19515 34
pascal@19571 35 ifdef NO386
pascal@19571 36 extrn _topseg:near
pascal@19571 37 call near _topseg
pascal@19571 38 mov es,ax
pascal@19637 39 xchg ax,bx
pascal@19571 40 else
pascal@19571 41 push 9000h
pascal@19571 42 pop es
pascal@19571 43 endif
pascal@19636 44 cli ; we start doing destructive things to DOS
pascal@19571 45 push es
pascal@19571 46 pop ss
pascal@19571 47 mov sp,0A000h
pascal@19900 48 extrn _csip:dword
pascal@19900 49 push [dword _csip]
pascal@19636 50 extrn _rm_size:word
pascal@19636 51 mov si,offset _rm_size ; _rm_size, _pm_high, _rm_buf
pascal@19636 52 lodsw
pascal@19636 53 xchg ax,cx ; _rm_size
pascal@19636 54 lodsb ; _pm_high
pascal@19636 55 mov si,[si] ; _rm_buf
pascal@19571 56 xor di,di
pascal@19571 57 ;cld
pascal@19571 58 rep
pascal@19571 59 movsb
pascal@19571 60 extrn _cmdline:word
pascal@19571 61 mov si,[_cmdline]
pascal@19571 62 mov di,8000h
pascal@19571 63 mov ch,10h ; 4k
pascal@19571 64 rep
pascal@19571 65 movsb
pascal@19636 66 cmp al,cl ; load high ?
pascal@19515 67 jne isbzimage
pascal@19637 68 ifdef NO386
pascal@19637 69 add bh,9
pascal@19637 70 push bx ; topseg()+0x0900
pascal@19637 71 else
pascal@19637 72 push 9900h ; 4096 bytes for cmdline
pascal@19637 73 ;push 9820h ; 512 bytes for cmdline
pascal@19637 74 endif
pascal@19515 75 ; finish loading
pascal@19515 76 extrn @last_ditch$qv:near
pascal@19515 77 push cs
pascal@19515 78 call @last_ditch$qv
pascal@19899 79 mov ax,[word _imgs+2+2] ; get pm->fallback high word
pascal@19515 80 ; self move
pascal@19571 81 ;cld
pascal@19538 82 pop es ; min 2048 bytes for stack
pascal@19538 83 xor si,si ; A000 -9000 -0800(>movedend)
pascal@19515 84 xor di,di ; set ZF
pascal@19538 85 mov cx,offset movedend
pascal@19515 86 global _bss_end:byte
pascal@19538 87 ;mov cx,offset _bss_end
pascal@19515 88 rep
pascal@19515 89 movsb
pascal@19515 90 push es
pascal@19515 91 call near doretf ; mov cs,es
pascal@19571 92 push ss
pascal@19571 93 pop es
pascal@19515 94 push cs
pascal@19515 95 pop ds
pascal@19571 96 push ax
pascal@19515 97 call near dos_shutdown
pascal@19538 98 ;in al,70h
pascal@19538 99 ;or al,80h ; disable NMI
pascal@19538 100 ;out 70h,al
pascal@19538 101 pop bx
pascal@19515 102 ; move zImage pm
pascal@19515 103 mov ax,8
pascal@19900 104 cwd ; clear dx
pascal@19515 105 cmp bx,ax
pascal@19538 106 ja bufhigh
pascal@19515 107 sub ax,bx
pascal@19515 108 inc ax
pascal@19515 109 bufhigh:
pascal@19515 110 push ax
pascal@19515 111 push dx ; size=up to 512k
pascal@19515 112 push bx ; src ofs= pm.fallback
pascal@19515 113 push dx
pascal@19515 114 push dx ; srcseg=0
pascal@19636 115 ifdef NO386
pascal@19636 116 inc dx
pascal@19636 117 push dx ; dst
pascal@19636 118 dec dx
pascal@19636 119 else
pascal@19636 120 push 1 ; dst
pascal@19636 121 endif
pascal@19515 122 push dx ; ofs=64k
pascal@19515 123 extrn _memcpy32:near
pascal@19515 124 call _memcpy32
pascal@19538 125 add sp,14
pascal@19515 126
pascal@19515 127 ifndef noelks
pascal@19515 128 push ss
pascal@19515 129 pop ds
pascal@19515 130 ifndef NO386
pascal@19515 131 cmp [dword 1E6h],'SKLE'
pascal@19515 132 else
pascal@19515 133 cmp [word 1E6h],'LE'
pascal@19515 134 jne notelks
pascal@19515 135 cmp [word 1E8h],'SK'
pascal@19515 136 endif
pascal@19515 137 jne notelks
pascal@19636 138 ifdef NO386
pascal@19636 139 mov cx,120h
pascal@19636 140 push cx
pascal@19636 141 mov cl,0h
pascal@19636 142 push cx
pascal@19636 143 else
pascal@19636 144 push 120h
pascal@19515 145 push 100h
pascal@19636 146 endif
pascal@19515 147 pop es
pascal@19515 148 xor si,si
pascal@19515 149 xor di,di
pascal@19515 150 mov ch,05h
pascal@19515 151 rep
pascal@19515 152 movsw
pascal@19515 153 push es
pascal@19515 154 pop ss
pascal@19636 155 push cx
pascal@19515 156 notelks:
pascal@19515 157 endif
pascal@19515 158
pascal@19571 159 isbzimage:
pascal@19515 160 push ss
pascal@19515 161 pop ds
pascal@19571 162 ;push ss
pascal@19571 163 ;pop es
pascal@19636 164 ifndef NO386
pascal@19515 165 push ss
pascal@19515 166 pop fs
pascal@19515 167 push ss
pascal@19515 168 pop gs
pascal@19636 169 endif
pascal@19515 170 assume nothing
pascal@19515 171 assume cs:DGROUP
pascal@19515 172
pascal@19515 173 doretf:
pascal@19515 174 retf
pascal@19515 175
pascal@19515 176 movedend:
pascal@19515 177 endp _set_sregs_jump_seg_ofs
pascal@19515 178
pascal@19515 179 ends _TEXT
pascal@19515 180
pascal@19515 181 end
pascal@19515 182
pascal@19515 183 ;###### END OF FILE ############################################