wok-6.x annotate plop/stuff/unpack.S @ rev 25565

Reenable rpc for glibc, fix gpxe grub4dos receipt, fix linld url
author Stanislas Leduc <shann@slitaz.org>
date Tue May 09 17:24:00 2023 +0000 (13 months ago)
parents 89b052a8b781
children
rev   line source
pascal@23919 1 #define SYSTEM 0x10000
pascal@23919 2 #define SETUP 14
pascal@23919 3 #define SYSSIZE 0x1F4
pascal@23919 4 #define SETUPSIZE 0x1F1
pascal@23919 5
pascal@23919 6 #define KEEP_BOOTSECTOR 1
pascal@23919 7 #define LINUX_HEADER 0
pascal@23919 8 #define UPDATE_SYSSIZE 1
pascal@23919 9 #define FLAT16 1
pascal@23919 10 #define FLAT16OUT 1
pascal@25504 11 #define COPYTOHIGHMEM 0
pascal@25504 12 #define UPDATE_CODE32_START 0
pascal@25504 13 #define DOUBLE_PACKED 0
pascal@23919 14 #define SAVEREGS 0
pascal@23919 15 #define ELKS 0
pascal@23919 16
pascal@23919 17 .text
pascal@23919 18 .code16
pascal@23919 19 .org 0
pascal@23919 20
pascal@23919 21 #if KEEP_BOOTSECTOR
pascal@23919 22 #undef UPDATE_SYSSIZE
pascal@23919 23 #define UPDATE_SYSSIZE 0
pascal@23919 24 #endif
pascal@23919 25 #if ELKS
pascal@23919 26 .arch i8086
pascal@23919 27 #define FLAT16 1
pascal@25504 28 #define KEEP_BOOTSECTOR 1
pascal@23919 29 #define LINUX_HEADER 0
pascal@23919 30 #define SAVEREGS 0
pascal@23919 31 #define TOPSEG 0x2000
pascal@23919 32 #else
pascal@23919 33 #define TOPSEG 0x8000
pascal@23919 34 #endif
pascal@23919 35
pascal@25504 36 .macro pusham
pascal@25504 37 #if ELKS
pascal@25504 38 pushw %ax
pascal@25504 39 // movw %sp, %ax
pascal@25504 40 // incw %ax // emulate popa behaviour
pascal@25504 41 // incw %ax
pascal@25504 42 pushw %cx
pascal@25504 43 pushw %dx
pascal@25504 44 pushw %bx
pascal@25504 45 // pushw %ax // %sp
pascal@25504 46 pushw %bp
pascal@25504 47 pushw %si
pascal@25504 48 pushw %di
pascal@25504 49 #else
pascal@25504 50 pushaw
pascal@25504 51 #endif
pascal@25504 52 .endm
pascal@25504 53
pascal@25504 54 .macro popam
pascal@25504 55 #if ELKS
pascal@25504 56 popw %di
pascal@25504 57 popw %si
pascal@25504 58 popw %bp
pascal@25504 59 // popw %ax
pascal@25504 60 popw %bx
pascal@25504 61 popw %dx
pascal@25504 62 popw %cx
pascal@25504 63 popw %ax
pascal@25504 64 #else
pascal@25504 65 popaw
pascal@25504 66 #endif
pascal@25504 67 .endm
pascal@25504 68
pascal@25504 69 .macro pushm val
pascal@25504 70 #if ELKS
pascal@25504 71 movw \val, %ax
pascal@25504 72 pushw %ax
pascal@25504 73 #else
pascal@25504 74 pushw \val
pascal@25504 75 #endif
pascal@25504 76 .endm
pascal@25504 77
pascal@25504 78 .macro shrwm cnt, reg
pascal@25504 79 #if ELKS
pascal@25504 80 .rept \cnt
pascal@25504 81 shrw $1, \reg
pascal@25504 82 .endr
pascal@25504 83 #else
pascal@25504 84 shrw $\cnt, \reg
pascal@25504 85 #endif
pascal@25504 86 .endm
pascal@25504 87
pascal@23919 88 .globl _start
pascal@23919 89 _start:
pascal@23919 90 #if LINUX_HEADER
pascal@23919 91 jmp start2
pascal@23919 92 .ascii "HdrS" // 202 magic
pascal@23919 93 .word 0x200 // 206 version 2.00
pascal@23919 94 .long 0 // 208 realmode_swtch
pascal@23919 95 .word SYSTEM/16 // 20C start_sys_seg
pascal@23919 96 .word 0 // 20E kernel_version
pascal@23919 97 .byte 0 // 210 type_of_loader
pascal@23919 98 .byte 0 // 211 loadflags
pascal@23919 99 .word 0 // 212 setup_move_size
pascal@23919 100 .long SYSTEM // 214 code32_start
pascal@23919 101 .long 0 // 218 ramdisk_image
pascal@23919 102 .long 0 // 21C ramdisk_size
pascal@23919 103 .long 0 // 220 bootsect_kludge
pascal@23919 104 start2:
pascal@23919 105 #endif
pascal@23919 106 #if SAVEREGS
pascal@23919 107 pushfw
pascal@23919 108 pushw %cs
pascal@23919 109 pushw $0
pascal@25504 110 pusham
pascal@25504 111 xorw %si, %si
pascal@23919 112 pushw %ds
pascal@25504 113 pushw %es
pascal@23919 114 cld
pascal@23919 115 #else
pascal@25504 116 pushw %cs // return adress is %cs:0
pascal@25504 117 xorw %si, %si
pascal@25504 118 pushw %si
pascal@25504 119 #endif // SAVEREGS
pascal@25504 120 pushw %ds // <A> bootsector+setup segment
pascal@25504 121 #if FLAT16
pascal@25504 122 # 1- move 9000..9020+stp -> TOPSEG
pascal@25504 123 pushm $TOPSEG
pascal@25504 124 popw %es
pascal@25504 125 # if SAVEREGS
pascal@25504 126 setup_word:
pascal@25504 127 movw $SETUP*256+256, %cx
pascal@25504 128 pushw %cx // <B> bootsector+setup words
pascal@23919 129 # endif
pascal@25504 130 pushw %es // <C> TOPSEG
pascal@23919 131 pushw %es
pascal@25504 132 # if SAVEREGS
pascal@25504 133 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0
pascal@25504 134 pushm $0x200+cont
pascal@23919 135 rep
pascal@23919 136 movsw
pascal@23919 137 lret
pascal@23919 138 cont:
pascal@25504 139 # else
pascal@25504 140 movw $-0x200, %di
pascal@25504 141 call jumpinto
pascal@25504 142 # endif
pascal@23919 143 # 2- move 1000..1000+sys -> TOPSEG+stp
pascal@25504 144 pushm $0x1000
pascal@23919 145 popw %ds
pascal@25504 146 xorw %si, %si // %ds:%si = 1000:0
pascal@25504 147 subw %di, %cx // %cx = 64K - setupsz
pascal@23919 148 rep
pascal@23919 149 movsb
pascal@23919 150 # 3- unlz(TOPSEG+stp:end, 1000-stp:0)
pascal@23919 151 setup_seg:
pascal@25504 152 pushm $0x1000-(SETUP*32)-32
pascal@23919 153 popw %es
pascal@25504 154 #else // FLAT16
pascal@25504 155 # 1- move 9020..9020+unpack -> 0700 and jump into
pascal@25504 156 movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB)
pascal@25504 157 movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors
pascal@25504 158 pushw %es
pascal@25504 159 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000
pascal@25504 160 pushm $0x200+cont
pascal@25504 161 # if SAVEREGS
pascal@25504 162 rep
pascal@25504 163 movsw
pascal@25504 164 lret
pascal@23919 165 # else
pascal@25504 166 jmp jumpinto
pascal@23919 167 # endif
pascal@25504 168 cont:
pascal@25504 169 # 2- move 9020..9020+stp -> 9000-sys-stp
pascal@25504 170 movw %ds, %dx
pascal@25504 171 setup_byte:
pascal@25504 172 movb $SETUP+1, %ch
pascal@25504 173 setup_para:
pascal@25504 174 subw $SETUP*32+32+0xF000, %dx
pascal@23919 175 packed_syssize:
pascal@25504 176 movw $0+0x1000, %ax
pascal@25504 177 pushw %cx // <B> bootsector+setup words
pascal@25504 178 subw %ax, %dx
pascal@25504 179 movw %dx, %es
pascal@25504 180 pushw %es // <C> 9000-sys-stp
pascal@25504 181 xorw %si, %si
pascal@25504 182 xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0
pascal@25504 183 rep
pascal@25504 184 movsw
pascal@25504 185 # 3- move 1000..1000+sys -> 9000-sys
pascal@23919 186 movw %ds, %dx
pascal@23919 187 mvsys:
pascal@23919 188 decw %ax
pascal@23919 189 decw %dx
pascal@23919 190 movw %ax, %ds
pascal@23919 191 movw %dx, %es
pascal@23919 192 xorw %si, %si
pascal@23919 193 xorw %di, %di
pascal@23919 194 movw $8, %cx
pascal@23919 195 rep
pascal@23919 196 movsw
pascal@23919 197 cmpw $0x1000, %ax
pascal@23919 198 jne mvsys
pascal@25504 199 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
pascal@25504 200 setup_seg:
pascal@25504 201 pushm $0x1000-(SETUP*32)-32
pascal@23919 202 popw %es
pascal@23919 203 #endif // FLAT16
pascal@23919 204 popw %ds // <C>
pascal@25504 205 #if FLAT16 && SAVEREGS == 0
pascal@25504 206 movw $end-_start, %si // %ds:%si = TOPSSEG:compressed
pascal@25504 207 #else
pascal@25504 208 movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed
pascal@25504 209 #endif
pascal@23919 210 #if KEEP_BOOTSECTOR
pascal@25504 211 setup_keep:
pascal@25504 212 xorw %di, %di
pascal@23919 213 #else
pascal@25504 214 # if UPDATE_SYSSIZE
pascal@25504 215 setup_syssize:
pascal@25504 216 movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE
pascal@25504 217 # else
pascal@25504 218 movw $0x200, %di
pascal@25504 219 # endif
pascal@23919 220 #endif
pascal@25504 221 pushw %di
pascal@25504 222 pushw %es
pascal@25504 223 #if DOUBLE_PACKED
pascal@25504 224 double_packed:
pascal@25504 225 pushm $0x4000
pascal@25504 226 popw %es
pascal@23919 227 pushw %di
pascal@23919 228 pushw %es
pascal@23919 229 call unpack
pascal@23919 230 popw %ds
pascal@23919 231 popw %si
pascal@25504 232 popw %es
pascal@25504 233 popw %di
pascal@25504 234 pushw %di
pascal@25504 235 pushw %es
pascal@25504 236 #endif
pascal@25504 237 call unpack
pascal@25504 238 #if COPYTOHIGHMEM
pascal@25504 239 # if FLAT16OUT
pascal@25504 240 movw $0x9310+1, %ax // from 1000:FFFF
pascal@25504 241 # else
pascal@25504 242 # if 0
pascal@25504 243 movw %es, %ax
pascal@25504 244 shrw $12, %ax
pascal@25504 245 orw $0x9310, %ax
pascal@25504 246 # else
pascal@25504 247 movw $0x9310+7, %ax // from 7000:FFFF
pascal@25504 248 # endif
pascal@25504 249 # endif
pascal@25504 250 pushw %ss
pascal@25504 251 popw %es
pascal@25504 252 movw $8, %cx
pascal@25504 253 zero1:
pascal@25504 254 pushw $0 // 2E..20
pascal@25504 255 loop zero1
pascal@25504 256 src:
pascal@25504 257 pushw %cx // 1E, 16
pascal@25504 258 pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx
pascal@25504 259 pushw %cx
pascal@25504 260 pushw $-1 // 18, 10: full 64K segment
pascal@25504 261 subb $0x10, %al
pascal@25504 262 jnc src
pascal@25504 263 movb $8, %cl
pascal@25504 264 zero2:
pascal@25504 265 pushw $0 // 0E..00
pascal@25504 266 loop zero2
pascal@25504 267 movw %sp, %si
pascal@25504 268 syslp:
pascal@25504 269 movb $0x80, %ch
pascal@25504 270 movb $0x87, %ah
pascal@25504 271 int $0x15
pascal@25504 272 # if FLAT16OUT == 0
pascal@25504 273 decb %es:0x1C(%si)
pascal@25504 274 decb %es:0x14(%si)
pascal@25504 275 jne syslp // down to 1000:0000
pascal@25504 276 # endif
pascal@25504 277 addw $0x30, %sp
pascal@25504 278 #endif // COPYTOHIGHMEM
pascal@25504 279 popw %ds
pascal@25504 280 popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0
pascal@25504 281 #if UPDATE_CODE32_START
pascal@25504 282 update_code32_start:
pascal@25504 283 // movb $1, 0x216
pascal@25504 284 #endif
pascal@25504 285 #if FLAT16 == 0 || SAVEREGS
pascal@25504 286 popw %cx // <B> bootsector+setup words
pascal@25504 287 #endif
pascal@25504 288 popw %es // <A> bootsector+setup segment
pascal@23919 289 movw %si, %di
pascal@25504 290 jumpinto:
pascal@25504 291 #if FLAT16 && SAVEREGS == 0
pascal@25504 292 setup_word:
pascal@25504 293 movw $SETUP*256+256, %cx
pascal@23919 294 #endif
pascal@25504 295 # 5- move 1000-stp..1000 -> 9000
pascal@23919 296 rep
pascal@23919 297 movsw
pascal@23919 298 #if SAVEREGS
pascal@25504 299 popw %es
pascal@23919 300 popw %ds
pascal@25504 301 popam
pascal@23919 302 iret
pascal@23919 303 #else
pascal@23919 304 lret
pascal@23919 305 #endif
pascal@23919 306
pascal@23919 307 unpack:
pascal@23919 308 #define NO_LZMA_HEADER
pascal@25504 309 #define NO_LZSA2_HEADER
pascal@25504 310 #define NO_LZSA1_HEADER
pascal@25504 311 #define NO_LZ4_HEADER
pascal@23919 312 #if ELKS
pascal@23919 313 #define ONLY8086 1
pascal@23919 314 #endif
pascal@25504 315 #if defined(FLAT16OUT) && FLAT16OUT == 0
pascal@25504 316 #undef FLAT16OUT
pascal@25504 317 #endif
pascal@25504 318 #if defined(FLAT16) && FLAT16 == 0
pascal@25504 319 #undef FLAT16
pascal@25504 320 #endif
pascal@25504 321 #include "uncompress.S"
pascal@23919 322
pascal@23919 323 end: