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

linld: add quick boot switch
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Feb 18 08:56:43 2021 +0000 (2021-02-18)
parents a946c1651082
children 61df94a0fa43
line diff
     1.1 --- a/linld/stuff/src/HIMEM.CPP	Fri Jan 08 20:15:35 2021 +0000
     1.2 +++ b/linld/stuff/src/HIMEM.CPP	Thu Feb 18 08:56:43 2021 +0000
     1.3 @@ -10,19 +10,26 @@
     1.4  
     1.5  void load_image(struct image_himem *m) {
     1.6      m->remaining = m->size;
     1.7 +    u32* bufv= &himem_buf;
     1.8 +#ifdef WITH_XMM_ALLOC
     1.9      m->buf = m->fallback;	// set no_exit btw: die() won't return to DOS
    1.10 -    u32* bufv= &himem_buf;
    1.11      if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ?
    1.12  	if(vcpi) {
    1.13  	    bufv = (u32 *)malloc_bufv_or_die(m);	// update m->bufv
    1.14  	}
    1.15 -#ifdef WITH_XMM_ALLOC
    1.16  	else {
    1.17              xmm_alloc(m);			// update m->buf
    1.18  	}
    1.19 -#endif
    1.20      }
    1.21      himem_buf = m->buf;
    1.22 +#else
    1.23 +    *bufv = m->buf = m->fallback;	// set no_exit btw: die() won't return to DOS
    1.24 +    if(((u16 *)&m->fallback)[1] >= 0x10) { // >= _1m ?
    1.25 +	if(vcpi) {
    1.26 +	    bufv = (u32 *)malloc_bufv_or_die(m);	// update m->bufv
    1.27 +	}
    1.28 +    }
    1.29 +#endif
    1.30      do {
    1.31          u16 size;
    1.32  	if(s16(size = read_image(m)) -1 < 0) break;
    1.33 @@ -37,7 +44,8 @@
    1.34  // Called just before rm->pm
    1.35  void far last_ditch() {
    1.36      asm {
    1.37 -	cli
    1.38 +	pushf
    1.39 +	;cli
    1.40  	push	ds
    1.41  	push	cs
    1.42  	pop	ds
    1.43 @@ -52,15 +60,17 @@
    1.44      }
    1.45      vm2rm();
    1.46      struct image_himem *m = &pm;
    1.47 +#define KERNEL	0
    1.48 +#define INITRD	1
    1.49      u32 *q;
    1.50 -    if(((u16 *)&m->fallback)[1] >= 0x10) // >=	_1m ?
    1.51 -	((u16 *)&m->fallback)[1] = 0x10;
    1.52 -    q = m->bufv;
    1.53 +    if(((u16 *)&m[KERNEL].fallback)[1] >= 0x10) // >=	_1m ?
    1.54 +	((u16 *)&m[KERNEL].fallback)[1] = 0x10;
    1.55 +    q = m[KERNEL].bufv;
    1.56      if(q==0) {
    1.57          // Move kernel
    1.58 -        memcpy_image(m);
    1.59 +        memcpy_image_kernel();
    1.60          // Move initrd
    1.61 -        memcpy_image(pm2initrd(m));
    1.62 +        memcpy_image_initrd();
    1.63      } else { //vcpi
    1.64  #if defined(__BORLANDC__) && defined(NO386)
    1.65  #pragma option -3
    1.66 @@ -71,33 +81,32 @@
    1.67          // Move kernel
    1.68          // 'Gathering' copy in chunks of PAGE_SIZE
    1.69          // No risk of overlapping: kernel is copied from above to 1m mark
    1.70 -        m->size = pm2initrd(m)->size = PAGE_SIZE;
    1.71 +        m[KERNEL].size = m[INITRD].size = PAGE_SIZE;
    1.72  #define ADD_PAGE(x)	(*(unsigned long *)(((char *)&x)+1)+=PAGE_SIZE/256)
    1.73  #define SUB_PAGE(x)	(*(unsigned long *)(((char *)&x)+1)-=PAGE_SIZE/256)
    1.74  	reset_bufv(q);
    1.75  	do {
    1.76 -            m->buf = *q;
    1.77 -            memcpy_image(m);
    1.78 -            next(q); ADD_PAGE(m->fallback);
    1.79 +            m[KERNEL].buf = *q;
    1.80 +            memcpy_image_kernel();
    1.81 +            next(q); ADD_PAGE(m[KERNEL].fallback);
    1.82          } while(*q);
    1.83          // Move initrd
    1.84 -	m = pm2initrd(m);
    1.85 -        if(((u16 *)&m->fallback)[1]) {
    1.86 +        if(((u16 *)&m[INITRD].fallback)[1]) {
    1.87              // This is tricky: copy initrd backwards to reduce
    1.88              // risk of overlapping: use the fact that initrd is copied
    1.89              // to the very top of ram
    1.90              // (overlapping still can happen with more than 256mb ram)
    1.91              // (generic solution for this overwrite problem, anyone?)
    1.92 -            q=m->bufv;
    1.93 +            q=m[INITRD].bufv;
    1.94  	    reset_bufv(q);
    1.95              do {
    1.96 -                next(q); ADD_PAGE(m->fallback);
    1.97 +                next(q); ADD_PAGE(m[INITRD].fallback);
    1.98              } while(*q);
    1.99              do {
   1.100 -                prev(q); SUB_PAGE(m->fallback);
   1.101 -                m->buf = *q;
   1.102 -                memcpy_image(m);
   1.103 -            } while(q != m->bufv);
   1.104 +                prev(q); SUB_PAGE(m[INITRD].fallback);
   1.105 +                m[INITRD].buf = *q;
   1.106 +                memcpy_image_initrd();
   1.107 +            } while(q != m[INITRD].bufv);
   1.108          }
   1.109      }
   1.110      asm {
   1.111 @@ -110,5 +119,6 @@
   1.112  	popa
   1.113  # endif
   1.114  	pop	ds
   1.115 +	popf
   1.116      }
   1.117  }