File: common.h

package info (click to toggle)
palo 2.27
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 512 kB
  • sloc: ansic: 6,304; asm: 218; makefile: 196; sh: 61
file content (165 lines) | stat: -rw-r--r-- 5,059 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#ifndef __COMMON_H
#define __COMMON_H
/* 
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) Hewlett-Packard (Paul Bame) paul_bame@hp.com
 */

#define PALOMAGIC "PALO"
#define PALOVERSION "2.27"

#ifndef __ASSEMBLY__

#define  __KERNEL_STRICT_NAMES /* fixes build on SUSE 10 (kernel 2.6.1[2|3]) */

#if !(defined(__hpux__) || defined(__hpux))
# include <sys/cdefs.h>	/* useful macros */
# include <byteswap.h>
#endif

#include <stdarg.h>

/* Swap bytes in 32 bit value.  */
#define __palo_bswap_constant_32(x) \
	((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
	 (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))

#if defined(__linux__)
# include <asm/byteorder.h>
#elif defined(__hpux__) || defined(__hpux)
/* HP-UX is always big endian */
# define __be64_to_cpu(x)	(x)
# define __be32_to_cpu(x)	(x)
# define __be16_to_cpu(x)	(x)
# define __le32_to_cpu(x)	__palo_bswap_constant_32(x)
# define __le16_to_cpu(x)	le16toh(x)
# define __cpu_to_be32(x)	(x)
#else /* BSD and similiar */
# include <endian.h>
# define __be64_to_cpu(x)	be64toh(x)
# define __be32_to_cpu(x)	be32toh(x)
# define __be16_to_cpu(x)	be16toh(x)
# define __le32_to_cpu(x)	le32toh(x)
# define __le16_to_cpu(x)	le16toh(x)
# define __cpu_to_be32(x)	htobe32(x)
#endif
#include "part.h"

#if defined(IPL_LOADER)
void *pa_memcpy(void *dest, const void *src, unsigned n);
#else
# include <string.h>
# define pa_memcpy memcpy
#endif

/* Newer versions of linux-kernel-headers provide a sanitized swab.h
 * which uses GLIBC provided functionality, and dump the kernel provided
 * ones. Include <byteswap.h> above, and provide compatibility #define's
 * to work around this. 
 */
#ifndef __swab64
#define __swab64(x)	bswap_64(x)
#endif /* __swab64 */

#ifndef __swab32
#define __swab32(x)	bswap_32(x)
#endif /* __swab32 */

#ifndef __swab16
#define __swab16(x)	bswap_16(x)
#endif /* __swab16 */

/* size of I/O block used in HP firmware */
#define FW_BLOCKSIZE	2048

#define MAX_IO_LIMIT	(4 * 1024 * 1024)	/* max. MB to read per IO */

#define GB	(1024 * 1024 * 1024)

/* assume kernel will always be loaded into the "lower" physical memory */
#define PHYS(virtual)	((virtual) & 0x0fffffff)

/* This struct is placed at the start of the boot loader executable.  The
 * "magic" number is the assembly-language branch needed to skip over the
 * rest of the structure.  This structure is manipulated by the program
 * which creates and updates boot media (palo).  It must stay 256 bytes
 * in length!
 *
 * kern_sz = 0 or rd_sz = 0 means no kern or ramdisk respectively.
 */
#define PALOHDRVERSION 5

#define PFLAG_INSTALL 0x1
#define PFLAG_EXT2    0x2

#define CMDLINELEN 1024		/* max length of command line */

struct firstblock
{
    unsigned char lifmagic0;	/* 0x80 */
    unsigned char lifmagic1;	/* 0x00 */

    char palomagic[5];		/* PALO */
    unsigned char version;
    int      kern32_offset;	/* seek() here to begin loading kernel */
    int      kern32_sz;		/* # bytes to load */
    int      rd_offset;		/* seek() here to begin loading ramdisk */
    int      rd_sz;		/* # bytes in ramdisk */
    char     cmdline_old[128];	/* OLD: Up to 127 bytes of text plus a \0 */

    unsigned char pad1[0xf0 - 8 - 9 * sizeof (int) - 128];
    int      kern32_native_sz;	/* 32bit kernel: uncompressed file size */
    int      kern64_native_sz;	/* 64bit kernel: uncompressed file size */
    unsigned int flags;
    int	     kern64_offset;
    int      kern64_sz;

    int ipl_addr;		/* offset 0xf0 */
    int ipl_size;
    int ipl_entry;

    /* offset 0x1be */
    unsigned char pad2[0x1be - (0xf0 + 3 * sizeof (int))];
    struct partition part[4];
    /* offset 0x1fe */
    unsigned char dosmagic[2];	/* 0x55, 0xaa */
    unsigned char pad4[1024 - 0x200];
    char     cmdline[CMDLINELEN];/* max 1023 bytes of text plus a \0 */
};

/* we use this so that we can do without the ctype library */
#define is_digit(c)	((c) >= '0' && (c) <= '9')

struct diskpartition
{
    /* in honor of the MBR scheme, these are in 512-byte sectors */
    __u64 start;
    /* length == 0 means nothing's here */
    __u64 length;
    unsigned char id;
};


#define MAXPARTS 16

extern int disk_2gb_limit;

int seekread(int fd, char *buf, unsigned nbytes, __u64 devaddr);
#define STRUCTWRITE(f, data, where) seekwrite((f), (char *)&data, sizeof data, (where))
#define STRUCTREAD(f, data, where) seekread((f), (char *)&data, sizeof data, (where))
#define GZIP_STRUCTREAD(loadable, f, data, where)			\
	(loadable->uncompressed_data) ?					\
		( pa_memcpy(&data, &loadable->uncompressed_data[where], sizeof data), (sizeof data) )  \
	: 								\
		seekread((f), (char *)&data, sizeof data, (where))

/* diskpart.c */
extern int is_extended(int id);
extern int load_partitions(int bootdev, struct diskpartition *mptab, int maxparts);
extern void print_ptab_pretty(struct diskpartition *mptab, int maxparts);

#endif /* __ASSEMBLY__ */
#endif /* __COMMON_H */