From: hpa Date: Thu, 30 Jan 2003 01:47:48 +0000 (+0000) Subject: Syslinux library code X-Git-Tag: syslinux-3.11~628 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=990bf77ba085dbf577f917654d13193e8f063842;p=platform%2Fupstream%2Fsyslinux.git Syslinux library code --- diff --git a/syslxmod.c b/syslxmod.c new file mode 100644 index 0000000..faf71d8 --- /dev/null +++ b/syslxmod.c @@ -0,0 +1,107 @@ +#ident "$Id$" +/* ----------------------------------------------------------------------- * + * + * Copyright 1998-2003 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., 675 Mass Ave, Cambridge MA 02139, + * USA; either version 2 of the License, or (at your option) any later + * version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * syslxmod.c - Code to provide a SYSLINUX code set to an installer. + */ + +#define _XOPEN_SOURCE 500 /* Required on glibc 2.x */ +#define _BSD_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "syslinux.h" + +enum bs_offsets { + bsJump = 0x00, + bsOemName = 0x03, + bsBytesPerSec = 0x0b, + bsSecPerClust = 0x0d, + bsResSectors = 0x0e, + bsFATs = 0x10, + bsRootDirEnts = 0x11, + bsSectors = 0x13, + bsMedia = 0x15, + bsFATsecs = 0x16, + bsSecPerTrack = 0x18, + bsHeads = 0x1a, + bsHiddenSecs = 0x1c, + bsHugeSectors = 0x20, + bsDriveNumber = 0x24, + bsReserved1 = 0x25, + bsBootSignature = 0x26, + bsVolumeID = 0x27, + bsVolumeLabel = 0x2b, + bsFileSysType = 0x36, + bsCode = 0x3e, + bsSignature = 0x1fe +}; + +#define bsHead bsJump +#define bsHeadLen (bsBytesPerSec-bsHead) +#define bsCodeLen (bsSignature-bsCode) + +/* + * Access functions for littleendian numbers, possibly misaligned. + */ +static inline u_int16_t get_16(unsigned char *p) +{ + return (u_int16_t)p[0] + ((u_int16_t)p[1] << 8); +} + +static inline u_int32_t get_32(unsigned char *p) +{ + return (u_int32_t)p[0] + ((u_int32_t)p[1] << 8) + + ((u_int32_t)p[2] << 16) + ((u_int32_t)p[3] << 24); +} + +static inline void set_16(unsigned char *p, u_int16_t v) +{ + p[0] = (v & 0xff); + p[1] = ((v >> 8) & 0xff); +} + +#if 0 /* Not needed */ +static inline void set_32(unsigned char *p, u_int32_t v) +{ + p[0] = (v & 0xff); + p[1] = ((v >> 8) & 0xff); + p[2] = ((v >> 16) & 0xff); + p[3] = ((v >> 24) & 0xff); +} +#endif + +/* Patch the code so that we're running in stupid mode */ +void syslinux_make_stupid(void) +{ + /* Access only one sector at a time */ + set_16(syslinux_ldlinux+PATCH_OFFSET, 1); +} + +void syslinux_make_bootsect(void *bs) +{ + unsigned char *bootsect = bs; + + memcpy(bootsect+bsHead, syslinux_bootsect+bsHead, bsHeadLen); + memcpy(bootsect+bsCode, syslinux_bootsect+bsCode, bsCodeLen); +}