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