[syslinux] Re: Can not use read file SYSLINUX API call

Phung Chi Kien kienpc at dubmail.net
Mon Sep 15 03:25:53 PDT 2003


Hi all, this is my code file:

#ident "$Id: startup.c,v 1.3 2003/07/01 00:42:13 hpa Exp $"
/* ----------------------------------------------------------------------- *
 *
 *   Copyright 2002 H. Peter Anvin - All Rights Reserved
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
 *   Bostom MA 02111-1307, USA; either version 2 of the License, or
 *   (at your option) any later version; incorporated herein by reference.
 *
 * -----------------------------------------------------------------------
*/

/*
 * startup.c
 *
 * Simple COM32 image
 *
 * This program shows how to open and read a file by SYSLINUX API call
 */

#include <com32.h>

#define NULL ((void *)0)

static inline void memset(void *buf, int ch, unsigned int len)
{
  asm volatile("cld; rep; stosb"
        : "+D" (buf), "+c" (len) : "a" (ch) : "memory");
}

static void strcpy(char *dst, const char *src)
{
  while ( *src )
    *dst++ = *src++;

  *dst = '\0';
}

static void getversion(void)
{
  com32sys_t inreg;

  memset(&inreg, 0, sizeof inreg);

  inreg.eax.w[0] = 0x0001; // Get version
  __com32.cs_intcall(0x22, &inreg, NULL);
};


static void writemsg(const char *msg)
{
  com32sys_t inreg;

  memset(&inreg, 0, sizeof inreg);

  strcpy(__com32.cs_bounce, msg);
  inreg.eax.w[0] = 0x0002; /* Write string */
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
};

static void runcmd(const char *msg)
{
  com32sys_t inreg;

  memset(&inreg, 0, sizeof inreg);

  strcpy(__com32.cs_bounce, msg);
  inreg.eax.w[0] = 0x0003; /* Run command */
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
};


int __start(void)
{
  char data[512];
  int cx,ax,es,si,di,dx,t;

  com32sys_t inreg,outreg;
  memset(&inreg, 0, sizeof inreg);
  memset(&outreg, 0, sizeof outreg);
  strcpy(__com32.cs_bounce, "test.txt");
  inreg.eax.w[0] = 0x0006; // Open file
  inreg.esi.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, &outreg);

  si = outreg.esi.w[0];
  cx = outreg.ecx.b[0];
  ax = outreg.eax.b[0];
  if ((ax % cx) == 0)
  t = ax / cx;
  else
  t = (ax / cx) + 1;

  memset(&inreg, 0, sizeof inreg);
  memset(&outreg, 0, sizeof outreg);
  inreg.esi.w[0] = si;
  inreg.ecx.w[0] = t;
  inreg.eax.w[0] = 0x0007; //Read file
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
/*
  inreg.eax.w[0] = 0x0002; // Write string
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
*/

  writemsg("\r\n");
  runcmd("bzImage initrd=root.gz");
  writemsg("\r\n");
  return 0;
}

Please review to find the problem of my code.
Thanks

----- Original Message -----
From: "H. Peter Anvin" <hpa at zytor.com>
To: "Phung Chi Kien" <kienpc at dubmail.net>
Cc: <SYSLINUX at zytor.com>
Sent: Monday, September 15, 2003 1:00 PM
Subject: Re: Can not use read file SYSLINUX API call


> Phung Chi Kien wrote:
> > Hi Peter Anvin
> > I tried to use open file and read file SYSLINUX API. But it always make
my
> > PC104 freeze. My snip code :
> >
>
> Can you please include the whole file, so that it can be compiled?
>
> -hpa




More information about the Syslinux mailing list