wok annotate linld/stuff/src/HIMEM.CPP @ rev 23996
linld: add iso support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Jan 08 20:15:35 2021 +0000 (2021-01-08) |
parents | 3d19917d3a03 |
children | bc4b94310a29 |
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@22152 | 13 m->buf = m->fallback; // set no_exit btw: die() won't return to DOS |
pascal@23996 | 14 u32* bufv= &himem_buf; |
pascal@23992 | 15 if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ? |
pascal@19538 | 16 if(vcpi) { |
pascal@20528 | 17 bufv = (u32 *)malloc_bufv_or_die(m); // update m->bufv |
pascal@19515 | 18 } |
pascal@23992 | 19 #ifdef WITH_XMM_ALLOC |
pascal@19580 | 20 else { |
pascal@19562 | 21 xmm_alloc(m); // update m->buf |
pascal@19538 | 22 } |
pascal@23992 | 23 #endif |
pascal@19515 | 24 } |
pascal@23996 | 25 himem_buf = m->buf; |
pascal@19538 | 26 do { |
pascal@19571 | 27 u16 size; |
pascal@21735 | 28 if(s16(size = read_image(m)) -1 < 0) break; |
pascal@20538 | 29 storepage(bufv); |
pascal@23996 | 30 if (bufv != &himem_buf) next(bufv); |
pascal@23996 | 31 himem_buf += size; |
pascal@19538 | 32 } while (*bufv); |
pascal@23996 | 33 if(m->remaining) loadfailure(); |
pascal@19538 | 34 close(m->fd2close); |
pascal@19515 | 35 } |
pascal@20538 | 36 |
pascal@20538 | 37 // Called just before rm->pm |
pascal@21332 | 38 void far last_ditch() { |
pascal@21332 | 39 asm { |
pascal@21332 | 40 cli |
pascal@21332 | 41 push ds |
pascal@21332 | 42 push cs |
pascal@21332 | 43 pop ds |
pascal@21332 | 44 # ifdef NO386 |
pascal@21332 | 45 push ax |
pascal@21332 | 46 push bx |
pascal@21332 | 47 push cx |
pascal@21332 | 48 push dx |
pascal@21332 | 49 # else |
pascal@21332 | 50 pusha |
pascal@21332 | 51 # endif |
pascal@21332 | 52 } |
pascal@23996 | 53 vm2rm(); |
pascal@20538 | 54 struct image_himem *m = ± |
pascal@20538 | 55 u32 *q; |
pascal@21569 | 56 if(((u16 *)&m->fallback)[1] >= 0x10) // >= _1m ? |
pascal@21569 | 57 ((u16 *)&m->fallback)[1] = 0x10; |
pascal@20538 | 58 q = m->bufv; |
pascal@20538 | 59 if(q==0) { |
pascal@20538 | 60 // Move kernel |
pascal@20538 | 61 memcpy_image(m); |
pascal@20538 | 62 // Move initrd |
pascal@20538 | 63 memcpy_image(pm2initrd(m)); |
pascal@20538 | 64 } else { //vcpi |
pascal@20538 | 65 #if defined(__BORLANDC__) && defined(NO386) |
pascal@20538 | 66 #pragma option -3 |
pascal@20538 | 67 asm{ |
pascal@20538 | 68 .386p |
pascal@20538 | 69 } |
pascal@20538 | 70 #endif |
pascal@20538 | 71 // Move kernel |
pascal@20538 | 72 // 'Gathering' copy in chunks of PAGE_SIZE |
pascal@20538 | 73 // No risk of overlapping: kernel is copied from above to 1m mark |
pascal@20538 | 74 m->size = pm2initrd(m)->size = PAGE_SIZE; |
pascal@20543 | 75 #define ADD_PAGE(x) (*(unsigned long *)(((char *)&x)+1)+=PAGE_SIZE/256) |
pascal@20543 | 76 #define SUB_PAGE(x) (*(unsigned long *)(((char *)&x)+1)-=PAGE_SIZE/256) |
pascal@20538 | 77 reset_bufv(q); |
pascal@20538 | 78 do { |
pascal@20538 | 79 m->buf = *q; |
pascal@20538 | 80 memcpy_image(m); |
pascal@20543 | 81 next(q); ADD_PAGE(m->fallback); |
pascal@20538 | 82 } while(*q); |
pascal@20538 | 83 // Move initrd |
pascal@20538 | 84 m = pm2initrd(m); |
pascal@20538 | 85 if(((u16 *)&m->fallback)[1]) { |
pascal@20538 | 86 // This is tricky: copy initrd backwards to reduce |
pascal@20538 | 87 // risk of overlapping: use the fact that initrd is copied |
pascal@20538 | 88 // to the very top of ram |
pascal@20538 | 89 // (overlapping still can happen with more than 256mb ram) |
pascal@20538 | 90 // (generic solution for this overwrite problem, anyone?) |
pascal@20538 | 91 q=m->bufv; |
pascal@20538 | 92 reset_bufv(q); |
pascal@20538 | 93 do { |
pascal@20543 | 94 next(q); ADD_PAGE(m->fallback); |
pascal@20538 | 95 } while(*q); |
pascal@20538 | 96 do { |
pascal@20543 | 97 prev(q); SUB_PAGE(m->fallback); |
pascal@20538 | 98 m->buf = *q; |
pascal@20538 | 99 memcpy_image(m); |
pascal@20538 | 100 } while(q != m->bufv); |
pascal@20538 | 101 } |
pascal@20538 | 102 } |
pascal@21332 | 103 asm { |
pascal@21332 | 104 # ifdef NO386 |
pascal@21332 | 105 pop dx |
pascal@21332 | 106 pop cx |
pascal@21332 | 107 pop bx |
pascal@21332 | 108 pop ax |
pascal@21332 | 109 # else |
pascal@21332 | 110 popa |
pascal@21332 | 111 # endif |
pascal@21332 | 112 pop ds |
pascal@21332 | 113 } |
pascal@20538 | 114 } |