Browse Source

+ Empty UEFI ThreadManager implementation (based on the Native NT target).
This avoid crash when adding a uses on SysUtils in a program.
A critical section is used in TEncoding class functions (see sysencoding.inc)
and require an implementation that, at least, do not crash ;-)

git-svn-id: branches/olivier/uefi@36921 -

olivier 8 years ago
parent
commit
d34c6297d8
1 changed files with 248 additions and 3 deletions
  1. 248 3
      rtl/uefi/systhrd.inc

+ 248 - 3
rtl/uefi/systhrd.inc

@@ -1,8 +1,11 @@
 {
 {
-    Basic UEFI definitions
-
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
-    Copyright (c) 2014 by Olivier Coursière
+    Copyright (c) 2010 by Sven Barth
+    Copyright (c) 2017 by Olivier Coursière
+
+    Basic UEFI definitions    
+    Empty threading implementation for the UEFI target.    
+    Based on Native NT threading support implementation
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -12,3 +15,245 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
  **********************************************************************}
  **********************************************************************}
+
+const
+  STATUS_NOT_IMPLEMENTED = LongInt($C0000002);
+
+{*****************************************************************************
+                             Threadvar support
+*****************************************************************************}
+
+    const
+      threadvarblocksize : dword = 0;
+
+    procedure SysInitThreadvar(var offset : dword;size : dword);
+      begin
+        offset:=threadvarblocksize;
+      {$ifdef CPUARM}
+        // Data must be allocated at 4 bytes boundary for ARM
+        size:=(size + 3) and not dword(3);
+      {$endif CPUARM}
+        inc(threadvarblocksize,size);
+      end;
+
+
+    procedure SysAllocateThreadVars;
+      begin
+      end;
+
+    procedure SysInitMultithreading;
+      begin
+      end;
+
+
+    procedure SysFiniMultithreading;
+      begin
+      end;
+
+    function SysRelocateThreadvar(offset : dword) : pointer;
+      begin
+        SysRelocateThreadvar:=Pointer(Offset);
+      end;
+
+
+    procedure SysReleaseThreadVars;
+      begin
+      end;
+
+{*****************************************************************************
+                            Thread starting
+*****************************************************************************}
+
+    function SysBeginThread(sa : Pointer;stacksize : ptruint;
+                         ThreadFunction : tthreadfunc;p : pointer;
+                         creationFlags : dword;var ThreadId : TThreadID) : TThreadID;
+      begin
+        ThreadId := 0;
+        Result := 0;
+      end;
+
+
+    procedure SysEndThread(ExitCode : DWord);
+      begin
+        DoneThread;
+      end;
+
+
+    procedure SysThreadSwitch;
+    begin
+    end;
+
+
+    function  SysSuspendThread (threadHandle : TThreadID) : dword;
+    begin
+      Result := STATUS_NOT_IMPLEMENTED;
+    end;
+
+
+    function  SysResumeThread  (threadHandle : TThreadID) : dword;
+    begin
+      Result := STATUS_NOT_IMPLEMENTED;
+    end;
+
+
+    function  SysKillThread (threadHandle : TThreadID) : dword;
+    begin
+      Result := STATUS_NOT_IMPLEMENTED;
+    end;
+
+    function  SysCloseThread (threadHandle : TThreadID) : dword;
+    begin
+      Result := STATUS_NOT_IMPLEMENTED;
+    end;
+
+    function  SysWaitForThreadTerminate (threadHandle : TThreadID; TimeoutMs : longint) : dword;
+    begin
+      Result := STATUS_NOT_IMPLEMENTED;
+    end;
+
+
+    function  SysThreadSetPriority (threadHandle : TThreadID; Prio: longint): boolean;            {-15..+15, 0=normal}
+    begin
+      Result := False;
+    end;
+
+
+    function  SysThreadGetPriority (threadHandle : TThreadID): longint;
+    begin
+      Result := 0;
+    end;
+
+    function  SysGetCurrentThreadId : TThreadID;
+    begin
+      Result := 0;
+    end;
+
+{*****************************************************************************
+                          Delphi/Win32 compatibility
+*****************************************************************************}
+
+procedure SysInitCriticalSection(var cs);
+begin
+  Pointer(cs) := GetMem(SizeOf(Pointer));
+end;
+
+
+procedure SysDoneCriticalSection(var cs);
+begin
+  FreeMem(Pointer(cs));
+end;
+
+
+procedure SysEnterCriticalSection(var cs);
+begin
+end;
+
+function SysTryEnterCriticalSection(var cs):longint;
+begin
+  Result := STATUS_NOT_IMPLEMENTED;
+end;
+
+procedure SysLeaveCriticalSection(var cs);
+begin
+end;
+
+
+function intBasicEventCreate(EventAttributes : Pointer;
+AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
+begin
+  Result := GetMem(SizeOf(Pointer));
+end;
+
+procedure intbasiceventdestroy(state:peventstate);
+begin
+  FreeMem(state);
+end;
+
+procedure intbasiceventResetEvent(state:peventstate);
+begin
+
+end;
+
+procedure intbasiceventSetEvent(state:peventstate);
+begin
+end;
+
+function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
+begin
+  Result := STATUS_NOT_IMPLEMENTED;
+end;
+
+function intRTLEventCreate: PRTLEvent;
+begin
+  Result := GetMem(SizeOf(Pointer));
+end;
+
+procedure intRTLEventDestroy(AEvent: PRTLEvent);
+begin
+  FreeMem(AEvent);
+end;
+
+procedure intRTLEventSetEvent(AEvent: PRTLEvent);
+begin
+
+end;
+
+procedure intRTLEventResetEvent(AEvent: PRTLEvent);
+begin
+
+end;
+
+procedure intRTLEventWaitFor(AEvent: PRTLEvent);
+begin
+
+end;
+
+procedure intRTLEventWaitForTimeout(AEvent: PRTLEvent;timeout : longint);
+begin
+
+end;
+
+
+Var
+  UEFIThreadManager : TThreadManager;
+
+Procedure InitSystemThreads;
+begin
+  With UEFIThreadManager do
+    begin
+    InitManager            :=Nil;
+    DoneManager            :=Nil;
+    BeginThread            :=@SysBeginThread;
+    EndThread              :=@SysEndThread;
+    SuspendThread          :=@SysSuspendThread;
+    ResumeThread           :=@SysResumeThread;
+    KillThread             :=@SysKillThread;
+    ThreadSwitch           :=@SysThreadSwitch;
+    CloseThread		   :=@SysCloseThread;
+    WaitForThreadTerminate :=@SysWaitForThreadTerminate;
+    ThreadSetPriority      :=@SysThreadSetPriority;
+    ThreadGetPriority      :=@SysThreadGetPriority;
+    GetCurrentThreadId     :=@SysGetCurrentThreadId;
+    InitCriticalSection    :=@SysInitCriticalSection;
+    DoneCriticalSection    :=@SysDoneCriticalSection;
+    EnterCriticalSection   :=@SysEnterCriticalSection;
+    TryEnterCriticalSection:=@SysTryEnterCriticalSection;
+    LeaveCriticalSection   :=@SysLeaveCriticalSection;
+    InitThreadVar          :=@SysInitThreadVar;
+    RelocateThreadVar      :=@SysRelocateThreadVar;
+    AllocateThreadVars     :=@SysAllocateThreadVars;
+    ReleaseThreadVars      :=@SysReleaseThreadVars;
+    BasicEventCreate       :=@intBasicEventCreate;
+    BasicEventDestroy      :=@intBasicEventDestroy;
+    BasicEventResetEvent   :=@intBasicEventResetEvent;
+    BasicEventSetEvent     :=@intBasicEventSetEvent;
+    BasiceventWaitFor      :=@intBasiceventWaitFor;
+    RTLEventCreate         :=@intRTLEventCreate;
+    RTLEventDestroy        :=@intRTLEventDestroy;
+    RTLEventSetEvent       :=@intRTLEventSetEvent;
+    RTLEventResetEvent     :=@intRTLEventResetEvent;
+    RTLEventWaitFor        :=@intRTLEventWaitFor;
+    RTLEventWaitForTimeout :=@intRTLEventWaitForTimeout;
+    end;
+  SetThreadManager(UEFIThreadManager);
+end;