wok-next annotate syslinux/stuff/extra/ifmem.c @ rev 3867

syslinux/ifmem: add extra arguments in cmdline
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Aug 08 16:04:33 2009 +0200 (2009-08-08)
parents d5f670b08670
children b6b64851e9aa
rev   line source
pascal@3665 1 /* ----------------------------------------------------------------------- *
pascal@3665 2 *
pascal@3665 3 * Copyright 2009 Pascal Bellard - All Rights Reserved
pascal@3665 4 *
pascal@3665 5 * This program is free software; you can redistribute it and/or modify
pascal@3665 6 * it under the terms of the GNU General Public License as published by
pascal@3665 7 * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
pascal@3665 8 * Boston MA 02110-1301, USA; either version 2 of the License, or
pascal@3665 9 * (at your option) any later version; incorporated herein by reference.
pascal@3665 10 *
pascal@3665 11 * ----------------------------------------------------------------------- */
pascal@3665 12
pascal@3665 13 /*
pascal@3665 14 * ifmem.c
pascal@3665 15 *
pascal@3665 16 * Run one command if the memory is large enought, and another if it isn't.
pascal@3665 17 *
pascal@3665 18 * Usage:
pascal@3665 19 *
pascal@3665 20 * label boot_kernel
pascal@3665 21 * kernel ifmem.c
pascal@3665 22 * append size_in_KB boot_large [size_in_KB boot_medium] boot_small
pascal@3665 23 *
pascal@3665 24 * label boot_large
pascal@3665 25 * kernel vmlinuz_large_memory
pascal@3665 26 * append ...
pascal@3665 27 *
pascal@3665 28 * label boot_small
pascal@3665 29 * kernel vmlinuz_small_memory
pascal@3665 30 * append ...
pascal@3665 31 */
pascal@3665 32
pascal@3665 33 #include <inttypes.h>
pascal@3665 34 #include <com32.h>
pascal@3665 35 #include <console.h>
pascal@3665 36 #include <stdio.h>
pascal@3665 37 #include <string.h>
pascal@3665 38 #include <alloca.h>
pascal@3665 39 #include <stdlib.h>
pascal@3665 40 #include <syslinux/boot.h>
pascal@3665 41
pascal@3867 42 static unsigned long memory_size(void)
pascal@3665 43 {
pascal@3665 44 com32sys_t ireg, oreg;
pascal@3665 45
pascal@3665 46 memset(&ireg, 0, sizeof ireg);
pascal@3665 47
pascal@3665 48 ireg.eax.w[0] = 0xe801;
pascal@3665 49 __intcall(0x15, &ireg, &oreg);
pascal@3665 50
pascal@3665 51 return oreg.ecx.w[0] + ( oreg.edx.w[0] << 6);
pascal@3665 52 }
pascal@3665 53
pascal@3665 54 int main(int argc, char *argv[])
pascal@3665 55 {
pascal@3665 56 char *s;
pascal@3665 57 int i;
pascal@3665 58
pascal@3665 59 for (s = argv[1]; *s && (*s < '0' || *s > '9'); s++);
pascal@3665 60
pascal@3665 61 if (argc < 4 || !*s) {
pascal@3665 62 openconsole(&dev_null_r, &dev_stdcon_w);
pascal@3665 63 perror("\nUsage: ifmem.c32 size_KB boot_large_memory boot_small_memory\n");
pascal@3665 64 return 1;
pascal@3665 65 }
pascal@3665 66
pascal@3867 67 # find target according to ram size
pascal@3665 68 for (i = 1; i + 2 < argc; ) {
pascal@3665 69 i++; // size
pascal@3665 70 if (memory_size() >= strtoul(s, NULL, 0)) break;
pascal@3665 71 s = argv[++i];
pascal@3665 72 }
pascal@3867 73
pascal@3867 74 # find and copy extra parameters to command line
pascal@3867 75 # assume last parameter is "noram"
pascal@3867 76 for (s = argv[i]; i < argc; i++) {
pascal@3867 77 if (!strcmp(argv[i],"noram") && ++i < argc) {
pascal@3867 78 #define SZ 512
pascal@3867 79 static char cmdline[SZ];
pascal@3867 80 char *p = cmdline, *q = s;
pascal@3867 81 int j;
pascal@3867 82 for (j = i; j <= argc; j++) {
pascal@3867 83 while (*q && p < cmdline + SZ -1) *p++ = *q++;
pascal@3867 84 if (p < cmdline + SZ -1) *p++ = ' ';
pascal@3867 85 q = argv[j];
pascal@3867 86 }
pascal@3867 87 *p++ = 0;
pascal@3867 88 s = cmdline;
pascal@3867 89 }
pascal@3867 90 }
pascal@3867 91
pascal@3867 92 if (s) syslinux_run_command(s);
pascal@3867 93 else syslinux_run_default();
pascal@3665 94 return -1;
pascal@3665 95 }