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 = ± 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 = ± 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 +}