syslinux/com32/modules/ifplop.c
<<
>>
Prefs
   1/* ----------------------------------------------------------------------- *
   2 *
   3 *   Copyright 2010 Gert Hulselmans - All Rights Reserved
   4 *
   5 *   This program is free software; you can redistribute it and/or modify
   6 *   it under the terms of the GNU General Public License as published by
   7 *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
   8 *   Boston MA 02110-1301, USA; either version 2 of the License, or
   9 *   (at your option) any later version; incorporated herein by reference.
  10 *
  11 * ----------------------------------------------------------------------- */
  12
  13/*
  14 * ifplop.c
  15 *
  16 * This COM32 module detects if the PLoP Boot Manager was used to boot a CDROM
  17 * drive or USB drive, by checking for the presence of the PLoP INT13h hook.
  18 *
  19 * Usage:    ifplop.c32 [<plop_detected>] -- [<plop_not_detected>]
  20 * Examples: ifplop.c32 menu.c32 another.cfg -- plpbt hiddenusb usb1=2
  21 *              You need to remove the ".bin" extension of the plpbt.bin file
  22 *              if you use it this way.
  23 *           ifplop.c32 plop_detected -- plop_not_detected
  24 *
  25 * A possible config file could be:
  26 *
  27 * ===========================================================================
  28 *  DEFAULT plopcheck
  29 *
  30 *  # Check for the presence of PLoP (run by default)
  31 *  #   When PLoP INT13h hook is found, run the first command (plop_detected)
  32 *  #   When PLoP INT13h hook isn't found, run the second command (plop_not_detected)
  33 *  LABEL plopcheck
  34 *      COM32 ifplop.c32
  35 *      APPEND plop_detected -- plop_not_detected
  36 *
  37 *  # When PLoP INT13h hook was found, boot the menu system.
  38 *  # PLoP can have added USB 2.0 speed, so the entries we want to boot
  39 *  # will be read from disk much faster (supposing that we have a BIOS
  40 *  # that only supports USB 1.1 speed, but a mobo with USB 2.0 controllers).
  41 *  LABEL plop_detected
  42 *      COM32 menu.c32
  43 *      APPEND another.cfg
  44 *
  45 *  # PLoP INT13h hook wasn't found, so we boot PLoP, so it can add USB 2.0 support
  46 *  # When using "LINUX plpbt.bin", you don't need to remove the .bin extension.
  47 *  LABEL plop_not_detected
  48 *      LINUX plpbt.bin
  49 *      APPEND hiddenusb usb1=2
  50 *
  51 * ===========================================================================
  52 *
  53 * Why is/can this module be useful?
  54 *
  55 * You may want to boot PLoP by default from Syslinux when you boot from your
  56 * USB stick/drive:
  57 *   1. PLoP can upgrade USB 1.1 speed offered by the BIOS to USB 2.0 speed
  58 *      if you have USB 2.0 controllers on your mobo.
  59 *   2. Some BIOSes only can access the first 128GiB (137GB) on USB drives, while
  60 *      internal hard drives don't necessarily suffer from this 128GiB problem.
  61 *      Using PLoPs USB capabilities, you can access the whole drive.
  62 *
  63 * When you select the "USB" entry in PLoP, it will boot your USB stick/drive
  64 * again and it will boot PLoP again when you have set booting PLoP as DEFAULT
  65 * boot option in your Syslinux configuration file.
  66 *
  67 * By using ifplop.c32 you can specify which action you want to do the second
  68 * time your USB stick/drive is booted. So you can load another config file or
  69 * boot a large hard disk image or whatever you want.
  70 *
  71 * PLoP Boot Manager website: http://www.plop.at/en/bootmanager.html
  72 */
  73
  74#include <com32.h>
  75#include <stdlib.h>
  76#include <stdio.h>
  77#include <string.h>
  78#include <alloca.h>
  79#include <console.h>
  80#include <syslinux/boot.h>
  81
  82static bool plop_INT13h_check(void)
  83{
  84    com32sys_t inregs, outregs;
  85
  86    /* Prepare the register set */
  87    memset(&inregs, 0, sizeof inregs);
  88
  89    /*
  90     * Check if PLoP already has booted a CDROM or USB drive by checking
  91     * for the presence of the PLoP INT13h hook.
  92     *
  93     * The following assembly code (NASM) can detect the PLoP INT13h hook:
  94     *
  95     *   mov eax,'PoLP'  ; Reverse of 'PLoP'
  96     *   mov ebp,'DKHC'  ; Reverse of 'CHKD'
  97     *   int 13h
  98     *   cmp eax,' sey'  ; Reverse of 'yes '
  99     *   jz plop_INT13h_active
 100     */
 101
 102    inregs.eax.l = 0x504c6f50;  /* "PLoP" */
 103    inregs.ebp.l = 0x43484b44;  /* "CHKD" */
 104
 105    __intcall(0x13, &inregs, &outregs);
 106
 107    /* eax will contain "yes " if PLoP INT13h hook is available */
 108    if (outregs.eax.l == 0x79657320)
 109        return true;
 110
 111    return false;
 112}
 113
 114/* XXX: this really should be librarized */
 115static void boot_args(char **args)
 116{
 117    int len = 0, a = 0;
 118    char **pp;
 119    const char *p;
 120    char c, *q, *str;
 121
 122    for (pp = args; *pp; pp++)
 123        len += strlen(*pp) + 1;
 124
 125    q = str = alloca(len);
 126    for (pp = args; *pp; pp++) {
 127        p = *pp;
 128        while ((c = *p++))
 129            *q++ = c;
 130        *q++ = ' ';
 131        a = 1;
 132    }
 133    q -= a;
 134    *q = '\0';
 135
 136    if (!str[0])
 137        syslinux_run_default();
 138    else
 139        syslinux_run_command(str);
 140}
 141
 142int main(int argc, char *argv[])
 143{
 144    char **args[2];
 145    int arg = 0;
 146
 147    openconsole(&dev_null_r, &dev_stdcon_w);
 148
 149    if (argc)
 150        arg++;
 151    args[0] = &argv[arg];
 152    args[1] = NULL;
 153    while (arg < argc) {
 154        if (!strcmp(argv[arg], "--")) {
 155            argv[arg] = NULL;
 156            args[1] = &argv[arg + 1];
 157            break;
 158        }
 159        arg++;
 160    }
 161    if (args[1] != NULL) {
 162        boot_args(plop_INT13h_check()? args[0] : args[1]);
 163    } else {
 164        fprintf(stderr,
 165                "Usage:   ifplop.c32 [<plop_detected>] -- [<plop_not_detected>]\n"
 166                "Example: ifplop.c32 menu.c32 another.cfg -- plpbt hiddenusb usb1=2\n");
 167    }
 168
 169    return 0;
 170}
 171
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.