wok annotate linld/stuff/src/_BEG.ASM @ rev 24051

Add veracrypt
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon May 24 11:24:29 2021 +0000 (2021-05-24)
parents c1a1d1f23e07
children 06547d8cf241
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@24034 5 %PAGESIZE 255
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@24019 9
pascal@24019 10 include "common.inc"
pascal@24022 11 include "himem.inc"
pascal@24022 12 include "isostate.inc"
pascal@24022 13
pascal@24022 14 ifdef QUICK_BOOT
pascal@24022 15 CMDNUMCNT = 7
pascal@24022 16 else
pascal@24022 17 CMDNUMCNT = 5
pascal@24022 18 endif
pascal@24022 19
pascal@24022 20 macro alloc_isostate
pascal@24022 21 public _isostate
pascal@24022 22 _isostate isostate <?>
pascal@24022 23 org $-ISOSTATE_OVERLAP
pascal@24022 24 endm
pascal@24022 25
pascal@24022 26 macro alloc_image
pascal@24022 27 rm_size dw ? ; _imgs-4
pascal@24022 28 rm_buf dw ? ; _imgs-2
pascal@24022 29 global _imgs:byte
pascal@24022 30 label _imgs byte
pascal@24022 31 img_kernel image_himem ?
pascal@24022 32 img_initrd image_himem ?
pascal@24022 33 endm
pascal@24022 34
pascal@24023 35 macro alloc_cmdnum
pascal@24022 36 global _cmdnum:word
pascal@24022 37 label _cmdnum word
pascal@24022 38 dd CMDNUMCNT dup(?)
pascal@24022 39 endm
pascal@24019 40
pascal@19636 41 p8086
pascal@19515 42
pascal@19515 43 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 44 assume cs:DGROUP,ds:DGROUP
pascal@19515 45
pascal@19515 46 segment _TEXT byte public use16 'CODE'
pascal@20451 47 ends _TEXT
pascal@20451 48
pascal@20451 49 segment _DATA byte public use16 'DATA'
pascal@23996 50 ;global _data_start:byte
pascal@20451 51 label _data_start byte
pascal@20451 52 ifndef NO386
pascal@24019 53 msg_badcpu db "I need a 386+ in real mode w/o paging"
pascal@24019 54 ifdef VCPI
pascal@22183 55 db " or "
pascal@22183 56 msg_badmapping db "under VCPI 4.0+ manager with low 640k 1:1 mapping"
pascal@22183 57 global _vcpi:byte
pascal@24019 58 endif
pascal@22183 59 _vcpi db 0
pascal@20451 60 endif
pascal@20451 61
pascal@20451 62 ends _DATA
pascal@20451 63
pascal@20451 64 segment _BSS byte public use16 'BSS'
pascal@21757 65
pascal@24022 66 ifdef ISO9660
pascal@24022 67 ifndef VCPI
pascal@24022 68 alloc_isotate
pascal@24022 69 else
pascal@24022 70 room_for_isostate = 1
pascal@24022 71 endif
pascal@24022 72 endif
pascal@24022 73
pascal@24013 74 ifdef ISOHOOK
pascal@23996 75 extrn _big_cmdline:byte
pascal@23996 76 db 254 dup(?)
pascal@23996 77 endif
pascal@23996 78 ;global _bss_start:byte
pascal@20451 79 label _bss_start byte
pascal@22312 80 global stktop:byte
pascal@22183 81 global _cpu386:byte
pascal@22183 82 _cpu386 db ?
pascal@24019 83 ifdef CPU64
pascal@22183 84 org $-1
pascal@20451 85 global _cpu_features:dword
pascal@20451 86 _cpu_features dd ?
pascal@24022 87 room_for_image = 1
pascal@24022 88 else
pascal@24022 89 alloc_image
pascal@24019 90 endif
pascal@24022 91
pascal@24034 92 ;BSS_OVERLAP_BOOT = 1
pascal@24034 93
pascal@24022 94 ifndef BSS_OVERLAP_BOOT
pascal@24022 95
pascal@24022 96 ifdef room_for_isostate
pascal@24022 97 alloc_isostate
pascal@24022 98 endif
pascal@24022 99
pascal@24022 100 ifdef room_for_image
pascal@24022 101 alloc_image
pascal@24022 102 endif
pascal@24022 103
pascal@24023 104 alloc_cmdnum
pascal@24022 105
pascal@24022 106 endif
pascal@24022 107
pascal@20451 108 ends _BSS
pascal@20451 109
pascal@20451 110 segment _TEXT byte public use16 'CODE'
pascal@19515 111
pascal@19825 112 macro cpuid
pascal@19825 113 db 0fh,0A2h
pascal@19825 114 endm
pascal@19825 115
pascal@19515 116 org 100h
pascal@23996 117 ;global _text_start:byte
pascal@19515 118 label _text_start byte
pascal@19546 119
pascal@19515 120 ;***************************************************************
pascal@19515 121 ; clear bss
pascal@19515 122 ;***************************************************************
pascal@21757 123 mov sp,offset stktop
pascal@23996 124 mov bx, 0F000h ; cld ; cli & empty string
pascal@22179 125 mov si,offset _bss_start
pascal@19515 126 clearbss:
pascal@22312 127 mov [si],bl ; clear bss + heap
pascal@20426 128 inc si
pascal@19546 129 jne clearbss
pascal@19546 130
pascal@19546 131 ;***************************************************************
pascal@19546 132 ; check CPU
pascal@19546 133 ;***************************************************************
pascal@19546 134
pascal@19546 135 ; Check for oldies
pascal@19873 136 push bx ; < 286 : flags[12..15] are forced 1
pascal@24047 137 popf ; = 286 : flags[12..15] are forced 0, cld, cli
pascal@19873 138 pushf ; > 286 : only flags[15] is forced 0
pascal@19873 139 pop dx
pascal@24047 140 add dh,bh ; 160:NS=386+, 0F0:NC=286, 1E0:NP=86/186
pascal@20451 141 ifndef NO386
pascal@19873 142 mov bx,offset msg_badcpu
pascal@22183 143 js godie ;it is not a 386+, die
pascal@20451 144 else
pascal@22183 145 js endcpu86 ;it is not a 386+, try ELKS & co
pascal@19546 146 endif
pascal@19636 147 p386
pascal@24034 148 ifdef VCPI
pascal@23996 149 mov edx,cs
pascal@23996 150 shl edx,4 ; edx for prepare_vcpi
pascal@24034 151 else
pascal@24034 152 ifndef LARGE_ZIMAGE
pascal@24034 153 mov edx,cs
pascal@24034 154 shl edx,4 ; edx for memcpy32
pascal@24034 155 endif
pascal@24034 156 endif
pascal@24034 157 ifndef LARGE_ZIMAGE
pascal@23996 158 extrn gdt_base_memcpy:word ; gdt_base for memcpy32
pascal@23996 159 add [dword gdt_base_memcpy],edx
pascal@24034 160 endif
pascal@24034 161
pascal@19546 162 ; Check for vm
pascal@19546 163 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 164 and al,1 ;MSW_PE
pascal@19546 165 ; We're in vm
pascal@20457 166 jnz check_vcpi
pascal@20457 167
pascal@20457 168 check_rm_paging:
pascal@20457 169 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@20457 170 mov eax,cr0
pascal@20457 171 inc eax ;CR0_PG to S
pascal@20457 172 jns endcpu386
pascal@22183 173 ifndef NO386
pascal@20457 174 p8086
pascal@20457 175 extrn die:near
pascal@20457 176 godie:
pascal@20457 177 call near die
pascal@22183 178 else
pascal@22183 179 jmp endcpu86
pascal@22183 180 endif
pascal@19546 181
pascal@23797 182
pascal@19546 183 ;***************************************************************
pascal@19546 184 ; checks for vcpi
pascal@19546 185 ;***************************************************************
pascal@19546 186 label check_vcpi near
pascal@20457 187 p386
pascal@24019 188 ifdef VCPI
pascal@24013 189 ; Check whether it is safe to call 67h
pascal@24013 190 xor eax,eax
pascal@24022 191 push ds
pascal@24022 192 mov ds,ax
pascal@24022 193 cmp [dword 67h*4],eax
pascal@24022 194 pop ds
pascal@23996 195 je no_vcpi
pascal@24013 196 mov ah,0DEh ; check for vcpi present
pascal@19546 197 int 67h
pascal@23996 198 or ah,ah
pascal@19571 199 jnz no_vcpi
pascal@19546 200 is386vcpi:
pascal@19546 201 extrn prepare_vcpi:near
pascal@19546 202 call prepare_vcpi
pascal@19546 203 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 204 ;extrn _get_vcpi_interface:near
pascal@19546 205 ;call _get_vcpi_interface
pascal@22183 206 ifndef NO386
pascal@19546 207 mov bx,offset msg_badmapping
pascal@20457 208 jnz no_vcpi
pascal@22183 209 dec [byte bx+_vcpi-msg_badmapping]
pascal@22183 210 else
pascal@22183 211 jnz no_vcpi
pascal@22183 212 extrn _vcpi:byte
pascal@22183 213 dec [byte _vcpi]
pascal@22183 214 endif
pascal@24019 215 endif
pascal@23996 216 no_vcpi:
pascal@20457 217 endcpu386:
pascal@24019 218 ifdef CPU64
pascal@20457 219 pushfd
pascal@20457 220 pop dx
pascal@20457 221 pop ax
pascal@23996 222 xor al,20h ; toggle CPUID feature bit 21 (=> pentium+)
pascal@23996 223 push ax ; (toggle AC: bit 18 => 486+)
pascal@20457 224 push dx
pascal@20457 225 popfd
pascal@20457 226 pushfd
pascal@24051 227 pop dx
pascal@24051 228 pop dx
pascal@24051 229 xor al,dl ; clear C
pascal@24051 230 jne @@no_cpuid ; CPUID feature bit changed ?
pascal@20457 231 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@20457 232 cpuid
pascal@24051 233 mov dl,-1 ; set 386 flag
pascal@22183 234 ifdef NO386
pascal@22203 235 db 66h ; mov [_cpu_features],edx
pascal@22203 236 @@no_cpuid:
pascal@22203 237 mov [word _cpu_features],dx ; dl != 0
pascal@22203 238 else
pascal@20457 239 mov [_cpu_features],edx
pascal@20457 240 @@no_cpuid:
pascal@22203 241 endif
pascal@24019 242 else
pascal@24019 243 dec [_cpu386]
pascal@24019 244 endif
pascal@20457 245 endcpu86:
pascal@19636 246 p8086
pascal@19546 247
pascal@19515 248 ;***************************************************************
pascal@19515 249 ; build argv & argc
pascal@19515 250 ;***************************************************************
pascal@19515 251 mov si,80h
pascal@24013 252 ifdef ISOHOOK
pascal@23996 253 mov bx,offset _big_cmdline
pascal@23996 254 cmp [byte si],2
pascal@23996 255 jnb @@user_args
pascal@23996 256 call @set_cmdline$qpxzc
pascal@23996 257 @@user_args:
pascal@23996 258 endif
pascal@23996 259 lodsb ; size 0..127
pascal@19546 260 cbw
pascal@24013 261 ifdef ISOHOOK
pascal@23996 262 inc ax
pascal@23996 263 jnz short_cmdline
pascal@23996 264 mov si,bx
pascal@23996 265 lodsb ; size 0..254
pascal@23996 266 short_cmdline:
pascal@23996 267 dec ax
pascal@23996 268 endif
pascal@19515 269 xchg ax,bx
pascal@19515 270 mov [bx+si],bh ; set eos
pascal@24022 271
pascal@24022 272 ;***************************************************************
pascal@24022 273
pascal@24022 274 ifdef BSS_OVERLAP_BOOT
pascal@24034 275 mov di,offset clean-100h
pascal@24022 276
pascal@24023 277 org $-(CMDNUMCNT*4) ; alloc_cmdnum
pascal@24022 278
pascal@24022 279 ifdef room_for_image
pascal@24023 280 org $-2-2-(2*size image_himem) ; alloc_image
pascal@24022 281 endif
pascal@24022 282
pascal@24022 283 ifdef room_for_isostate
pascal@24022 284 org $+ISOSTATE_OVERLAP-size isostate
pascal@24022 285 alloc_isostate
pascal@24022 286 endif
pascal@24022 287
pascal@24022 288 ifdef room_for_image
pascal@24022 289 alloc_image
pascal@24022 290 endif
pascal@24022 291
pascal@24023 292 alloc_cmdnum
pascal@24034 293 clean:
pascal@24034 294 mov [di+0FFh],bh
pascal@24034 295 dec di
pascal@24034 296 jnz clean
pascal@24023 297 endif
pascal@24023 298
pascal@24034 299 org $-4 ; _himem_buf
pascal@24023 300 global _himem_buf:dword
pascal@24023 301 _himem_buf dd ?
pascal@24023 302
pascal@24022 303 ;***************************************************************
pascal@24022 304 extrn _bss_end:word
pascal@24022 305 mov di,offset _bss_end
pascal@24022 306 global _heap_top
pascal@24022 307 org $-2
pascal@24022 308 _heap_top dw ?
pascal@23996 309 ;xor dx,dx
pascal@23996 310 ;push dx ; envp (already cleared)
pascal@23996 311 ;mov [word di],dx ; argv[0] = 0 (idem)
pascal@19515 312 argbuild:
pascal@19515 313 mov bx,2 ; argc * 2
pascal@19515 314 argeos:
pascal@20451 315 mov cx,1 ; look for a start of string
pascal@19515 316 mov [byte si-1],bh ; mark eos
pascal@19515 317 mov ah,20h ; space will be eos
pascal@19515 318 arglp:
pascal@19515 319 lodsb
pascal@19515 320 cmp al,0h
pascal@19515 321 je argdone
pascal@19515 322 cmp al,20h
pascal@19515 323 jb argeos
pascal@19515 324 cmp al,ah
pascal@19515 325 je argeos
pascal@19515 326 cmp al,27h
pascal@19515 327 je isargstr
pascal@19515 328 cmp al,22h
pascal@19515 329 je isargstr
pascal@20451 330 jcxz arglp ; not start of string
pascal@19515 331 dec si
pascal@19884 332 ;jmp newarg
pascal@20451 333 db 0BAh ; mov dx,im opcode
pascal@19515 334 isargstr:
pascal@19515 335 mov ah,al ; expected eos
pascal@19515 336 newarg:
pascal@19515 337 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 338 inc bx
pascal@19515 339 inc bx
pascal@20451 340 dec cx
pascal@19515 341 jmp arglp
pascal@23992 342
pascal@23992 343 ;***************************************************************
pascal@23992 344 ;_fastcall void set_cmdline(bx:const char *filename);
pascal@23992 345 ;***************************************************************
pascal@23992 346 global @set_cmdline$qpxzc:near
pascal@23992 347 proc @set_cmdline$qpxzc near
pascal@23992 348 extrn openargs:near
pascal@23992 349 call openargs
pascal@23992 350 jc @ret
pascal@23992 351 mov ch,15 ; cx<4096
pascal@23992 352 mov di,[_heap_top]
pascal@23992 353 jmp read_cmdline ; read_cmdline(ax,di,cx)
pascal@23992 354
pascal@23992 355 endp @set_cmdline$qpxzc
pascal@23992 356
pascal@23992 357 ifdef NO386
pascal@23992 358 ;***************************************************************
pascal@23992 359 ;u16 topseg();
pascal@23992 360 ;***************************************************************
pascal@23992 361 global _topseg:near
pascal@23992 362 proc _topseg near
pascal@23992 363
pascal@23992 364 int 12h
pascal@23992 365 jnc @@max640k
pascal@23992 366 mov ax,640 ; 9000
pascal@23992 367 @@max640k:
pascal@23992 368 dec ax
pascal@23992 369 and al,0C0h
pascal@23992 370 mov cl,6
pascal@23992 371 shl ax,cl
pascal@23992 372 @ret:
pascal@23992 373 ret
pascal@23992 374
pascal@23992 375 endp _topseg
pascal@24019 376 else
pascal@24019 377 @ret:
pascal@24019 378 ret
pascal@23992 379 endif
pascal@23992 380
pascal@24013 381 ;***************************************************************
pascal@24013 382 argdone:
pascal@24013 383 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@24013 384 lea ax,[bx+di+2]
pascal@24013 385 mov [_heap_top],ax
pascal@24013 386 ;push di ; argv
pascal@24013 387 ;shr bx,1
pascal@24013 388 ;push bx ; argc
pascal@24013 389 ifndef filearg
pascal@24013 390 mov bx,[di+2] ; argv[1]
pascal@24013 391 extrn openargs:near
pascal@24013 392 call near openargs
pascal@24013 393 jc argend
pascal@24013 394 ;pop bx ; trash argc, argv >> 1Kb !
pascal@24013 395 ;pop cx ; sizemax=argv
pascal@24013 396 dec cx ; sizemax=0ffffh
pascal@24013 397 read_cmdline:
pascal@24013 398 mov dx,di
pascal@24013 399 push dx
pascal@24013 400 xchg ax,bx
pascal@24013 401 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
pascal@24013 402 call near @read$cxdxbx
pascal@24013 403 pop si ; si=buffer=argv
pascal@24013 404 add di,ax
pascal@24013 405 ifndef NO_CLOSE
pascal@24013 406 extrn close:near
pascal@24013 407 call near close
pascal@24013 408 endif
pascal@24013 409 jmp argbuild
pascal@24013 410 argend:
pascal@24013 411 endif
pascal@24013 412
pascal@24013 413 ;***************************************************************
pascal@24013 414 ; extrn _main:near
pascal@24013 415 ; call _main
pascal@24013 416 ;never return
pascal@24013 417
pascal@24013 418 ;***************************************************************
pascal@24013 419
pascal@24013 420
pascal@19515 421 ends _TEXT
pascal@19515 422
pascal@19515 423
pascal@19515 424 end _text_start
pascal@19515 425
pascal@19515 426 ;###### END OF FILE ############################################