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
;
59 if (settimer_callback
) {
61 ReverseGasketUint64 (settimer_callback
, delta
);
63 (*settimer_callback
)(delta
);
69 SetTimer (UINT64 PeriodMs
, VOID (*CallBack
)(UINT64 DeltaMs
))
71 struct itimerval timerval
;
74 if (!settimer_initialized
) {
77 settimer_initialized
= 1;
78 act
.sa_handler
= settimer_handler
;
80 sigemptyset (&act
.sa_mask
);
81 if (sigaction (SIGALRM
, &act
, NULL
) != 0) {
82 printf ("SetTimer: sigaction error %s\n", strerror (errno
));
84 if (gettimeofday (&settimer_timeval
, NULL
) != 0) {
85 printf ("SetTimer: gettimeofday error %s\n", strerror (errno
));
88 timerval
.it_value
.tv_sec
= DivU64x32(PeriodMs
, 1000);
89 DivU64x32Remainder(PeriodMs
, 1000, &remainder
);
90 timerval
.it_value
.tv_usec
= remainder
* 1000;
91 timerval
.it_value
.tv_sec
= DivU64x32(PeriodMs
, 1000);
92 timerval
.it_interval
= timerval
.it_value
;
94 if (setitimer (ITIMER_REAL
, &timerval
, NULL
) != 0) {
95 printf ("SetTimer: setitimer error %s\n", strerror (errno
));
97 settimer_callback
= CallBack
;
101 msSleep (unsigned long Milliseconds
)
103 struct timespec rq
, rm
;
105 rq
.tv_sec
= Milliseconds
/ 1000;
106 rq
.tv_nsec
= (Milliseconds
% 1000) * 1000000;
108 while (nanosleep (&rq
, &rm
) != -1) {
109 if (errno
!= EINTR
) {
118 GetLocalTime (EFI_TIME
*Time
)
126 Time
->Year
= 1900 + tm
->tm_year
;
127 Time
->Month
= tm
->tm_mon
+ 1;
128 Time
->Day
= tm
->tm_mday
;
129 Time
->Hour
= tm
->tm_hour
;
130 Time
->Minute
= tm
->tm_min
;
131 Time
->Second
= tm
->tm_sec
;
132 Time
->Nanosecond
= 0;
133 Time
->TimeZone
= timezone
;
134 Time
->Daylight
= (daylight
? EFI_TIME_ADJUST_DAYLIGHT
: 0)
135 | (tm
->tm_isdst
> 0 ? EFI_TIME_IN_DAYLIGHT
: 0);
170 UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL
**UgaIo
, CONST CHAR16
*Title
);
172 EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable
= {
173 EFI_UNIX_THUNK_PROTOCOL_SIGNATURE
,
176 // Mac OS X requires the stack to be 16-byte aligned for IA-32. So on an OS X build
177 // we add an assembly wrapper that makes sure the stack ges aligned.
178 // This has the nice benfit of being able to run EFI ABI code, like the EFI shell
179 // that is checked in to source control in the OS X version of the emulator
181 GasketmsSleep
, /* Sleep */
182 Gasketexit
, /* Exit */
220 GasketUnixPeCoffGetEntryPoint
,
221 GasketUnixPeCoffRelocateImageExtraAction
,
222 GasketUnixPeCoffUnloadImageExtraAction
238 (UnixFtruncate
)ftruncate
,
264 SecPeCoffGetEntryPoint
,
265 SecPeCoffRelocateImageExtraAction
,
266 SecPeCoffLoaderUnloadImageExtraAction
271 EFI_UNIX_THUNK_PROTOCOL
*gUnix
= &mUnixThunkTable
;