wok diff linld/stuff/jump.u @ rev 19898
linld/tazboot: fix set_kernel
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Apr 07 21:50:50 2017 +0200 (2017-04-07) |
parents | df186455938f |
children |
line diff
1.1 --- a/linld/stuff/jump.u Sat Jun 11 20:26:42 2016 +0200 1.2 +++ b/linld/stuff/jump.u Fri Apr 07 21:50:50 2017 +0200 1.3 @@ -1,9 +1,32 @@ 1.4 --- LINLD097/JUMP.ASM 1.5 +++ LINLD097/JUMP.ASM 1.6 -@@ -24,33 +24,22 @@ 1.7 - jmpseg :word, \ 1.8 - jmpofs :word = PARAM_SIZE 1.9 +@@ -7,9 +7,16 @@ 1.10 + %nomacs 1.11 + p386 1.12 1.13 +- group DGROUP _TEXT 1.14 ++ group DGROUP _TEXT,_DATA 1.15 + assume cs:DGROUP,ds:DGROUP 1.16 + 1.17 ++ segment _DATA byte public use16 'DATA' 1.18 ++ 1.19 ++ global _saved15:dword 1.20 ++ global _first1k:word 1.21 ++ 1.22 ++ ends _DATA 1.23 ++ 1.24 + segment _TEXT byte public use16 'CODE' 1.25 + 1.26 + ;*************************************************************** 1.27 +@@ -19,38 +26,102 @@ 1.28 + global _set_sregs_jump_seg_ofs:near 1.29 + proc _set_sregs_jump_seg_ofs near 1.30 + 1.31 +- arg sreg :word, \ 1.32 +- stk :word, \ 1.33 +- jmpseg :word, \ 1.34 +- jmpofs :word = PARAM_SIZE 1.35 +- 1.36 - push bp ;TODO: kinda useless, isn't it? 1.37 - mov bp,sp 1.38 - 1.39 @@ -21,27 +44,108 @@ 1.40 - mov ss,ax 1.41 - mov fs,ax 1.42 - mov gs,ax 1.43 -+ pop bx ;caller return address 1.44 -+ pop bx ; sreg 1.45 ++ mov bx, 202h 1.46 ++ add bx,[_first1k] 1.47 ++ cmp [dword bx],'SrdH' ; head version >= 2 ? 1.48 ++ jne oldzimage 1.49 ++ test [byte bx+0Fh],1 ; load high ? (clear C) 1.50 ++ jne isbzimage 1.51 ++oldzimage: 1.52 ++ ; finish loading 1.53 ++ extrn @last_ditch$qv 1.54 ++ push cs 1.55 ++ call near @last_ditch$qv 1.56 ++ ; self move 1.57 ++ cld 1.58 ++ push 9820h ; 512 bytes for cmdline 1.59 ++ pop es 1.60 ++ xor di,di 1.61 ++ mov si,di 1.62 ++ extrn _bss_end 1.63 ++ mov cx,offset _bss_end 1.64 ++ rep 1.65 ++ movsb 1.66 ++ push es 1.67 ++ call near doretf 1.68 ++ stc 1.69 ++isbzimage: 1.70 ++ pop ax ;caller return address 1.71 ++ pop dx ; jmpseg 1.72 ++ pop bx ; jmpofs 1.73 + pop ax ; stk 1.74 -+ pop dx ; jmpseg 1.75 -+ pop cx ; jmpofs 1.76 -+ mov ds,bx 1.77 -+ mov es,bx 1.78 -+ mov fs,bx 1.79 -+ mov gs,bx 1.80 -+ mov ss,bx 1.81 ++ pop ss ; sseg 1.82 + xchg sp,ax 1.83 ++ push dx bx 1.84 ++ jnc nomove 1.85 ++ ; DOS shutdown 1.86 ++ xor si,si 1.87 ++ mov ds,si 1.88 ++ push [dword si+4] 1.89 ++ mov [word cs:loadsp19+1],sp 1.90 ++ ;cmp [byte si+7],0F0h 1.91 ++ ;jnc notdos 1.92 ++ mov [word si+4],offset step19 1.93 ++ mov [si+6],cs 1.94 ++ pushf 1.95 ++ pop ax 1.96 ++ inc ah 1.97 ++ push ax 1.98 ++ popf 1.99 ++ jmp small [dword si+4*19h] 1.100 ++doiret: 1.101 ++ iret 1.102 ++step19: 1.103 ++ push si 1.104 ++ push ds 1.105 ++ mov si,sp 1.106 ++ lds si,[dword ss:si+4] 1.107 ++ cmp [word si],19CDh 1.108 ++ pop ds 1.109 ++ pop si 1.110 ++ jne doiret 1.111 ++ xor si,si 1.112 ++ mov ds,si 1.113 ++notdos: 1.114 ++loadsp19: 1.115 ++ mov sp,0 1.116 ++ pop [dword si+4] 1.117 ++ ; move zImage system 1.118 ++ ; memcpy32(dstseg=0, dstofs=10000h, srcseg=0, srcofs=100000h, size=80000h) 1.119 ++ push cs 1.120 ++ pop ds 1.121 ++ push 8 1.122 ++ push si ; size 1.123 ++ push 10h ; src 1.124 ++ push si ; ofs 1.125 ++ push si ; srcseg 1.126 ++ push 1 ; dst 1.127 ++ push si ; ofs 1.128 ++ push si ; dstseg 1.129 ++ extrn _memcpy32 1.130 ++ call near _memcpy32 1.131 ++ add sp,16 1.132 ++nomove: 1.133 ++ push ss 1.134 ++ pop ds 1.135 ++ push ss 1.136 ++ pop es 1.137 ++ push ss 1.138 ++ pop fs 1.139 ++ push ss 1.140 ++ pop gs 1.141 assume nothing 1.142 assume cs:DGROUP 1.143 1.144 - ;;jmp [dword ofs2] 1.145 - 1.146 - push dx cx 1.147 +- push dx cx 1.148 ++doretf: 1.149 retf 1.150 -; Data 1.151 -;;ofs2 dw ? 1.152 -;;seg2 dw ? 1.153 ++ 1.154 ++movedend: 1.155 endp _set_sregs_jump_seg_ofs 1.156 1.157 ends _TEXT