wok diff linld/stuff/src/HIMEM.CPP @ rev 20538

linld: _fastcall calls
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Nov 28 19:46:10 2018 +0100 (2018-11-28)
parents f0d71e920c5a
children 16d1d23aefee
line diff
     1.1 --- a/linld/stuff/src/HIMEM.CPP	Fri Nov 09 16:37:55 2018 +0100
     1.2 +++ b/linld/stuff/src/HIMEM.CPP	Wed Nov 28 19:46:10 2018 +0100
     1.3 @@ -9,50 +9,6 @@
     1.4  struct image_himem imgs[2];
     1.5  int skip_alloc;
     1.6  
     1.7 -// Called just before rm->pm
     1.8 -void last_ditch() {
     1.9 -    struct image_himem *m = &pm;
    1.10 -    vm2rm();
    1.11 -    if(((u16 *)&m->fallback)[1] >= 0x10) m->fallback = _1m; // >= _1m ?
    1.12 -    if(m->bufv==0) {
    1.13 -        // Move kernel
    1.14 -        memcpy_image(m);
    1.15 -        // Move initrd
    1.16 -        memcpy_image(&initrd);
    1.17 -    } else { //vcpi
    1.18 -        // Move kernel
    1.19 -        // 'Gathering' copy in chunks of PAGE_SIZE
    1.20 -        // No risk of overlapping: kernel is copied from above to 1m mark
    1.21 -        m->size = initrd.size = PAGE_SIZE;
    1.22 -        u32 *p = m->bufv;
    1.23 -	reset_bufv(p);
    1.24 -	if (p) do {
    1.25 -            m->buf = *p;
    1.26 -            memcpy_image(m);
    1.27 -            next(p); m->fallback+=PAGE_SIZE;
    1.28 -        } while(*p);
    1.29 -        // Move initrd
    1.30 -	m = &initrd;
    1.31 -        if(m->fallback) {
    1.32 -            // This is tricky: copy initrd backwards to reduce
    1.33 -            // risk of overlapping: use the fact that initrd is copied
    1.34 -            // to the very top of ram
    1.35 -            // (overlapping still can happen with more than 256mb ram)
    1.36 -            // (generic solution for this overwrite problem, anyone?)
    1.37 -            p=m->bufv;
    1.38 -	    reset_bufv(p);
    1.39 -            do {
    1.40 -                next(p); m->fallback+=PAGE_SIZE;
    1.41 -            } while(*p);
    1.42 -            do {
    1.43 -                prev(p); m->fallback-=PAGE_SIZE;
    1.44 -                m->buf = *p;
    1.45 -                memcpy_image(m);
    1.46 -            } while(p != m->bufv);
    1.47 -        }
    1.48 -    }
    1.49 -}
    1.50 -
    1.51  void load_image(struct image_himem *m) {
    1.52      no_exit++;       // die() won't return to DOS
    1.53      m->remaining = m->size;
    1.54 @@ -69,13 +25,63 @@
    1.55      }
    1.56      buf = m->buf;
    1.57      do {
    1.58 -	u8 xfer_buf[PAGE_SIZE];
    1.59          u16 size;
    1.60 -	if(s16(size = read_image(m, xfer_buf, PAGE_SIZE)) <= 0) break;
    1.61 -        storepage(bufv, ofs(xfer_buf));
    1.62 +	if(s16(size = read_image(m)) <= 0) break;
    1.63 +        storepage(bufv);
    1.64  	if (bufv != &buf) next(bufv);
    1.65          buf += size;
    1.66      } while (*bufv);
    1.67      if(m->remaining) die("Read error");
    1.68      close(m->fd2close);
    1.69  }
    1.70 +
    1.71 +// Called just before rm->pm
    1.72 +void last_ditch() {
    1.73 +    struct image_himem *m = &pm;
    1.74 +    u32 *q;
    1.75 +    vm2rm();
    1.76 +    if(((u16 *)&m->fallback)[1] >= 0x10) m->fallback = _1m; // >= _1m ?
    1.77 +    q = m->bufv;
    1.78 +    if(q==0) {
    1.79 +        // Move kernel
    1.80 +        memcpy_image(m);
    1.81 +        // Move initrd
    1.82 +        memcpy_image(pm2initrd(m));
    1.83 +    } else { //vcpi
    1.84 +#if defined(__BORLANDC__) && defined(NO386)
    1.85 +#pragma option -3
    1.86 +	asm{
    1.87 +		.386p
    1.88 +	}
    1.89 +#endif
    1.90 +        // Move kernel
    1.91 +        // 'Gathering' copy in chunks of PAGE_SIZE
    1.92 +        // No risk of overlapping: kernel is copied from above to 1m mark
    1.93 +        m->size = pm2initrd(m)->size = PAGE_SIZE;
    1.94 +	reset_bufv(q);
    1.95 +	do {
    1.96 +            m->buf = *q;
    1.97 +            memcpy_image(m);
    1.98 +            next(q); m->fallback+=PAGE_SIZE;
    1.99 +        } while(*q);
   1.100 +        // Move initrd
   1.101 +	m = pm2initrd(m);
   1.102 +        if(((u16 *)&m->fallback)[1]) {
   1.103 +            // This is tricky: copy initrd backwards to reduce
   1.104 +            // risk of overlapping: use the fact that initrd is copied
   1.105 +            // to the very top of ram
   1.106 +            // (overlapping still can happen with more than 256mb ram)
   1.107 +            // (generic solution for this overwrite problem, anyone?)
   1.108 +            q=m->bufv;
   1.109 +	    reset_bufv(q);
   1.110 +            do {
   1.111 +                next(q); m->fallback+=PAGE_SIZE;
   1.112 +            } while(*q);
   1.113 +            do {
   1.114 +                prev(q); m->fallback-=PAGE_SIZE;
   1.115 +                m->buf = *q;
   1.116 +                memcpy_image(m);
   1.117 +            } while(q != m->bufv);
   1.118 +        }
   1.119 +    }
   1.120 +}