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

Up firefox-official (67.0.3), tinyproxy (1.10.0)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Jun 19 17:26:14 2019 +0200 (2019-06-19)
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 = &pm;
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 }