# HG changeset patch # User Pascal Bellard # Date 1465669602 -7200 # Node ID df186455938ff33c652a02b4a8625155be2674aa # Parent 86c9fae82f470209bdb0e856b9a18bc4cf265fe2 linld/tobzimage: add realmode_switch support (again) diff -r 86c9fae82f47 -r df186455938f linld/stuff/jump.u --- a/linld/stuff/jump.u Sat Jun 11 15:57:21 2016 +0200 +++ b/linld/stuff/jump.u Sat Jun 11 20:26:42 2016 +0200 @@ -1,47 +1,47 @@ --- LINLD097/JUMP.ASM +++ LINLD097/JUMP.ASM @@ -24,33 +24,22 @@ - jmpseg :word, \ - jmpofs :word = PARAM_SIZE - -- push bp ;TODO: kinda useless, isn't it? -- mov bp,sp -- -- ;;mov ax,[jmpseg] ;Move data to CS segment var -- ;;mov [seg2],ax ; we cannot use any other seg! -- ;;mov ax,[jmpofs] ; -- ;;mov [ofs2],ax ; -- mov cx,[jmpofs] ;Do NOT load in r32: -- mov dx,[jmpseg] ; wrong order! -- -- mov ax,[sreg] -- mov sp,[stk] ;Do not use [bp+n] after this... -- mov ds,ax -- mov es,ax -- mov ss,ax -- mov fs,ax -- mov gs,ax -+ pop bx ;caller return address -+ pop bx ; sreg -+ pop ax ; stk -+ pop dx ; jmpseg -+ pop cx ; jmpofs -+ mov ds,bx -+ mov es,bx -+ mov fs,bx -+ mov gs,bx -+ mov ss,bx -+ xchg sp,ax - assume nothing - assume cs:DGROUP - -- ;;jmp [dword ofs2] -- - push dx cx - retf --; Data --;;ofs2 dw ? --;;seg2 dw ? - endp _set_sregs_jump_seg_ofs - - ends _TEXT + jmpseg :word, \ + jmpofs :word = PARAM_SIZE + +- push bp ;TODO: kinda useless, isn't it? +- mov bp,sp +- +- ;;mov ax,[jmpseg] ;Move data to CS segment var +- ;;mov [seg2],ax ; we cannot use any other seg! +- ;;mov ax,[jmpofs] ; +- ;;mov [ofs2],ax ; +- mov cx,[jmpofs] ;Do NOT load in r32: +- mov dx,[jmpseg] ; wrong order! +- +- mov ax,[sreg] +- mov sp,[stk] ;Do not use [bp+n] after this... +- mov ds,ax +- mov es,ax +- mov ss,ax +- mov fs,ax +- mov gs,ax ++ pop bx ;caller return address ++ pop bx ; sreg ++ pop ax ; stk ++ pop dx ; jmpseg ++ pop cx ; jmpofs ++ mov ds,bx ++ mov es,bx ++ mov fs,bx ++ mov gs,bx ++ mov ss,bx ++ xchg sp,ax + assume nothing + assume cs:DGROUP + +- ;;jmp [dword ofs2] +- + push dx cx + retf +-; Data +-;;ofs2 dw ? +-;;seg2 dw ? + endp _set_sregs_jump_seg_ofs + + ends _TEXT diff -r 86c9fae82f47 -r df186455938f linld/stuff/load.u --- a/linld/stuff/load.u Sat Jun 11 15:57:21 2016 +0200 +++ b/linld/stuff/load.u Sat Jun 11 20:26:42 2016 +0200 @@ -5,15 +5,15 @@ if(first1k->boot_flag != 0xAA55) die("No boot signature (55,AA). It's not a kernel"); - if(first1k->header != HdrS) -+ if(first1k->header != HdrS) // starting linux 1.3.73 - die("No 'HdrS' signature (kernel is too old)"); -+ die("No 'HdrS' signature (kernel is too old, try /usr/bin/tobzimage)"); - if(first1k->version < 0x202) - die("Loader protocol version is less than 2.02 (kernel is too old)"); ++ if(first1k->header != HdrS) // starting linux 1.3.73 ++ die("No 'HdrS' signature (kernel is too old, try /usr/bin/tobzimage)"); if(!(first1k->loadflags & 0x01)) die("I can't load bzImages low"); -@@ -414,7 +412,13 @@ +@@ -414,15 +412,23 @@ // Tell rm loader some info first1k->vid_mode = vid_mode; @@ -28,3 +28,17 @@ first1k->type_of_loader = 0xff; // kernel do not know us (yet :-) // * will be called just before rm -> pm first1k->realmode_switch_ofs = ofs(last_ditch); + first1k->realmode_switch_seg = seg(last_ditch); +- // * offset limit of the setup heap +- // heap_end_ptr appears to be relative to the start of setup (ofs 0x0200) +- first1k->heap_end_ptr = _32k-0x0200; +- first1k->loadflags |= 0x80; // says to rm loader it's ok to use heap ++ if(first1k->version >= 0x201) { ++ // * offset limit of the setup heap ++ // heap_end_ptr appears to be relative to the start of setup (ofs 0x0200) ++ first1k->heap_end_ptr = _32k-0x0200; ++ first1k->loadflags |= 0x80; // says to rm loader it's ok to use heap ++ } + // * if we will ever stop moving ourself to 0x90000 + // we must say setup.S how much to move + //first1k->setup_move_size = _32k;