wok annotate linld/stuff/src/HIMEM.CPP @ rev 22059
updated tuxpaint (0.9.21 -> 0.9.23)
author | Hans-G?nter Theisgen |
---|---|
date | Wed Oct 23 17:46:33 2019 +0100 (2019-10-23) |
parents | 87b6697bb350 |
children | 306a4bbdee7d |
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@19580 | 9 int skip_alloc; |
pascal@19571 | 10 |
pascal@19515 | 11 void load_image(struct image_himem *m) { |
pascal@19515 | 12 no_exit++; // die() won't return to DOS |
pascal@19515 | 13 m->remaining = m->size; |
pascal@19562 | 14 m->buf = m->fallback; |
pascal@19562 | 15 u32 buf; |
pascal@19538 | 16 u32* bufv= &buf; |
pascal@19580 | 17 if(((u16 *)&m->fallback)[1] >= 0x10 && !skip_alloc) { // >= _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@19562 | 25 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@19571 | 30 if (bufv != &buf) next(bufv); |
pascal@19538 | 31 buf += size; |
pascal@19538 | 32 } while (*bufv); |
pascal@19515 | 33 if(m->remaining) die("Read error"); |
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@20538 | 53 struct image_himem *m = ± |
pascal@20538 | 54 u32 *q; |
pascal@20538 | 55 vm2rm(); |
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 } |