3 Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
4 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 Since the SEC is the only program in our emulation we
20 must use a Tiano mechanism to export APIs to other modules.
21 This is the role of the EFI_UNIX_THUNK_PROTOCOL.
23 The mUnixThunkTable exists so that a change to EFI_UNIX_THUNK_PROTOCOL
24 will cause an error in initializing the array if all the member functions
25 are not added. It looks like adding a element to end and not initializing
26 it may cause the table to be initaliized with the members at the end being
27 set to zero. This is bad as jumping to zero will crash.
30 gUnix is a a public exported global that contains the initialized
37 #include "Library/UnixLib.h"
43 int settimer_initialized
;
44 struct timeval settimer_timeval
;
45 void (*settimer_callback
)(UINT64 delta
);
48 settimer_handler (int sig
)
50 struct timeval timeval
;
53 gettimeofday (&timeval
, NULL
);
54 delta
= ((UINT64
)timeval
.tv_sec
* 1000) + (timeval
.tv_usec
/ 1000)
55 - ((UINT64
)settimer_timeval
.tv_sec
* 1000)
56 - (settimer_timeval
.tv_usec
/ 1000);
57 settimer_timeval
= timeval
;
58 if (settimer_callback
)
59 (*settimer_callback
)(delta
);
63 SetTimer (UINT64 PeriodMs
, VOID (*CallBack
)(UINT64 DeltaMs
))
65 struct itimerval timerval
;
68 if (!settimer_initialized
) {
71 settimer_initialized
= 1;
72 act
.sa_handler
= settimer_handler
;
74 sigemptyset (&act
.sa_mask
);
75 if (sigaction (SIGALRM
, &act
, NULL
) != 0) {
76 printf ("SetTimer: sigaction error %s\n", strerror (errno
));
78 if (gettimeofday (&settimer_timeval
, NULL
) != 0) {
79 printf ("SetTimer: gettimeofday error %s\n", strerror (errno
));
82 timerval
.it_value
.tv_sec
= DivU64x32(PeriodMs
, 1000);
83 DivU64x32Remainder(PeriodMs
, 1000, &remainder
);
84 timerval
.it_value
.tv_usec
= remainder
* 1000;
85 timerval
.it_value
.tv_sec
= DivU64x32(PeriodMs
, 1000);
86 timerval
.it_interval
= timerval
.it_value
;
88 if (setitimer (ITIMER_REAL
, &timerval
, NULL
) != 0) {
89 printf ("SetTimer: setitimer error %s\n", strerror (errno
));
91 settimer_callback
= CallBack
;
95 msSleep (unsigned long Milliseconds
)
99 ts
.tv_sec
= Milliseconds
/ 1000;
100 ts
.tv_nsec
= (Milliseconds
% 1000) * 1000000;
102 while (nanosleep (&ts
, &ts
) != 0 && errno
== EINTR
)
107 GetLocalTime (EFI_TIME
*Time
)
115 Time
->Year
= 1900 + tm
->tm_year
;
116 Time
->Month
= tm
->tm_mon
+ 1;
117 Time
->Day
= tm
->tm_mday
;
118 Time
->Hour
= tm
->tm_hour
;
119 Time
->Minute
= tm
->tm_min
;
120 Time
->Second
= tm
->tm_sec
;
121 Time
->Nanosecond
= 0;
122 Time
->TimeZone
= timezone
;
123 Time
->Daylight
= (daylight
? EFI_TIME_ADJUST_DAYLIGHT
: 0)
124 | (tm
->tm_isdst
> 0 ? EFI_TIME_IN_DAYLIGHT
: 0);
159 UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL
**UgaIo
, CONST CHAR16
*Title
);
161 EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable
= {
162 EFI_UNIX_THUNK_PROTOCOL_SIGNATURE
,
165 // Mac OS X requires the stack to be 16-byte aligned for IA-32. So on an OS X build
166 // we add an assembly wrapper that makes sure the stack ges aligned.
167 // This has the nice benfit of being able to run EFI ABI code, like the EFI shell
168 // that is checked in to source control in the OS X version of the emulator
170 GasketmsSleep
, /* Sleep */
171 Gasketexit
, /* Exit */
177 (UnixPoll
)Gasketpoll
,
178 (UnixRead
)Gasketread
,
179 (UnixWrite
)Gasketwrite
,
181 (UnixOpen
)Gasketopen
,
182 (UnixSeek
)Gasketlseek
,
183 (UnixFtruncate
)Gasketftruncate
,
190 (UnixRewindDir
)Gasketrewinddir
,
210 dlopen
, // Update me with a gasket
211 dlerror
, // Update me with a gasket
212 dlsym
, // Update me with a gasket
214 SecPeCoffGetEntryPoint
, // Update me with a gasket
215 SecPeCoffRelocateImageExtraAction
, // Update me with a gasket
216 SecPeCoffLoaderUnloadImageExtraAction
// Update me with a gasket
232 (UnixFtruncate
)ftruncate
,
261 SecPeCoffGetEntryPoint
,
262 SecPeCoffRelocateImageExtraAction
,
263 SecPeCoffLoaderUnloadImageExtraAction
268 EFI_UNIX_THUNK_PROTOCOL
*gUnix
= &mUnixThunkTable
;