diff options
Diffstat (limited to 'InOsEmuPkg/Unix/Sec')
-rw-r--r-- | InOsEmuPkg/Unix/Sec/EmuThunk.c | 69 | ||||
-rw-r--r-- | InOsEmuPkg/Unix/Sec/Gasket.h | 29 | ||||
-rw-r--r-- | InOsEmuPkg/Unix/Sec/SecMain.c | 7 | ||||
-rw-r--r-- | InOsEmuPkg/Unix/Sec/X64/Gasket.S | 67 |
4 files changed, 168 insertions, 4 deletions
diff --git a/InOsEmuPkg/Unix/Sec/EmuThunk.c b/InOsEmuPkg/Unix/Sec/EmuThunk.c index abae70b89a..579f67fa1a 100644 --- a/InOsEmuPkg/Unix/Sec/EmuThunk.c +++ b/InOsEmuPkg/Unix/Sec/EmuThunk.c @@ -49,12 +49,75 @@ SecWriteStdErr ( { ssize_t Return; - Return = write (1, (const void *)Buffer, (size_t)NumberOfBytes); + Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes); return (Return == -1) ? 0 : Return; } +EFI_STATUS +SecConfigStdIn ( + VOID + ) +{ + struct termios tty; + + // + // Need to turn off line buffering, ECHO, and make it unbuffered. + // + tcgetattr (STDIN_FILENO, &tty); + tty.c_lflag &= ~(ICANON | ECHO); + tcsetattr (STDIN_FILENO, TCSANOW, &tty); + +// setvbuf (STDIN_FILENO, NULL, _IONBF, 0); + + // now ioctl FIONREAD will do what we need + return EFI_SUCCESS; +} + +UINTN +SecWriteStdOut ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + ssize_t Return; + + Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes); + + return (Return == -1) ? 0 : Return; +} + +UINTN +SecReadStdIn ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + ssize_t Return; + + Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes); + + return (Return == -1) ? 0 : Return; +} + +BOOLEAN +SecPollStdIn ( + VOID + ) +{ + int Result; + int Bytes; + + Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes); + if (Result == -1) { + return FALSE; + } + + return (BOOLEAN)(Bytes > 0); +} + + void settimer_handler (int sig) @@ -287,6 +350,10 @@ SecGetNextProtocol ( EMU_THUNK_PROTOCOL gEmuThunkProtocol = { GasketSecWriteStdErr, + GasketSecConfigStdIn, + GasketSecWriteStdOut, + GasketSecReadStdIn, + GasketSecPollStdIn, GasketSecPeCoffGetEntryPoint, GasketSecPeCoffRelocateImageExtraAction, GasketSecPeCoffUnloadImageExtraAction, diff --git a/InOsEmuPkg/Unix/Sec/Gasket.h b/InOsEmuPkg/Unix/Sec/Gasket.h index e506e774b6..5cc42dd575 100644 --- a/InOsEmuPkg/Unix/Sec/Gasket.h +++ b/InOsEmuPkg/Unix/Sec/Gasket.h @@ -21,11 +21,40 @@ //
UINTN
+EFIAPI
GasketSecWriteStdErr (
IN UINT8 *Buffer,
IN UINTN NumberOfBytes
);
+EFI_STATUS
+EFIAPI
+GasketSecConfigStdIn (
+ VOID
+ );
+
+UINTN
+EFIAPI
+GasketSecWriteStdOut (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ );
+
+UINTN
+EFIAPI
+GasketSecReadStdIn (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ );
+
+BOOLEAN
+EFIAPI
+GasketSecPollStdIn (
+ VOID
+ );
+
+
+
RETURN_STATUS
EFIAPI
GasketSecPeCoffGetEntryPoint (
diff --git a/InOsEmuPkg/Unix/Sec/SecMain.c b/InOsEmuPkg/Unix/Sec/SecMain.c index ff5eff0c07..41b66b3bc0 100644 --- a/InOsEmuPkg/Unix/Sec/SecMain.c +++ b/InOsEmuPkg/Unix/Sec/SecMain.c @@ -354,18 +354,19 @@ MapFile ( VOID *res; UINTN FileSize; - fd = open (FileName, O_RDONLY); + fd = open (FileName, O_RDWR); if (fd < 0) { return EFI_NOT_FOUND; } FileSize = lseek (fd, 0, SEEK_END); - res = MapMemory (fd, FileSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE); + res = MapMemory (fd, FileSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED); close (fd); - if (res == MAP_FAILED) { + if (res == NULL) { + perror ("MapFile() Failed"); return EFI_DEVICE_ERROR; } diff --git a/InOsEmuPkg/Unix/Sec/X64/Gasket.S b/InOsEmuPkg/Unix/Sec/X64/Gasket.S index e5515e259b..093b05ca07 100644 --- a/InOsEmuPkg/Unix/Sec/X64/Gasket.S +++ b/InOsEmuPkg/Unix/Sec/X64/Gasket.S @@ -60,6 +60,73 @@ ASM_PFX(GasketSecWriteStdErr): ret +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn) +ASM_PFX(GasketSecConfigStdIn): + pushq %rbp // stack frame is for the debugger + movq %rsp, %rbp + + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI + pushq %rdi + + call ASM_PFX(SecConfigStdIn) + + popq %rdi // restore state + popq %rsi + popq %rbp + ret + +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut) +ASM_PFX(GasketSecWriteStdOut): + pushq %rbp // stack frame is for the debugger + movq %rsp, %rbp + + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI + pushq %rdi + + movq %rcx, %rdi // Swizzle args + movq %rdx, %rsi + + call ASM_PFX(SecWriteStdOut) + + popq %rdi // restore state + popq %rsi + popq %rbp + ret + +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn) +ASM_PFX(GasketSecReadStdIn): + pushq %rbp // stack frame is for the debugger + movq %rsp, %rbp + + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI + pushq %rdi + + movq %rcx, %rdi // Swizzle args + movq %rdx, %rsi + + call ASM_PFX(SecReadStdIn) + + popq %rdi // restore state + popq %rsi + popq %rbp + ret + +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn) +ASM_PFX(GasketSecPollStdIn): + pushq %rbp // stack frame is for the debugger + movq %rsp, %rbp + + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI + pushq %rdi + + call ASM_PFX(SecPollStdIn) + + popq %rdi // restore state + popq %rsi + popq %rbp + ret + + ASM_GLOBAL ASM_PFX(GasketSecSetTimer) ASM_PFX(GasketSecSetTimer): pushq %rbp // stack frame is for the debugger |