memdisk: install a DPT if needed in INT 1Eh; better zero-drive detection
[people/stefanha/syslinux.git] / memdisk / memdisk.h
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2001-2008 H. Peter Anvin - 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., 53 Temple Place Ste 330,
8  *   Boston MA 02111-1307, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * memdisk.h
15  *
16  * Miscellaneous header definitions
17  */
18
19 #ifndef MEMDISK_H
20 #define MEMDISK_H
21
22 #include <stddef.h>
23
24 /* We use the com32 interface for calling 16-bit code */
25 #include <com32.h>
26
27 /* The real-mode segment */
28 #define LOW_SEG 0x0800
29
30 #define __cdecl __attribute__((cdecl,regparm(0)))
31
32 typedef void (*syscall_t)(uint8_t, com32sys_t *, com32sys_t *);
33 extern __cdecl syscall_t syscall;
34 extern void *sys_bounce;
35
36 /* What to call when we're dead */
37 extern void __attribute__((noreturn)) die(void);
38
39 /* Standard routines */
40 #define memcpy(a,b,c) __builtin_memcpy(a,b,c)
41 #define memset(a,b,c) __builtin_memset(a,b,c)
42 #define strcpy(a,b)   __builtin_strcpy(a,b)
43 #define strlen(a)     __builtin_strlen(a)
44
45 /* memcpy() but returns a pointer to end of buffer */
46 static inline void *
47 memcpy_endptr(void *__d, const void *__s, unsigned int __n)
48 {
49   memcpy(__d, __s, __n);
50   return (void *)((char *)__d + __n);
51 }
52
53 /* memcmp() */
54 static inline int
55 memcmp(const void *__a, const void *__b, unsigned int __n)
56 {
57   const unsigned char *__aa = __a;
58   const unsigned char *__bb = __b;
59   int __d;
60
61   while ( __n-- ) {
62     __d = *__bb++ - *__aa++;
63     if ( __d )
64       return __d;
65   }
66
67   return 0;
68 }
69
70 /* Decompression */
71 extern int check_zip(void *indata, uint32_t size, uint32_t *zbytes_p,
72                      uint32_t *dbytes_p, uint32_t *orig_crc,
73                      uint32_t *offset_p);
74 extern void *unzip(void *indata, uint32_t zbytes, uint32_t dbytes,
75                    uint32_t orig_crc, void *target);
76
77 #endif