This gets us everything we need (I hope!) to support 16-bit code in LX binaries and call into 16-bit OS/2 APIs. This is just enough to call into VioGetMode() (which isn't otherwise implemented yet) as an example. If this is ever used Winelib-style to provide an OS/2 API to native Linux binaries, the 16-bit system APIs are 32-bit clean and C callable, as one might expect them to be. All the tapdancing is to support existing LX binaries in the loader and bridge between the 32-bit clean APIs and existing 16-bit code that expects to call 16-bit APIs. This was a staggering amount of effort, but yay! Other fixes and improvements probably leaked into this commit, as a lot of code got touched and a lot of research and debugging took place.
81 lines
2.2 KiB
C
81 lines
2.2 KiB
C
#ifndef _INCL_OS2TYPES_H_
|
|
#define _INCL_OS2TYPES_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef APIENTRY
|
|
#define APIENTRY
|
|
#endif
|
|
|
|
#ifndef OS2EXPORT
|
|
#define OS2EXPORT __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
#ifndef OS2API
|
|
#define OS2API APIENTRY OS2EXPORT
|
|
#endif
|
|
|
|
// Note that we never export actual 16-bit APIs from these headers, even if
|
|
// we have them marked as OS2API16. This is just for documentation's sake at
|
|
// the moment. If you compile against these headers and link against an
|
|
// OS2API16 function, they will be exist and operate in a linear address
|
|
// space. If you call them from an LX executable, though, the system assumes
|
|
// you're calling in from 16-bit code and exports something that cleans up
|
|
// the details behind the scenes.
|
|
// For developing against this API directly on Linux, you should assume this
|
|
// works like OS/2's PowerPC port, and the same 16-bit APIs you used on x86
|
|
// were made 32-bit clean by default for the new platform.
|
|
#ifndef OS2API16
|
|
#define OS2API16 OS2API
|
|
#endif
|
|
|
|
typedef uint32_t APIRET;
|
|
typedef uint16_t APIRET16;
|
|
typedef uint32_t APIRET32;
|
|
|
|
typedef void VOID;
|
|
typedef VOID *PVOID;
|
|
typedef PVOID *PPVOID;
|
|
typedef char CHAR, *PCHAR;
|
|
typedef uint8_t UCHAR, *PUCHAR;
|
|
typedef int16_t SHORT, *PSHORT;
|
|
typedef uint16_t USHORT, *PUSHORT;
|
|
typedef int32_t LONG, *PLONG;
|
|
typedef uint32_t ULONG, *PULONG;
|
|
typedef uint32_t BOOL32, *PBOOL32;
|
|
typedef int64_t LONGLONG, *PLONGLONG;
|
|
typedef uint64_t ULONGLONG, *PULONGLONG;
|
|
typedef uint8_t BYTE, *PBYTE;
|
|
|
|
// !!! FIXME: HANDLE should either be 64-bits on x86_64, or we need to
|
|
// !!! FIXME: refactor and mutex a bunch of stuff...if it has to be a 32-bit
|
|
// !!! FIXME: int, it needs to be an index into a resizable array, but at the
|
|
// !!! FIXME: native word size, these handles can just be pointers cast to ints.
|
|
typedef uint16_t SHANDLE, *PSHANDLE;
|
|
typedef uint32_t LHANDLE, *PLHANDLE;
|
|
typedef LHANDLE HANDLE, *PHANDLE;
|
|
typedef HANDLE HMODULE, *PHMODULE;
|
|
typedef HANDLE HFILE, *PHFILE;
|
|
typedef HANDLE HDIR, *PHDIR;
|
|
typedef HANDLE HEV, *PHEV;
|
|
typedef HANDLE HMTX, *PHMTX;
|
|
typedef HANDLE PID, *PPID;
|
|
typedef HANDLE TID, *PTID;
|
|
typedef SHANDLE HVIO, *PHVIO;
|
|
typedef PCHAR PSZ;
|
|
|
|
typedef int (APIENTRY *PFN)(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// end of os2types.h ...
|
|
|