Implement some 16-bit APIs that our hello16.exe needs.

This commit is contained in:
Ryan C. Gordon committed 2018-06-06 17:27:37 -04:00
1 parent bd2a9bf249
commit 085b1c7ec7
6 files changed
+140 -8

No files matched your search

+41
View File
@@ -9,6 +9,32 @@
/* This is glue code for OS/2 binaries. Native binaries don't need this. */
#if LX_LEGACY
static VOID bridge16to32_Dos16Exit(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, result);
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, action);
Dos16Exit(action, result);
}
static APIRET16 bridge16to32_Dos16GetHugeShift(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pcount);
return Dos16GetHugeShift(pcount);
}
static APIRET16 bridge16to32_Dos16GetMachineMode(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PBYTE, pmode);
return Dos16GetMachineMode(pmode);
}
static APIRET16 bridge16to32_Dos16GetVersion(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pver);
return Dos16GetVersion(pver);
}
static APIRET16 bridge16to32_Dos16GetPID(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PPIDINFO, ppidinfo);
return Dos16GetPID(ppidinfo);
}
static APIRET16 bridge16to32_DosSemRequest(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(LONG, ms);
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PHSEM16, sem);
@@ -32,6 +58,11 @@ static APIRET16 bridge16to32_DosSemSet(uint8 *args) {
}
LX_NATIVE_MODULE_16BIT_SUPPORT()
LX_NATIVE_MODULE_16BIT_API(Dos16Exit)
LX_NATIVE_MODULE_16BIT_API(Dos16GetHugeShift)
LX_NATIVE_MODULE_16BIT_API(Dos16GetMachineMode)
LX_NATIVE_MODULE_16BIT_API(Dos16GetVersion)
LX_NATIVE_MODULE_16BIT_API(Dos16GetPID)
LX_NATIVE_MODULE_16BIT_API(DosSemRequest)
LX_NATIVE_MODULE_16BIT_API(DosSemClear)
LX_NATIVE_MODULE_16BIT_API(DosSemWait)
@@ -44,6 +75,11 @@ LX_NATIVE_MODULE_DEINIT({
static int init16_doscalls(void) {
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT()
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16Exit, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetHugeShift, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetMachineMode, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetVersion, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetPID, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemRequest, 8)
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemClear, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8)
@@ -53,6 +89,11 @@ static int init16_doscalls(void) {
}
LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; })
LX_NATIVE_EXPORT16(Dos16Exit, 5),
LX_NATIVE_EXPORT16(Dos16GetHugeShift, 41),
LX_NATIVE_EXPORT16(Dos16GetMachineMode, 49),
LX_NATIVE_EXPORT16(Dos16GetVersion, 92),
LX_NATIVE_EXPORT16(Dos16GetPID, 94),
LX_NATIVE_EXPORT16(DosSemRequest, 140),
LX_NATIVE_EXPORT16(DosSemClear, 141),
LX_NATIVE_EXPORT16(DosSemWait, 142),
+47 -3
View File
@@ -295,10 +295,8 @@ static void runDosExitList(const uint32 why)
} // for
} // runDosExitList
VOID DosExit(ULONG action, ULONG exitcode)
static VOID DosExit_implementation(ULONG action, ULONG exitcode)
{
TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode);
// !!! FIXME: what does a value other than 0 or 1 do here?
if (action == EXIT_THREAD) {
// !!! FIXME: If last thread: terminate process.
@@ -310,6 +308,12 @@ VOID DosExit(ULONG action, ULONG exitcode)
runDosExitList(TC_EXIT);
GLoaderState.terminate(exitcode);
} // DosExit_implementation
VOID DosExit(ULONG action, ULONG exitcode)
{
TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode);
DosExit_implementation(action, exitcode);
} // DosExit
APIRET DosExitList(ULONG ordercode, PFNEXITLIST fn)
@@ -2862,6 +2866,46 @@ APIRET DosSetFileSize(HFILE h, ULONG len)
return NO_ERROR;
} // DosSetFileSize
APIRET16 Dos16GetVersion(PUSHORT pver)
{
TRACE_NATIVE("Dos16GetVersion(%p)", pver);
uint8 *bytes = (uint8 *) pver;
FIXME("better version here?");
bytes[0] = 2;
bytes[1] = 4;
return NO_ERROR;
} // Dos16GetVersion
APIRET16 Dos16GetMachineMode(PBYTE pmode)
{
TRACE_NATIVE("Dos16GetMachineMode(%p)", pmode);
*pmode = 1; // 1==OS/2 mode (as opposed to zero for DOS mode).
return NO_ERROR;
} // Dos16GetMachineMode
APIRET16 Dos16GetHugeShift(PUSHORT pcount)
{
TRACE_NATIVE("Dos16GetHugeShift(%p)", pcount);
*pcount = 0; FIXME("maybe?");
return NO_ERROR;
} // Dos16GetHugeShift
APIRET16 Dos16GetPID(PPIDINFO ppidinfo)
{
TRACE_NATIVE("Dos16GetPID(%p)", ppidinfo);
PTIB2 tib2 = (PTIB2) LX_GETTIB2();
ppidinfo->pid = GLoaderState.pib.pib_ulpid;
ppidinfo->tid = tib2->tib2_ultid;
ppidinfo->pidParent = GLoaderState.pib.pib_ulppid;
return NO_ERROR;
} // Dos16GetPID
VOID Dos16Exit(USHORT action, USHORT exitcode)
{
TRACE_NATIVE("Dos16Exit(%u, %u)", (uint) action, (uint) exitcode);
DosExit_implementation(action, exitcode);
} // Dos16Exit
LX_NATIVE_CONSTRUCTOR(doscalls)
{
+13
View File
@@ -430,6 +430,19 @@ OS2EXPORT APIRET16 OS2API16 DosSemWait(PHSEM16 sem, LONG ms) OS2APIINFO(142);
OS2EXPORT APIRET16 OS2API16 DosSemSet(PHSEM16 sem) OS2APIINFO(143);
// These are only meant to be available to 16-bit binaries, some were removed in OS/2 2.0's SDK.
OS2EXPORT APIRET16 OS2API16 Dos16GetVersion(PUSHORT pver) OS2APIINFO(92);
OS2EXPORT APIRET16 OS2API16 Dos16GetMachineMode(PBYTE pmode) OS2APIINFO(49);
OS2EXPORT APIRET16 OS2API16 Dos16GetHugeShift(PUSHORT pcount) OS2APIINFO(41);
OS2EXPORT VOID OS2API16 Dos16Exit(USHORT action, USHORT result) OS2APIINFO(5);
typedef struct {
PID pid;
TID tid;
PID pidParent;
} PIDINFO, *PPIDINFO;
OS2EXPORT APIRET16 OS2API16 Dos16GetPID(PPIDINFO ppidinfo) OS2APIINFO(94);
// !!! FIXME: these should probably get sorted alphabetically and/or grouped
// !!! FIXME: into areas of functionality, but for now, I'm just listing them
+24 -1
View File
@@ -9,7 +9,30 @@
/* This is glue code for OS/2 binaries. Native binaries don't need this. */
#if LX_LEGACY
LX_NATIVE_MODULE_INIT()
static APIRET16 bridge16to32_Dos16PutMessage(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PCHAR, pBuf);
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, cbMsg);
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, hfile);
return Dos16PutMessage(hfile, cbMsg, pBuf);
}
LX_NATIVE_MODULE_16BIT_SUPPORT()
LX_NATIVE_MODULE_16BIT_API(Dos16PutMessage)
LX_NATIVE_MODULE_16BIT_SUPPORT_END()
LX_NATIVE_MODULE_DEINIT({
LX_NATIVE_MODULE_DEINIT_16BIT_SUPPORT();
})
static int init16_msg(void) {
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT()
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16PutMessage, 8)
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END()
return 1;
}
LX_NATIVE_MODULE_INIT({ if (!init16_msg()) return 0; })
LX_NATIVE_EXPORT16(Dos16PutMessage, 1),
LX_NATIVE_EXPORT(DosPutMessage, 5)
LX_NATIVE_MODULE_INIT_END()
+14 -4
View File
@@ -6,18 +6,28 @@
* This file written by Ryan C. Gordon.
*/
#include <unistd.h>
#include "os2native.h"
#include "os2native16.h"
#include "msg.h"
#include <unistd.h>
#include "msg-lx.h"
APIRET DosPutMessage(HFILE handle, ULONG msglen, PCHAR msg)
{
TRACE_NATIVE("DosPutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg);
FIXME("really implement this");
write(handle, msg, msglen);
return 0;
return NO_ERROR;
} // DosPutMessage
APIRET16 Dos16PutMessage(USHORT handle, USHORT msglen, PCHAR msg)
{
TRACE_NATIVE("Dos16PutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg);
FIXME("really implement this");
write(handle, msg, msglen);
return NO_ERROR;
} // Dos16PutMessage
// end of msg.c ...
+1
View File
@@ -15,6 +15,7 @@
extern "C" {
#endif
OS2EXPORT APIRET16 OS2API16 Dos16PutMessage(USHORT hfile, USHORT cbMsg, PCHAR pBuf) OS2APIINFO(1);
OS2EXPORT APIRET OS2API DosPutMessage(HFILE hfile, ULONG cbMsg, PCHAR pBuf) OS2APIINFO(5);
#ifdef __cplusplus