30 lines
1.0 KiB
C
30 lines
1.0 KiB
C
|
/* Simple work-around for running the 64-bit Adobe Flash plug-in version 10
|
||
|
on Athlon64 processors without support for the lahf instruction.
|
||
|
|
||
|
Compile with:
|
||
|
cc -fPIC -shared -nostdlib -lc -oflashplugin-lahf-fix.so flashplugin-lahf-fix.c
|
||
|
Then place the .so file in the plug-in directory (e.g. $HOME/.mozilla/plugins)
|
||
|
or use LD_PRELOAD to force Firefox to load the library.
|
||
|
|
||
|
- Maks Verver <maksverver@geocities.com> July 2009 */
|
||
|
|
||
|
#define _GNU_SOURCE
|
||
|
#include <stdlib.h>
|
||
|
#include <signal.h>
|
||
|
#include <ucontext.h>
|
||
|
|
||
|
static void sig_handler(int signal, siginfo_t *info, void *context) {
|
||
|
if (signal != SIGILL) return;
|
||
|
if (*(char*)info->si_addr != (char)0x9f) abort();
|
||
|
greg_t *regs = ((ucontext_t*)context)->uc_mcontext.gregs;
|
||
|
((char*)®s[REG_RAX])[1] = ((char*)®s[REG_EFL])[0];
|
||
|
regs[REG_RIP]++;
|
||
|
}
|
||
|
|
||
|
static struct sigaction old_sa, new_sa = {
|
||
|
.sa_flags = SA_SIGINFO,
|
||
|
.sa_sigaction = &sig_handler };
|
||
|
|
||
|
int _init() { sigaction(SIGILL, &new_sa, &old_sa); return 0; }
|
||
|
int _fini() { sigaction(SIGILL, &old_sa, &new_sa); return 0; }
|