wok annotate linld/stuff/src/MEMCPY32.ASM @ rev 20520

Up sshguard (2.2.0)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Nov 05 11:52:27 2018 +0100 (2018-11-05)
parents f5088c165f51
children 17c0ad41f5bf
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@20477 14 group DGROUP _TEXT
pascal@19515 15 assume cs:DGROUP,ds:DGROUP
pascal@19515 16
pascal@19515 17 segment _TEXT byte public use16 'CODE'
pascal@19515 18
pascal@19515 19 ;***************************************************************
pascal@19538 20 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
pascal@19515 21 ;***************************************************************
pascal@19515 22 ;****** Uses: Flags
pascal@19515 23 ;***************************************************************
pascal@19515 24 global _memcpy32:near
pascal@19515 25 proc _memcpy32 near
pascal@19515 26
pascal@19515 27 ; rm32,imm16 helper
pascal@19515 28 macro addzx_e rm,i
pascal@19515 29 db 66h
pascal@19515 30 add rm,i
pascal@19515 31 dw 0
pascal@19515 32 endm
pascal@19538 33 arg dstofs :dword, \
pascal@19515 34 srcseg :word, \
pascal@19515 35 srcofs :dword, \
pascal@19515 36 sz :dword = PARAM_SIZE
pascal@19515 37
pascal@19515 38 local GDTR :pword, \
pascal@19515 39 oldGDTR :pword = TEMP_SIZE
pascal@19515 40
pascal@19515 41 ;****** Init ***************************************************
pascal@19634 42
pascal@19903 43 ifndef NO386
pascal@19634 44
pascal@19634 45 enter TEMP_SIZE,0
pascal@19571 46 ;cld
pascal@19515 47 pushf
pascal@19538 48 push ds es
pascal@19538 49 pushad
pascal@19571 50 mov cl,4
pascal@19515 51 movzx esi,[srcseg]
pascal@19571 52 shl esi,cl
pascal@19571 53 add esi,[srcofs]
pascal@19571 54 mov [srcofs],esi ; for memcpy_vcpi
pascal@19538 55 mov edi,[dstofs]
pascal@19538 56
pascal@19515 57 ifndef pm_only
pascal@19538 58 mov eax,esi
pascal@19571 59 shr eax,cl
pascal@19515 60 mov edx,edi
pascal@19571 61 shr edx,cl
pascal@19571 62 mov ecx,esi
pascal@19571 63 or ecx,edi
pascal@19571 64 shr ecx,20 ; >1mb ?
pascal@19571 65 jnz @@pmcopy
pascal@19515 66 @@movlp:
pascal@19515 67 mov ds,ax
pascal@19515 68 mov es,dx
pascal@19515 69 inc ax
pascal@19515 70 inc dx
pascal@19538 71 mov cl,0Fh
pascal@19538 72 and si,cx
pascal@19538 73 and di,cx
pascal@19538 74 inc cx
pascal@19538 75 sub [sz],ecx
pascal@19538 76 rep movsb
pascal@19515 77 ja @@movlp
pascal@19571 78 jmp @@done
pascal@19515 79 endif
pascal@19571 80 @@pmcopy:
pascal@19538 81 else
pascal@19538 82
pascal@19634 83 push bp
pascal@19634 84 mov bp,sp
pascal@19634 85 sub sp,TEMP_SIZE
pascal@19634 86 ;cld
pascal@19634 87 pushf
pascal@19634 88 push ds es
pascal@19538 89 push si
pascal@19538 90 xor bx,bx
pascal@19538 91 xor dx,dx
pascal@19538 92 xor si,si
pascal@19903 93 mov ax,[srcseg]
pascal@19883 94 mov cl,4
pascal@19883 95 extrn N_LXLSH@:near
pascal@19883 96 call near N_LXLSH@
pascal@19903 97 add [word srcofs],ax
pascal@19903 98 adc [word srcofs+2],dx
pascal@19538 99 @@2flat:
pascal@19903 100 mov ax,[word si+srcofs] ; srcofs, dstofs lo
pascal@19903 101 mov dx,[word si+srcofs+2] ; srcofs, dstofs hi
pascal@19884 102 extrn N_LXURSH@4:near
pascal@19538 103 call near N_LXURSH@4
pascal@19538 104 or bx,dx ; >=1mb flag
pascal@19538 105 push ax ; srcseg, dstseg
pascal@19538 106 xor si,-6
pascal@19538 107 jnz @@2flat
pascal@19538 108 pop dx ; dstseg
pascal@19538 109 pop ax ; srcseg
pascal@19903 110 dec bx ; <1mb ?
pascal@19903 111 jns @@pmcopy
pascal@19538 112 push di
pascal@19538 113 @@movlp:
pascal@19538 114 mov ds,ax
pascal@19538 115 mov es,dx
pascal@19538 116 inc ax
pascal@19538 117 inc dx
pascal@19538 118 mov cl,0Fh
pascal@19538 119 mov si,cx
pascal@19538 120 mov di,cx
pascal@19538 121 and si,[word srcofs]
pascal@19538 122 and di,[word dstofs]
pascal@19538 123 inc cx
pascal@19538 124 sub [word sz],cx
pascal@20520 125 ;jae @@movpara
pascal@20520 126 sbb [word sz+2],0
pascal@20520 127 jae @@movpara
pascal@20520 128 add cx,[word sz]
pascal@20520 129 ;stc
pascal@20520 130 @@movpara:
pascal@19538 131 rep movsb
pascal@20485 132 jae @@movlp
pascal@20520 133 dec cx ; set S
pascal@19571 134 pop di
pascal@19571 135 @@pmcopy:
pascal@19538 136 pop si
pascal@19571 137 js @@done16
pascal@19636 138 p386
pascal@19538 139 pushad
pascal@19538 140 mov esi,[srcofs]
pascal@19538 141 mov edi,[dstofs]
pascal@19538 142
pascal@19538 143 endif
pascal@19538 144
pascal@19515 145 mov ecx,[sz]
pascal@19571 146 jecxz @@done
pascal@19538 147
pascal@19538 148 smsw ax
pascal@20453 149 and al,1 ;MSW_PE
pascal@19538 150 jz @@real_mode
pascal@19538 151 ; Note: bp points to std stack frame now. bp will be passed to
pascal@19538 152 ; pm routine. This allows params to be passed on stack
pascal@19538 153 extrn do_memcpy_vcpi:near
pascal@19538 154 push offset do_memcpy_vcpi
pascal@19538 155 extrn call_pm_routine:near
pascal@19538 156 call near call_pm_routine ; Call pm copy routine via vcpi pm
pascal@19538 157 pop ax
pascal@19571 158 jmp @@done
pascal@19538 159 @@real_mode:
pascal@19515 160 cmp esi,edi
pascal@19515 161 jae @@do_copy
pascal@19515 162 add esi,ecx ;src<dst: we must do
pascal@19515 163 dec esi ; copy backwards to avoid
pascal@19515 164 add edi,ecx ; overwrite bug
pascal@19515 165 dec edi ;
pascal@19515 166 std ;
pascal@19515 167 @@do_copy:
pascal@19515 168 cli
pascal@19515 169 sgdt [oldGDTR]
pascal@19515 170
pascal@19515 171 ;****** Load gdtr **********************************************
pascal@19515 172 mov eax,cs
pascal@19515 173 shl eax,4
pascal@19515 174 addzx_e ax,<offset GDT>
pascal@19634 175 or [word GDTR],-1 ;GDT limit = 0FFFFh
pascal@19515 176 mov [dword GDTR+2],eax ;GDT base
pascal@19515 177 lgdt [GDTR]
pascal@19515 178
pascal@19515 179 ;****** Go into pm *********************************************
pascal@19515 180 mov eax,cr0
pascal@19571 181 inc ax ;CR0_PE on
pascal@19515 182 mov cr0,eax
pascal@19515 183 jmp short $+2 ;*Required*!
pascal@19515 184 ;3+ NOPs also work fine (chkd on 386)
pascal@19515 185 ;****** Move data **********************************************
pascal@19515 186 push 0008h
pascal@19515 187 pop ds ;base=0, lim = 4gb
pascal@19515 188 push ds ;
pascal@19515 189 pop es ;
pascal@19634 190 ;db 66h ;operand width override for ecx
pascal@19515 191 db 67h ;address width override for esi/edi
pascal@19515 192 rep movsb
pascal@19883 193 ;cld
pascal@19515 194
pascal@19515 195 ;****** Return to rm *******************************************
pascal@19515 196 dec ax ;CR0_PE off
pascal@19515 197 mov cr0,eax ;ds/es limits are *not* reset to 64kb
pascal@19515 198 ; but who cares :-)
pascal@19515 199 jmp short $+2
pascal@19515 200
pascal@19515 201 ;****** Return *************************************************
pascal@19515 202 lgdt [oldGDTR]
pascal@19571 203 @@done:
pascal@19538 204 popad
pascal@19636 205 p8086
pascal@19571 206 @@done16:
pascal@19538 207 pop es ds
pascal@19515 208 popf
pascal@19634 209 ifndef NO386
pascal@19636 210 p386
pascal@19634 211 leave
pascal@19634 212 else
pascal@19538 213 mov sp,bp
pascal@19538 214 pop bp
pascal@19634 215 endif
pascal@19515 216 ret
pascal@19515 217
pascal@19515 218 ;****** Const data *********************************************
pascal@19515 219 org $-8 ;save 8 bytes - they are unused anyway
pascal@19515 220 ;0000: unused
pascal@19515 221 GDT dd ?,?
pascal@19515 222 ;0008: Data seg [0,FFFFFFFF]
pascal@19515 223 ; lim_lo base_lo
pascal@19515 224 dw 1111111111111111b, 0000000000000000b
pascal@19515 225 db 00000000b,10010010b,10001111b,00000000b
pascal@19515 226 ; base_med P S D A G ??l_hi base_hi
pascal@19515 227 ; Pl E W D
pascal@19515 228
pascal@19515 229 endp _memcpy32
pascal@19515 230
pascal@19515 231 ends _TEXT
pascal@19515 232
pascal@19515 233 end
pascal@19515 234
pascal@19515 235 ;###### END OF FILE ############################################