summaryrefslogtreecommitdiff
path: root/memdisk/memdisk.h
blob: 6da5aff96e7e06bf9395bcbc362139ee31461438 (plain)
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
/* ----------------------------------------------------------------------- *
 *
 *   Copyright 2001-2008 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,
 *   Boston MA 02111-1307, USA; either version 2 of the License, or
 *   (at your option) any later version; incorporated herein by reference.
 *
 * ----------------------------------------------------------------------- */

/*
 * memdisk.h
 *
 * Miscellaneous header definitions
 */

#ifndef MEMDISK_H
#define MEMDISK_H

#include <stddef.h>

/* We use the com32 interface for calling 16-bit code */
#include <com32.h>

/* define it only for i386 */
#if __SIZEOF_POINTER__ == 4
#define __cdecl __attribute__((cdecl,regparm(0)))
#endif

void __cdecl intcall(uint8_t, com32sys_t *, com32sys_t *);

/* Structure passed in from the real-mode code */
struct real_mode_args {
    uint32_t rm_return;
    uint32_t rm_intcall;
    uint32_t rm_bounce;
    uint32_t rm_base;
    uint32_t rm_handle_interrupt;
    uint32_t rm_gdt;
    uint32_t rm_size;
    uint32_t rm_pmjmp;
    uint32_t rm_rmjmp;
};
extern struct real_mode_args rm_args;
#define sys_bounce ((void *)rm_args.rm_bounce)

/* This is the header in the boot sector/setup area */
struct setup_header {
    char cmdline[0x1f1];
    uint8_t setup_secs;
    uint16_t syssize;
    uint16_t swap_dev;
    uint16_t ram_size;
    uint16_t vid_mode;
    uint16_t root_dev;
    uint16_t boot_flag;
    uint16_t jump;
    char header[4];
    uint16_t version;
    uint32_t realmode_swtch;
    uint32_t start_sys;
    uint8_t type_of_loader;
    uint8_t loadflags;
    uint16_t setup_move_size;
    uint32_t code32_start;
    uint32_t ramdisk_image;
    uint32_t ramdisk_size;
    uint32_t bootsect_kludge;
    uint16_t head_end_ptr;
    uint16_t pad1;
    uint32_t cmd_line_ptr;
    uint32_t initrd_addr_max;
    uint32_t esdi;
    uint32_t edx;
    uint32_t sssp;
    uint32_t csip;
};
#define shdr ((struct setup_header *)rm_args.rm_base)

/* Standard routines */
void *memcpy(void *, const void *, size_t);
void *memset(void *, int, size_t);
void *memmove(void *, const void *, size_t);

#define strcpy(a,b)   __builtin_strcpy(a,b)

static inline size_t strlen(const char *__a)
{
    const char *__D;
    size_t __c;

asm("repne;scasb":"=D"(__D), "=c"(__c)
:	"D"(__a), "c"(-1), "a"(0), "m"(*__a));

    return __D - __a - 1;
}

/* memcpy() but returns a pointer to end of buffer */
static inline void *mempcpy(void *__d, const void *__s, unsigned int __n)
{
    memcpy(__d, __s, __n);
    return (void *)((char *)__d + __n);
}

/* memcmp() */
static inline int memcmp(const void *__a, const void *__b, unsigned int __n)
{
    const unsigned char *__aa = __a;
    const unsigned char *__bb = __b;
    int __d;

    while (__n--) {
	__d = *__bb++ - *__aa++;
	if (__d)
	    return __d;
    }

    return 0;
}

static inline void sti(void)
{
    asm volatile("sti");
}

static inline void cli(void)
{
    asm volatile("cli");
}

/* Decompression */
extern int check_zip(void *indata, uint32_t size, uint32_t * zbytes_p,
		     uint32_t * dbytes_p, uint32_t * orig_crc,
		     uint32_t * offset_p);
extern void *unzip(void *indata, uint32_t zbytes, uint32_t dbytes,
		   uint32_t orig_crc, void *target);

#endif