wok rev 25450

BootProg: avoid divide errors
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Sep 14 18:33:54 2022 +0000 (19 months ago)
parents 6023b31d568c
children 5b1ba413bf58
files BootProg/stuff/boot16.asm BootProg/stuff/boot32.asm BootProg/stuff/bootex.asm diggerjs/receipt nareto/receipt
line diff
     1.1 --- a/BootProg/stuff/boot16.asm	Mon Sep 12 16:35:46 2022 +0000
     1.2 +++ b/BootProg/stuff/boot16.asm	Wed Sep 14 18:33:54 2022 +0000
     1.3 @@ -83,6 +83,12 @@
     1.4  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     1.5  
     1.6  %define bx(label)       bx+label-boot
     1.7 +%define si(label)       si+label-boot
     1.8 +NullEntryCheck          equ     1               ; +3 bytes
     1.9 +ReadRetry               equ     1               ; +9 bytes
    1.10 +LBAsupport              equ     1               ; +16 bytes
    1.11 +Over2GB                 equ     1               ; +5 bytes
    1.12 +GeometryCheck           equ     1               ; +18 bytes
    1.13  
    1.14  [BITS 16]
    1.15  [CPU 8086]
    1.16 @@ -98,6 +104,7 @@
    1.17  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    1.18  
    1.19  boot:
    1.20 +DriveNumber:
    1.21          jmp     short   start                   ; MS-DOS/Windows checks for this jump
    1.22          nop
    1.23  bsOemName               DB      "BootProg"      ; 0x03
    1.24 @@ -161,14 +168,14 @@
    1.25          mov     si, 7C00h
    1.26          xor     di, di
    1.27          mov     ds, di
    1.28 -        mov     [si], dx                ; store BIOS boot drive number
    1.29 +        push    es
    1.30 +        mov     [si(DriveNumber)], dx   ; store BIOS boot drive number
    1.31          rep     movsw                   ; move 512 bytes (+ 12)
    1.32  
    1.33  ;;;;;;;;;;;;;;;;;;;;;;
    1.34  ;; Jump to the copy ;;
    1.35  ;;;;;;;;;;;;;;;;;;;;;;
    1.36  
    1.37 -        push    es
    1.38          mov     cl, byte main
    1.39          push    cx
    1.40          retf
    1.41 @@ -189,13 +196,16 @@
    1.42  ;; for current BIOS     ;;
    1.43  ;;;;;;;;;;;;;;;;;;;;;;;;;;
    1.44  
    1.45 +%if GeometryCheck != 0
    1.46          mov     ah, 8
    1.47          int     13h                     ; may destroy SI,BP, and DS registers
    1.48 +%endif
    1.49                                          ; update AX,BL,CX,DX,DI, and ES registers
    1.50          push    cs
    1.51          pop     ds
    1.52          xor     bx, bx
    1.53  
    1.54 +%if GeometryCheck != 0
    1.55          and     cx, byte 3Fh
    1.56          cmp     [bx(bpbSectorsPerTrack)], cx
    1.57          jne     BadParams               ; verify updated and validity
    1.58 @@ -203,6 +213,7 @@
    1.59          inc     ax
    1.60          mov     [bpbHeadsPerCylinder], ax
    1.61  BadParams:
    1.62 +%endif
    1.63  
    1.64  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    1.65  ;; Load FAT (FAT12: 6KB max, FAT16: 128KB max) ;;
    1.66 @@ -255,9 +266,13 @@
    1.67          repe    cmpsb
    1.68          pop     di
    1.69          je      FindNameFound
    1.70 +%if NullEntryCheck != 0
    1.71          scasb
    1.72          je      FindNameFailed          ; end of root directory (NULL entry found)
    1.73          add     di, byte 31
    1.74 +%else
    1.75 +        add     di, byte 32
    1.76 +%endif
    1.77          dec     word [bx(bpbRootEntries)]
    1.78          jnz     FindNameCycle           ; next root entry
    1.79  
    1.80 @@ -289,35 +304,49 @@
    1.81  ;;         CH = 0             ;;
    1.82  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    1.83  
    1.84 +FAT12   	equ       1
    1.85 +FAT16   	equ       1
    1.86          push    di                      ; up to 2 * 635K / BytesPerCluster bytes
    1.87 +%if FAT12 == 1
    1.88          mov     cl, 12
    1.89 +%endif
    1.90  ClusterLoop:
    1.91          mov     [di], si
    1.92  
    1.93 +        add     si, si                  ; si = cluster * 2
    1.94 +%if FAT16 == 1
    1.95          mov     ax, es                  ; ax = FAT segment = ImageLoadSeg
    1.96 -        add     si, si                  ; si = cluster * 2
    1.97          jnc     First64k
    1.98          mov     ah, (1000h+ImageLoadSeg)>>8 ; adjust segment for 2nd part of FAT16
    1.99  First64k:
   1.100          mov     dx, 0FFF8h
   1.101 +%else
   1.102 +        mov     dx, 0FF8h
   1.103 +%endif
   1.104  
   1.105 +%if FAT12 == 1 && FAT16 == 1
   1.106          cmp     [bx(bpbSectorsPerFAT)], cx ; 1..12 = FAT12, 16..256 = FAT16
   1.107          ja      ReadClusterFat16
   1.108 -
   1.109          mov     dh, 0Fh
   1.110 +%endif
   1.111 +%if FAT12 == 1
   1.112          add     si, [di]
   1.113          shr     si, 1                   ; si = cluster * 3 / 2
   1.114 -
   1.115 +%endif
   1.116 +%if FAT16 == 1
   1.117  ReadClusterFat16:
   1.118          push    ds
   1.119          mov     ds, ax
   1.120          lodsw                           ; ax = next cluster
   1.121          pop     ds
   1.122 +%else
   1.123 +        lodsw                           ; ax = next cluster
   1.124 +%endif
   1.125 +%if FAT12 == 1
   1.126          jnc     ReadClusterEven
   1.127 -
   1.128          rol     ax, cl
   1.129 -
   1.130  ReadClusterEven:
   1.131 +%endif
   1.132          scasw                           ; di += 2
   1.133          and     ah, dh                  ; mask cluster value
   1.134          cmp     ax, dx
   1.135 @@ -464,31 +493,41 @@
   1.136          push    di
   1.137          push    cx
   1.138  
   1.139 +%if LBAsupport != 0
   1.140          push    bx
   1.141          push    bx
   1.142 +%endif
   1.143          push    dx      ; 32-bit LBA: up to 2TB
   1.144          push    ax
   1.145          push    es
   1.146 +%if ReadRetry != 0 || LBAsupport != 0
   1.147 +        mov     di, 16  ; packet size byte = 16, reserved byte = 0
   1.148 +%endif
   1.149 +%if LBAsupport != 0
   1.150          push    bx
   1.151          inc     bx      ; sector count word = 1
   1.152          push    bx
   1.153          dec     bx
   1.154 -        mov     di, 16  ; packet size byte = 16, reserved byte = 0
   1.155          push    di
   1.156 +%endif
   1.157  
   1.158 +%if Over2GB != 0
   1.159          xchg    ax, cx                  ; save low LBA
   1.160          xchg    ax, dx                  ; get high LBA
   1.161          cwd                             ; clear dx (LBA offset <2TB)
   1.162 -        div     word [bx(bpbSectorsPerTrack)] ; up to 8GB disks
   1.163 +        idiv    word [bx(bpbSectorsPerTrack)] ; up to 8GB disks
   1.164  
   1.165          xchg    ax, cx                  ; restore low LBA, save high LBA / SPT
   1.166 -        div     word [bx(bpbSectorsPerTrack)]
   1.167 +%else
   1.168 +        xor     cx, cx                  ; up to 2GB disks otherwise divide error interrupt !
   1.169 +%endif
   1.170 +        idiv    word [bx(bpbSectorsPerTrack)]
   1.171                  ; ax = LBA / SPT
   1.172                  ; dx = LBA % SPT         = sector - 1
   1.173          inc     dx
   1.174  
   1.175          xchg    cx, dx                  ; restore high LBA / SPT, save sector no.
   1.176 -        div     word [bx(bpbHeadsPerCylinder)]
   1.177 +        idiv    word [bx(bpbHeadsPerCylinder)]
   1.178                  ; ax = (LBA / SPT) / HPC = cylinder
   1.179                  ; dx = (LBA / SPT) % HPC = head
   1.180          mov     ch, al
   1.181 @@ -501,41 +540,54 @@
   1.182                  ; dh = head no.
   1.183  
   1.184  ReadSectorRetry:
   1.185 -        mov     dl, [bx]
   1.186 +        mov     dl, [bx(DriveNumber)]
   1.187                  ; dl = drive no.
   1.188 +        mov     si, sp
   1.189 +%if LBAsupport != 0
   1.190          mov     ah, 42h                 ; ah = 42h = extended read function no.
   1.191 -        mov     si, sp
   1.192          int     13h                     ; extended read sectors (DL, DS:SI)
   1.193          jnc     ReadSectorNextSegment
   1.194 +%endif
   1.195  
   1.196          mov     ax, 201h                ; al = sector count = 1
   1.197                                          ; ah = 2 = read function no.
   1.198          int     13h                     ; read sectors (AL, CX, DX, ES:BX)
   1.199  
   1.200          jnc     ReadSectorNextSegment
   1.201 +%if ReadRetry != 0
   1.202          cbw                             ; ah = 0 = reset function
   1.203          int     13h                     ; reset drive (DL)
   1.204  
   1.205          dec     di
   1.206          jnz     ReadSectorRetry         ; extra attempt
   1.207 +%endif
   1.208  
   1.209          call    Error
   1.210          db      "Read error."
   1.211  
   1.212  ReadSectorNextSegment:
   1.213  
   1.214 +%if LBAsupport != 0
   1.215          pop     ax                      ; al = 16
   1.216          mul     byte [bx(bpbBytesPerSector)+1] ;  = (bpbBytesPerSector/256)*16
   1.217          pop     cx                      ; sector count = 1
   1.218          pop     bx
   1.219          add     [si+6], ax              ; adjust segment for next sector
   1.220 +%else
   1.221 +        mov     al, 16
   1.222 +        mul     byte [bx(bpbBytesPerSector)+1] ;  = (bpbBytesPerSector/256)*16
   1.223 +        add     [si], ax                ; adjust segment for next sector
   1.224 +%endif
   1.225          pop     es                      ; es:0 updated
   1.226          pop     ax
   1.227          pop     dx
   1.228 +%if LBAsupport != 0
   1.229          pop     di
   1.230          pop     di
   1.231 -
   1.232          add     ax, cx                  ; adjust LBA for next sector
   1.233 +%else
   1.234 +        add     ax, 1                   ; adjust LBA for next sector
   1.235 +%endif
   1.236  
   1.237          pop     cx                      ; cluster sectors to read
   1.238          pop     di                      ; file sectors to read
   1.239 @@ -543,7 +595,7 @@
   1.240          loopne  ReadSectorNext          ; until cluster sector count or file sector count is reached
   1.241          pop     si
   1.242          mov     ax, bx                  ; clear ax
   1.243 -        mov     dx, [bx]                ; pass the BIOS boot drive to Run or Error
   1.244 +        mov     dx, [bx(DriveNumber)]   ; pass the BIOS boot drive to Run or Error
   1.245  
   1.246          ret
   1.247  
   1.248 @@ -581,7 +633,7 @@
   1.249  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.250  
   1.251  ProgramName     db      "STARTUP BIN"   ; name and extension each must be
   1.252 -                                        ; padded with spaces (11 bytes total)
   1.253 +                times (510-($-$$)) db ' ' ; padded with spaces (11 bytes total)
   1.254  
   1.255  ;;;;;;;;;;;;;;;;;;;;;;;;;;
   1.256  ;; End of the sector ID ;;
     2.1 --- a/BootProg/stuff/boot32.asm	Mon Sep 12 16:35:46 2022 +0000
     2.2 +++ b/BootProg/stuff/boot32.asm	Wed Sep 14 18:33:54 2022 +0000
     2.3 @@ -185,7 +185,6 @@
     2.4          xor     di, di
     2.5          mov     ds, di
     2.6          push    es
     2.7 -        push    byte main
     2.8          mov     [si(DriveNumber)], dx  ; store BIOS boot drive number
     2.9          rep     movsw
    2.10  
    2.11 @@ -193,6 +192,7 @@
    2.12  ;; Jump to the copy ;;
    2.13  ;;;;;;;;;;;;;;;;;;;;;;
    2.14  
    2.15 +        push    byte main
    2.16          retf
    2.17  
    2.18  main:
    2.19 @@ -440,20 +440,19 @@
    2.20          idiv    word [bx(bpbSectorsPerTrack)] ; up to 8GB disks, avoid divide error
    2.21  
    2.22          xchg    ax, cx                  ; restore low LBA, save high LBA / SPT
    2.23 -        div     word [bx(bpbSectorsPerTrack)]
    2.24  %else
    2.25  ; Busybox mkdosfs creates fat32 for floppies.
    2.26  ; Floppies may support CHS only.
    2.27          cwd                             ; clear dx (LBA offset <16MB)
    2.28 +        xor     cx, cx                  ; high LBA / SPT = 0
    2.29 +%endif
    2.30          idiv    word [bx(bpbSectorsPerTrack)]
    2.31 -        xor     cx, cx
    2.32 -%endif
    2.33                  ; ax = LBA / SPT
    2.34                  ; dx = LBA % SPT         = sector - 1
    2.35          inc     dx
    2.36  
    2.37          xchg    cx, dx                  ; restore high LBA / SPT, save sector no.
    2.38 -        div     word [bx(bpbHeadsPerCylinder)]
    2.39 +        idiv    word [bx(bpbHeadsPerCylinder)]
    2.40                  ; ax = (LBA / SPT) / HPC = cylinder
    2.41                  ; dx = (LBA / SPT) % HPC = head
    2.42  
     3.1 --- a/BootProg/stuff/bootex.asm	Mon Sep 12 16:35:46 2022 +0000
     3.2 +++ b/BootProg/stuff/bootex.asm	Wed Sep 14 18:33:54 2022 +0000
     3.3 @@ -77,6 +77,9 @@
     3.4  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     3.5  
     3.6  %define bx(label)       bx+label-boot
     3.7 +%define si(label)       si+label-boot
     3.8 +NullEntryCheck          equ     1               ; +3 bytes
     3.9 +ReadRetry               equ     1               ; +8 bytes
    3.10  
    3.11  [BITS 16]
    3.12  [CPU 386]
    3.13 @@ -92,6 +95,7 @@
    3.14  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    3.15  
    3.16  boot:
    3.17 +DriveNumber:
    3.18          jmp     short   start                   ; Windows checks for this jump
    3.19          nop
    3.20  bsOemName               DB      "EXFAT   "      ; 0x03
    3.21 @@ -154,13 +158,14 @@
    3.22          mov     si, 7C00h
    3.23          xor     di, di
    3.24          mov     ds, di
    3.25 +        push    es
    3.26 +        mov     [si(DriveNumber)], dx   ; store BIOS boot drive number
    3.27          rep     movsw                   ; move 512 bytes (+ 12)
    3.28  
    3.29  ;;;;;;;;;;;;;;;;;;;;;;
    3.30  ;; Jump to the copy ;;
    3.31  ;;;;;;;;;;;;;;;;;;;;;;
    3.32  
    3.33 -        push    es
    3.34          push    word main
    3.35          retf
    3.36  
    3.37 @@ -169,7 +174,6 @@
    3.38          pop     ds
    3.39  
    3.40          xor     ebx, ebx
    3.41 -        mov     [bx], dl                ; store BIOS boot drive number
    3.42  
    3.43          mov     esi, [bx(bpbRootDirCluster)] ; esi=cluster # of root dir
    3.44  
    3.45 @@ -194,16 +198,20 @@
    3.46  ;;         dword [bx+FileSize] file size ;;
    3.47  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    3.48  
    3.49 -CurNameSize     equ  3
    3.50 -StartCluster    equ  14h
    3.51 -FileSize        equ  18h
    3.52 +CurNameSize     equ  3                  ; 1 byte
    3.53 +StartCluster    equ  14h                ; 4 bytes
    3.54 +FileSize        equ  18h                ; 8 bytes
    3.55  
    3.56  FindNameCycle:
    3.57          pusha
    3.58  
    3.59 +%if NullEntryCheck != 0
    3.60          xor     ax, ax
    3.61          or      al, [es:di]
    3.62          je      FindNameFailed
    3.63 +%else
    3.64 +        movzx   ax, byte [es:di]
    3.65 +%endif
    3.66  
    3.67          cmp     al, 0c0h                ; EXFAT_ENTRY_FILE_INFO ?
    3.68          jne     NotFileInfo
    3.69 @@ -213,7 +221,7 @@
    3.70          mov     al, [es:di+bx]
    3.71          mov     [bx], al
    3.72          dec     bx
    3.73 -        jnz     CopyInfo		; keep BIOS boot drive number
    3.74 +        jnz     CopyInfo                ; keep BIOS boot drive number
    3.75  
    3.76  NotFileInfo:
    3.77          mov     al, 0c1h                ; EXFAT_ENTRY_FILE_NAME ?
    3.78 @@ -232,7 +240,7 @@
    3.79          popf                            ; restore carry="not last sector" flag
    3.80          jc      RootDirReadContinue     ; continue to the next root dir cluster
    3.81  FindNameFailed:                         ; end of root directory (dir end reached)
    3.82 -        mov     dl, [bx]                ; restore BIOS boot drive number
    3.83 +        mov     dx, [bx(DriveNumber)]   ; restore BIOS boot drive number
    3.84          call    Error
    3.85          db      "File not found."
    3.86  FindNameFound:
    3.87 @@ -250,9 +258,9 @@
    3.88          add     di, bp                  ; adjust segment for next sector
    3.89          mov     es, di                  ; es:0 updated
    3.90          call    ReadCluster             ; read one more sector of the boot file
    3.91 -        sub     [bx+FileSize], ebp
    3.92 +        sub     [bx+FileSize], ebp      ; max FileSize is < 640KB : check low 32 bits only
    3.93          ja      FileReadContinue
    3.94 -        mov     dl, [bx]                ; restore BIOS boot drive number
    3.95 +        mov     dx, [bx(DriveNumber)]   ; restore BIOS boot drive number
    3.96          xor     ax, ax
    3.97          pop     bp
    3.98  
    3.99 @@ -354,10 +362,9 @@
   3.100          loop    ReadSectorC
   3.101  
   3.102          mul     ebx                             ; edx:eax = 0
   3.103 -        mov     cl, [bx(bpbSectorSizeBits)]
   3.104 -        dec     cx
   3.105 -        stc
   3.106 -        rcl     eax, cl                         ; eax=# of exFAT entries per sector
   3.107 +        mov     cl,-2
   3.108 +        add     cl, [bx(bpbSectorSizeBits)]
   3.109 +        bts     ax, cx                          ; eax=# of exFAT entries per sector
   3.110          lea     edi, [esi-2]                    ; edi=cluster #-2
   3.111          xchg    eax, esi
   3.112          div     esi                             ; eax=FAT sector #, edx=entry # in sector
   3.113 @@ -365,15 +372,14 @@
   3.114          imul    si, dx, byte 4                  ; si=entry # offset in sector
   3.115  
   3.116          cdq
   3.117 -        add     eax, [bx(bpbFatSectorStart)]    ; sector # relative to exFAT
   3.118 -        call    ReadSectorC                     ; read 1 exFAT sector
   3.119 +        add     eax, [bx(bpbFatSectorStart)]    ; sector # relative to FAT32
   3.120 +        call    ReadSectorC                     ; read 1 FAT32 sector
   3.121  
   3.122          mov     esi, [es:si]                    ; esi=next cluster #
   3.123  
   3.124 -        inc     dx
   3.125 -        mov     cl, [bx(bpbSectorPerClusterBits)]
   3.126 -        shl     edx, cl                         ; 10000h max (32MB cluster)
   3.127 -        mov     ecx, edx
   3.128 +        mov     dl, [bx(bpbSectorPerClusterBits)]
   3.129 +        xor     cx, cx
   3.130 +        bts     ecx, edx                        ; 10000h max (32MB cluster)
   3.131          xchg    eax, edi                        ; get cluster #-2
   3.132          mul     ecx
   3.133  
   3.134 @@ -407,19 +413,25 @@
   3.135          push    es
   3.136          push    bx
   3.137          push    bp                      ; sector count word = 1
   3.138 +%if ReadRetry != 0
   3.139          mov     cx, 16
   3.140          push    cx                      ; packet size byte = 16, reserved byte = 0
   3.141  ReadSectorRetry:        
   3.142 +%else
   3.143 +        push    byte 16
   3.144 +%endif
   3.145          mov     si, sp
   3.146          mov     ah, 42h                 ; ah = 42h = extended read function no.
   3.147 -        mov     dl, [bx]                ; restore BIOS boot drive number
   3.148 +        mov     dl, [bx(DriveNumber)]   ; restore BIOS boot drive number
   3.149          int     13h                     ; extended read sectors (DL, DS:SI)
   3.150  
   3.151          jnc     ReadSuccess
   3.152  
   3.153 +%if ReadRetry != 0
   3.154          xor     ax, ax
   3.155          int     13h                     ; reset drive (DL)
   3.156          loop    ReadSectorRetry         ; up to 16 retries
   3.157 +%endif
   3.158  
   3.159          call    Error
   3.160          db      "Read error."
     4.1 --- a/diggerjs/receipt	Mon Sep 12 16:35:46 2022 +0000
     4.2 +++ b/diggerjs/receipt	Wed Sep 14 18:33:54 2022 +0000
     4.3 @@ -9,7 +9,8 @@
     4.4  SOURCE="digger.js"
     4.5  TARBALL="$SOURCE-$VERSION.zip"
     4.6  WEB_SITE="http://www.heise.de/software/download/digger.js/8148"
     4.7 -WGET_URL="https://www.tikkel.de/download/$TARBALL"
     4.8 +#WGET_URL="https://www.tikkel.de/download/$TARBALL"
     4.9 +WGET_URL="https://download.tuxfamily.org/slitaz/sources/packages-cooking/${TARBALL:0:1}/$TARBALL"
    4.10  
    4.11  # What is the latest version available today?
    4.12  current_version()
     5.1 --- a/nareto/receipt	Mon Sep 12 16:35:46 2022 +0000
     5.2 +++ b/nareto/receipt	Wed Sep 14 18:33:54 2022 +0000
     5.3 @@ -8,7 +8,7 @@
     5.4  LICENSE="GPL2"
     5.5  TARBALL="$PACKAGE-$VERSION.tar.gz"
     5.6  WEB_SITE="https://web.archive.org/web/20131008041555/http://www.nareto.org/"
     5.7 -WGET_URL="${WEB_SITE}srcs/$TARBALL"
     5.8 +WGET_URL="https://download.tuxfamily.org/slitaz/sources/packages-cooking/${TARBALL:0:1}/$TARBALL"
     5.9  CONFIG_FILES="/etc/nagios"
    5.10  BUGS="s/oreon/centreon/"
    5.11