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