PAL {
    global:
        # Drawbridge ABIs
        DkVirtualMemoryAlloc; DkVirtualMemoryFree; DkVirtualMemoryProtect;
        DkThreadCreate; DkThreadDelayExecution;
        DkThreadYieldExecution; DkThreadExit; DkThreadResume;

        DkMutexCreate; DkNotificationEventCreate;
        DkSynchronizationEventCreate;
        DkMutexRelease;
        DkEventSet;  DkEventClear;
        DkObjectsWaitAny;

        DkStreamOpen; DkStreamRead; DkStreamWrite;
        DkStreamMap; DkStreamUnmap; DkStreamSetLength;
        DkStreamFlush; DkStreamDelete;
        DkSendHandle; DkReceiveHandle; # Added by us
        DkStreamWaitForClient;
        DkStreamGetName;
        DkStreamAttributesQueryByHandle; DkStreamAttributesQuery;

        DkProcessCreate; DkProcessExit;

        DkProcessSandboxCreate;

        DkSystemTimeQuery; DkRandomBitsRead;
        DkInstructionCacheFlush;
        DkCpuIdRetrieve;
        DkObjectClose;
        # objects checkpoint?
        # objects reload?

        # The ABIs we added in the paper
        DkSetExceptionHandler; DkExceptionReturn; # exceptions
        DkCreatePhysicalMemoryChannel; # IPC
        DkPhysicalMemoryCommit; # IPC
        DkPhysicalMemoryMap; # IPC
        DkSegmentRegister; # set segmentation registers
        DkStreamChangeName;
        DkStreamAttributesSetByHandle;
        DkMemoryAvailableQuota;

        # Debugging ABIs
        pal_printf; DkDebugAttachBinary; DkDebugDetachBinary;

        # Control block
        pal_control_addr; pal_sec;

        # debugger
        _r_debug;

    local: *;
};
PAL_PRIVATE {
    global:
        _dl_debug_state;
};
