From 7e284acb40a3d27009de3cfe48275fed3c5d004b Mon Sep 17 00:00:00 2001 From: andrewfish Date: Wed, 8 Jun 2011 02:34:12 +0000 Subject: Add support for SerialPortLib that maps into POSIX StdIn and StdOut. Add a device path text to lib as a holding point waiting on getting it reviewed for other packages. Some minor fixes. Also map the FV as writable, so the Variable store becomes writable. I plan to try and make only the Variable store and logs writable, and make the executable/compressed FV read only in a future checkin. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11760 6f19259b-4bc3-4df7-8a09-765794883524 --- InOsEmuPkg/Unix/Sec/EmuThunk.c | 69 +++++++++++++++++++++++++++++++++++++++- InOsEmuPkg/Unix/Sec/Gasket.h | 29 +++++++++++++++++ InOsEmuPkg/Unix/Sec/SecMain.c | 7 ++-- InOsEmuPkg/Unix/Sec/X64/Gasket.S | 67 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 4 deletions(-) (limited to 'InOsEmuPkg/Unix/Sec') 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 -- cgit v1.2.3