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 = &pm;
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 }