wok annotate linld/stuff/src/HIMEM.CPP @ rev 24988
Fix perl-gd & tcptrack
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Thu May 12 11:01:25 2022 +0000 (2022-05-12) |
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 = ± |
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 } |