wok annotate linld/stuff/src/HIMEM.CPP @ rev 24998

Up rp-pppoe (3.15)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon May 16 10:11:22 2022 +0000 (2022-05-16)
parents 61df94a0fa43
children
rev   line source
pascal@19515 1 // This file is distributed under GPL
pascal@19515 2 //
pascal@19515 3 // High mem handling routines
pascal@19515 4 // C++ part of VCPI madness is here
pascal@19515 5
pascal@19515 6 #include "crtl.h"
pascal@19515 7 #include "common.h"
pascal@19515 8
pascal@23996 9 extern u32 himem_buf;
pascal@19571 10
pascal@19515 11 void load_image(struct image_himem *m) {
pascal@19515 12 m->remaining = m->size;
pascal@24013 13 u32* bufv= &himem_buf;
pascal@24019 14 #ifdef VCPI
pascal@24013 15 #ifdef WITH_XMM_ALLOC
pascal@22152 16 m->buf = m->fallback; // set no_exit btw: die() won't return to DOS
pascal@23992 17 if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ?
pascal@19538 18 if(vcpi) {
pascal@20528 19 bufv = (u32 *)malloc_bufv_or_die(m); // update m->bufv
pascal@19515 20 }
pascal@19580 21 else {
pascal@19562 22 xmm_alloc(m); // update m->buf
pascal@19538 23 }
pascal@19515 24 }
pascal@23996 25 himem_buf = m->buf;
pascal@24013 26 #else
pascal@24013 27 *bufv = m->buf = m->fallback; // set no_exit btw: die() won't return to DOS
pascal@24013 28 if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ?
pascal@24013 29 if(vcpi) {
pascal@24013 30 bufv = (u32 *)malloc_bufv_or_die(m); // update m->bufv
pascal@24013 31 }
pascal@24013 32 }
pascal@24013 33 #endif
pascal@24019 34 #else
pascal@24019 35 m->buf = m->fallback; // set no_exit btw: die() won't return to DOS
pascal@24019 36 #ifdef WITH_XMM_ALLOC
pascal@24019 37 if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ?
pascal@24019 38 xmm_alloc(m); // update m->buf
pascal@24019 39 }
pascal@24019 40 himem_buf = m->buf;
pascal@24019 41 #endif
pascal@24019 42 #endif
pascal@19538 43 do {
pascal@19571 44 u16 size;
pascal@21735 45 if(s16(size = read_image(m)) -1 < 0) break;
pascal@20538 46 storepage(bufv);
pascal@24019 47 #ifdef VCPI
pascal@23996 48 if (bufv != &himem_buf) next(bufv);
pascal@24019 49 #endif
pascal@23996 50 himem_buf += size;
pascal@19538 51 } while (*bufv);
pascal@23996 52 if(m->remaining) loadfailure();
pascal@19538 53 close(m->fd2close);
pascal@19515 54 }
pascal@20538 55
pascal@20538 56 // Called just before rm->pm
pascal@21332 57 void far last_ditch() {
pascal@21332 58 asm {
pascal@24013 59 pushf
pascal@24013 60 ;cli
pascal@21332 61 push ds
pascal@24034 62 push es
pascal@21332 63 push cs
pascal@21332 64 pop ds
pascal@21332 65 # ifdef NO386
pascal@21332 66 push ax
pascal@21332 67 push bx
pascal@21332 68 push cx
pascal@21332 69 push dx
pascal@21332 70 # else
pascal@21332 71 pusha
pascal@21332 72 # endif
pascal@21332 73 }
pascal@24019 74 #ifdef VCPI
pascal@23996 75 vm2rm();
pascal@24019 76 #endif
pascal@20538 77 struct image_himem *m = &pm;
pascal@24013 78 #define KERNEL 0
pascal@24013 79 #define INITRD 1
pascal@24013 80 if(((u16 *)&m[KERNEL].fallback)[1] >= 0x10) // >= _1m ?
pascal@24013 81 ((u16 *)&m[KERNEL].fallback)[1] = 0x10;
pascal@24019 82 #ifdef VCPI
pascal@24019 83 u32 *q;
pascal@24013 84 q = m[KERNEL].bufv;
pascal@20538 85 if(q==0) {
pascal@24019 86 #endif
pascal@20538 87 // Move kernel
pascal@24013 88 memcpy_image_kernel();
pascal@20538 89 // Move initrd
pascal@24013 90 memcpy_image_initrd();
pascal@24019 91 #ifdef VCPI
pascal@24034 92 } else { //vcpi FIXME: LARGE_ZIMAGE case
pascal@20538 93 #if defined(__BORLANDC__) && defined(NO386)
pascal@20538 94 #pragma option -3
pascal@20538 95 asm{
pascal@20538 96 .386p
pascal@24034 97 pushad
pascal@20538 98 }
pascal@20538 99 #endif
pascal@20538 100 // Move kernel
pascal@20538 101 // 'Gathering' copy in chunks of PAGE_SIZE
pascal@20538 102 // No risk of overlapping: kernel is copied from above to 1m mark
pascal@24013 103 m[KERNEL].size = m[INITRD].size = PAGE_SIZE;
pascal@20543 104 #define ADD_PAGE(x) (*(unsigned long *)(((char *)&x)+1)+=PAGE_SIZE/256)
pascal@20543 105 #define SUB_PAGE(x) (*(unsigned long *)(((char *)&x)+1)-=PAGE_SIZE/256)
pascal@20538 106 reset_bufv(q);
pascal@20538 107 do {
pascal@24013 108 m[KERNEL].buf = *q;
pascal@24013 109 memcpy_image_kernel();
pascal@24013 110 next(q); ADD_PAGE(m[KERNEL].fallback);
pascal@20538 111 } while(*q);
pascal@20538 112 // Move initrd
pascal@24013 113 if(((u16 *)&m[INITRD].fallback)[1]) {
pascal@20538 114 // This is tricky: copy initrd backwards to reduce
pascal@20538 115 // risk of overlapping: use the fact that initrd is copied
pascal@20538 116 // to the very top of ram
pascal@20538 117 // (overlapping still can happen with more than 256mb ram)
pascal@20538 118 // (generic solution for this overwrite problem, anyone?)
pascal@24013 119 q=m[INITRD].bufv;
pascal@20538 120 reset_bufv(q);
pascal@20538 121 do {
pascal@24013 122 next(q); ADD_PAGE(m[INITRD].fallback);
pascal@20538 123 } while(*q);
pascal@20538 124 do {
pascal@24013 125 prev(q); SUB_PAGE(m[INITRD].fallback);
pascal@24013 126 m[INITRD].buf = *q;
pascal@24013 127 memcpy_image_initrd();
pascal@24013 128 } while(q != m[INITRD].bufv);
pascal@20538 129 }
pascal@24034 130 asm{
pascal@24034 131 popad
pascal@24034 132 }
pascal@20538 133 }
pascal@24019 134 #endif
pascal@21332 135 asm {
pascal@21332 136 # ifdef NO386
pascal@21332 137 pop dx
pascal@21332 138 pop cx
pascal@21332 139 pop bx
pascal@21332 140 pop ax
pascal@21332 141 # else
pascal@21332 142 popa
pascal@21332 143 # endif
pascal@24034 144 pop es
pascal@21332 145 pop ds
pascal@24013 146 popf
pascal@21332 147 }
pascal@20538 148 }