wok-next rev 12273
syslinux: merge md5sum, ifmem, reboot & poweroff modules
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sat Apr 14 11:50:03 2012 +0200 (2012-04-14) |
parents | a7297503ad9b |
children | 5f2b786cc2b8 |
files | syslinux/receipt syslinux/stuff/extra/ifmem.c syslinux/stuff/extra/md5sum.c |
line diff
1.1 --- a/syslinux/receipt Fri Apr 13 02:16:05 2012 +0200 1.2 +++ b/syslinux/receipt Sat Apr 14 11:50:03 2012 +0200 1.3 @@ -18,10 +18,9 @@ 1.4 cd $src 1.5 cp $stuff/tools/isohybrid.sh . 1.6 cp $stuff/tools/keytab-lilo.pl . 1.7 - cp $stuff/extra/ifmem.c com32/modules 1.8 cp $stuff/extra/md5sum.c com32/modules 1.9 - grep -q ifmem.c32 com32/modules/Makefile || 1.10 - sed -i 's/ifcpu64.c32/ifcpu64.c32 ifmem.c32 md5sum.c32/' com32/modules/Makefile 1.11 + grep -q md5sum.c32 com32/modules/Makefile || 1.12 + sed -i 's/ifcpu64.c32/ifcpu64.c32 md5sum.c32/' com32/modules/Makefile 1.13 make -C com32 1.14 ./isohybrid.sh --build 1.15 for i in /usr/share/kbd/keymaps/i386/*/*.map.gz; do 1.16 @@ -37,11 +36,8 @@ 1.17 { 1.18 mkdir -p $fs/boot/isolinux 1.19 cp -a $src/core/isolinux.bin $fs/boot/isolinux 1.20 - cp -a $src/com32/modules/reboot.c32 $fs/boot/isolinux 1.21 - cp -a $src/com32/modules/ifmem.c32 $fs/boot/isolinux 1.22 cp -a $src/com32/modules/md5sum.c32 $fs/boot/isolinux 1.23 cp -a $src/com32/menu/vesamenu.c32 $fs/boot/isolinux 1.24 - cp -a $src/modules/poweroff.com $fs/boot/isolinux 1.25 # $stuff/isolinux.msg is the old way the have a splash image. 1.26 cp $stuff/*.cfg $stuff/*.txt $stuff/help.* $stuff/opts.* $fs/boot/isolinux 1.27 while read cfg kbd loc ; do 1.28 @@ -79,4 +75,7 @@ 1.29 post_install() 1.30 { 1.31 sed -i "s/XXXXXXXX/$(date +%Y%m%d)/" $1/boot/isolinux/isolinux.cfg 1.32 + for i in ifmem reboot poweroff; do 1.33 + ln $fs/boot/isolinux/md5sum.c32 $fs/boot/isolinux/$i.c32 1.34 + done 1.35 }
2.1 --- a/syslinux/stuff/extra/ifmem.c Fri Apr 13 02:16:05 2012 +0200 2.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 2.3 @@ -1,127 +0,0 @@ 2.4 -/* ----------------------------------------------------------------------- * 2.5 - * 2.6 - * Copyright 2009 Pascal Bellard - All Rights Reserved 2.7 - * 2.8 - * This program is free software; you can redistribute it and/or modify 2.9 - * it under the terms of the GNU General Public License as published by 2.10 - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 2.11 - * Boston MA 02110-1301, USA; either version 2 of the License, or 2.12 - * (at your option) any later version; incorporated herein by reference. 2.13 - * 2.14 - * ----------------------------------------------------------------------- */ 2.15 - 2.16 -/* 2.17 - * ifmem.c 2.18 - * 2.19 - * Run one command if the memory is large enought, and another if it isn't. 2.20 - * 2.21 - * Usage: 2.22 - * 2.23 - * label boot_kernel 2.24 - * kernel ifmem.c 2.25 - * append size_in_KB boot_large [size_in_KB boot_medium] boot_small 2.26 - * 2.27 - * label boot_large 2.28 - * kernel vmlinuz_large_memory 2.29 - * append ... 2.30 - * 2.31 - * label boot_small 2.32 - * kernel vmlinuz_small_memory 2.33 - * append ... 2.34 - */ 2.35 - 2.36 -#include <inttypes.h> 2.37 -#include <com32.h> 2.38 -#include <console.h> 2.39 -#include <stdio.h> 2.40 -#include <string.h> 2.41 -#include <alloca.h> 2.42 -#include <stdlib.h> 2.43 -#include <syslinux/boot.h> 2.44 - 2.45 -struct e820_data { 2.46 - uint64_t base; 2.47 - uint64_t len; 2.48 - uint32_t type; 2.49 - uint32_t extattr; 2.50 -} __attribute__((packed)); 2.51 - 2.52 -// Get memory size in Kb 2.53 -static unsigned long memory_size(void) 2.54 -{ 2.55 - uint64_t bytes = 0; 2.56 - static com32sys_t ireg, oreg; 2.57 - static struct e820_data ed; 2.58 - 2.59 - ireg.eax.w[0] = 0xe820; 2.60 - ireg.edx.l = 0x534d4150; 2.61 - ireg.ecx.l = sizeof(struct e820_data); 2.62 - ireg.edi.w[0] = OFFS(__com32.cs_bounce); 2.63 - ireg.es = SEG(__com32.cs_bounce); 2.64 - 2.65 - ed.extattr = 1; 2.66 - 2.67 - do { 2.68 - memcpy(__com32.cs_bounce, &ed, sizeof ed); 2.69 - 2.70 - __intcall(0x15, &ireg, &oreg); 2.71 - if (oreg.eflags.l & EFLAGS_CF || 2.72 - oreg.eax.l != 0x534d4150 || 2.73 - oreg.ecx.l < 20) 2.74 - break; 2.75 - 2.76 - memcpy(&ed, __com32.cs_bounce, sizeof ed); 2.77 - 2.78 - if (ed.type == 1) 2.79 - bytes += ed.len; 2.80 - 2.81 - ireg.ebx.l = oreg.ebx.l; 2.82 - } while (ireg.ebx.l); 2.83 - 2.84 - if (!bytes) { 2.85 - memset(&ireg, 0, sizeof ireg); 2.86 - ireg.eax.w[0] = 0x8800; 2.87 - __intcall(0x15, &ireg, &oreg); 2.88 - return ireg.eax.w[0]; 2.89 - } 2.90 - return bytes >> 10; 2.91 -} 2.92 - 2.93 -int main(int argc, char *argv[]) 2.94 -{ 2.95 - int i; 2.96 - unsigned long ram_size; 2.97 - 2.98 - openconsole(&dev_null_r, &dev_stdcon_w); 2.99 - 2.100 - if (argc < 4) { 2.101 - perror("\nUsage: ifmem.c32 size_KB boot_large_memory boot_small_memory\n"); 2.102 - return 1; 2.103 - } 2.104 - 2.105 - // find target according to ram size 2.106 - ram_size = memory_size(); 2.107 - printf("Total memory found %luK.\n",ram_size); 2.108 - ram_size += (1 << 10); // add 1M to round boundaries... 2.109 - 2.110 - i = 1; 2.111 - do { 2.112 - char *s = argv[i]; 2.113 - char *p = s; 2.114 - unsigned long scale = 1; 2.115 - 2.116 - while (*p >= '0' && *p <= '9') p++; 2.117 - switch (*p | 0x20) { 2.118 - case 'g': scale <<= 10; 2.119 - case 'm': scale <<= 10; 2.120 - default : *p = 0; break; 2.121 - } 2.122 - i++; // seek to label 2.123 - if (ram_size >= scale * strtoul(s, NULL, 0)) break; 2.124 - i++; // next size or default label 2.125 - } while (i + 1 < argc); 2.126 - 2.127 - if (i != argc) syslinux_run_command(argv[i]); 2.128 - else syslinux_run_default(); 2.129 - return -1; 2.130 -}
3.1 --- a/syslinux/stuff/extra/md5sum.c Fri Apr 13 02:16:05 2012 +0200 3.2 +++ b/syslinux/stuff/extra/md5sum.c Sat Apr 14 11:50:03 2012 +0200 3.3 @@ -299,14 +299,13 @@ 3.4 return hash_value; 3.5 } 3.6 3.7 -int main(int argc, char **argv) 3.8 +static int main_md5sum(int argc, char **argv) 3.9 { 3.10 int files = 0, tested = 0, good = 0; 3.11 static char clear_eol[] = " "; 3.12 3.13 (void) argc; 3.14 /* -c implied */ 3.15 - openconsole(&dev_rawcon_r, &dev_stdcon_w); 3.16 3.17 do { 3.18 FILE *fp; 3.19 @@ -356,5 +355,209 @@ 3.20 } while (*++argv); 3.21 printf("\r%d files OK, %d broken, %d not checked.%s\n", 3.22 good, tested - good, files - tested, clear_eol); 3.23 + return 0; 3.24 } 3.25 3.26 +/* 3.27 + * ifmem.c 3.28 + * 3.29 + * Run one command if the memory is large enought, and another if it isn't. 3.30 + * 3.31 + * Usage: 3.32 + * 3.33 + * label boot_kernel 3.34 + * kernel ifmem.c 3.35 + * append size_in_KB boot_large [size_in_KB boot_medium] boot_small 3.36 + * 3.37 + * label boot_large 3.38 + * kernel vmlinuz_large_memory 3.39 + * append ... 3.40 + * 3.41 + * label boot_small 3.42 + * kernel vmlinuz_small_memory 3.43 + * append ... 3.44 + */ 3.45 + 3.46 +#include <inttypes.h> 3.47 +#include <alloca.h> 3.48 +#include <syslinux/boot.h> 3.49 + 3.50 +struct e820_data { 3.51 + uint64_t base; 3.52 + uint64_t len; 3.53 + uint32_t type; 3.54 + uint32_t extattr; 3.55 +} __attribute__((packed)); 3.56 + 3.57 +// Get memory size in Kb 3.58 +static unsigned long memory_size(void) 3.59 +{ 3.60 + uint64_t bytes = 0; 3.61 + static com32sys_t ireg, oreg; 3.62 + static struct e820_data ed; 3.63 + 3.64 + ireg.eax.w[0] = 0xe820; 3.65 + ireg.edx.l = 0x534d4150; 3.66 + ireg.ecx.l = sizeof(struct e820_data); 3.67 + ireg.edi.w[0] = OFFS(__com32.cs_bounce); 3.68 + ireg.es = SEG(__com32.cs_bounce); 3.69 + 3.70 + ed.extattr = 1; 3.71 + 3.72 + do { 3.73 + memcpy(__com32.cs_bounce, &ed, sizeof ed); 3.74 + 3.75 + __intcall(0x15, &ireg, &oreg); 3.76 + if (oreg.eflags.l & EFLAGS_CF || 3.77 + oreg.eax.l != 0x534d4150 || 3.78 + oreg.ecx.l < 20) 3.79 + break; 3.80 + 3.81 + memcpy(&ed, __com32.cs_bounce, sizeof ed); 3.82 + 3.83 + if (ed.type == 1) 3.84 + bytes += ed.len; 3.85 + 3.86 + ireg.ebx.l = oreg.ebx.l; 3.87 + } while (ireg.ebx.l); 3.88 + 3.89 + if (!bytes) { 3.90 + memset(&ireg, 0, sizeof ireg); 3.91 + ireg.eax.w[0] = 0x8800; 3.92 + __intcall(0x15, &ireg, &oreg); 3.93 + return ireg.eax.w[0]; 3.94 + } 3.95 + return bytes >> 10; 3.96 +} 3.97 + 3.98 +static int main_ifmem(int argc, char *argv[]) 3.99 +{ 3.100 + int i; 3.101 + unsigned long ram_size; 3.102 + 3.103 + if (argc < 4) { 3.104 + perror("\nUsage: ifmem.c32 size_KB boot_large_memory boot_small_memory\n"); 3.105 + return 1; 3.106 + } 3.107 + 3.108 + // find target according to ram size 3.109 + ram_size = memory_size(); 3.110 + printf("Total memory found %luK.\n",ram_size); 3.111 + ram_size += (1 << 10); // add 1M to round boundaries... 3.112 + 3.113 + i = 1; 3.114 + do { 3.115 + char *s = argv[i]; 3.116 + char *p = s; 3.117 + unsigned long scale = 1; 3.118 + 3.119 + while (*p >= '0' && *p <= '9') p++; 3.120 + switch (*p | 0x20) { 3.121 + case 'g': scale <<= 10; 3.122 + case 'm': scale <<= 10; 3.123 + default : *p = 0; break; 3.124 + } 3.125 + i++; // seek to label 3.126 + if (ram_size >= scale * strtoul(s, NULL, 0)) break; 3.127 + i++; // next size or default label 3.128 + } while (i + 1 < argc); 3.129 + 3.130 + if (i != argc) syslinux_run_command(argv[i]); 3.131 + else syslinux_run_default(); 3.132 + return -1; 3.133 +} 3.134 + 3.135 +#include <syslinux/reboot.h> 3.136 + 3.137 +static int main_reboot(int argc, char *argv[]) 3.138 +{ 3.139 + int warm = 0; 3.140 + int i; 3.141 + 3.142 + for (i = 1; i < argc; i++) { 3.143 + if (!strcmp(argv[i], "-w") || !strcmp(argv[i], "--warm")) 3.144 + warm = 1; 3.145 + } 3.146 + 3.147 + syslinux_reboot(warm); 3.148 +} 3.149 + 3.150 +/* APM poweroff module. 3.151 + * based on poweroff.asm, Copyright 2009 Sebastian Herbszt 3.152 + */ 3.153 + 3.154 +static int main_poweroff(int argc, char *argv[]) 3.155 +{ 3.156 + static com32sys_t ireg, oreg; 3.157 + static char notsupported[] ="APM 1.1+ not supported"; 3.158 + unsigned i; 3.159 + static struct { 3.160 + unsigned short ax; 3.161 + unsigned short bx; 3.162 + unsigned short cx; 3.163 + char *msg; 3.164 + } inst[] = { 3.165 + { 0x5300, // APM Installation Check (00h) 3.166 + 0, // APM BIOS (0000h) 3.167 + 0, "APM not present" }, 3.168 + { 0x5301, // APM Real Mode Interface Connect (01h) 3.169 + 0, // APM BIOS (0000h) 3.170 + 0, "APM RM interface connect failed" }, 3.171 + { 0x530E, // APM Driver Version (0Eh) 3.172 + 0, // APM BIOS (0000h) 3.173 + 0x0101, // APM Driver Version version 1.1 3.174 + notsupported }, 3.175 + { 0x5307, // Set Power State (07h) 3.176 + 1, // All devices power managed by the APM 3.177 + 3, // Power state off 3.178 + "Power off failed" } 3.179 + }; 3.180 + 3.181 + (void) argc; 3.182 + (void) argv; 3.183 + for (i = 0; i < sizeof(inst)/sizeof(inst[0]); i++) { 3.184 + char *msg = inst[i].msg; 3.185 + 3.186 + ireg.eax.w[0] = inst[i].ax; 3.187 + ireg.ebx.w[0] = inst[i].bx; 3.188 + ireg.ecx.w[0] = inst[i].cx; 3.189 + __intcall(0x15, &ireg, &oreg); 3.190 + if ((oreg.eflags.l & EFLAGS_CF) == 0) { 3.191 + switch (inst[i].ax) { 3.192 + case 0x5300 : 3.193 + if (oreg.ebx.w[0] != 0x504D /* 'PM' */) break; 3.194 + msg = "Power management disabled"; 3.195 + if (oreg.ecx.w[0] & 8) break; // bit 3 APM BIOS Power Management disabled 3.196 + case 0x530E : 3.197 + msg = notsupported; 3.198 + if (oreg.eax.w[0] < 0x101) break; 3.199 + default : continue; 3.200 + } 3.201 + } 3.202 + printf("%s.\n", msg); 3.203 + return 1; 3.204 + } 3.205 + return 0; 3.206 +} 3.207 + 3.208 +int main(int argc, char *argv[]) 3.209 +{ 3.210 + unsigned i; 3.211 + static struct { 3.212 + char *name; 3.213 + int (*main)(int argc, char *argv[]); 3.214 + } bin[] = { 3.215 + { "md5sum", main_md5sum }, 3.216 + { "ifmem", main_ifmem }, 3.217 + { "reboot", main_reboot }, 3.218 + { "poweroff", main_poweroff } 3.219 + }; 3.220 + 3.221 + openconsole(&dev_null_r, &dev_stdcon_w); 3.222 + 3.223 + if (strstr(argv[0], "c32box")) { argc--; argv++; } 3.224 + for (i = 0; i < sizeof(bin)/sizeof(bin[0]); i++) 3.225 + if (strstr(argv[0], bin[i].name)) 3.226 + return bin[i].main(argc, argv); 3.227 + return 1; 3.228 +}