亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? signal.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* *  Emulation of Linux signals * *  Copyright (c) 2003 Fabrice Bellard * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdarg.h>#include <unistd.h>#include <signal.h>#include <errno.h>#include <sys/ucontext.h>#include "qemu.h"#include "target_signal.h"//#define DEBUG_SIGNAL#define MAX_SIGQUEUE_SIZE 1024struct sigqueue {    struct sigqueue *next;    target_siginfo_t info;};struct emulated_sigaction {    struct target_sigaction sa;    int pending; /* true if signal is pending */    struct sigqueue *first;    struct sigqueue info; /* in order to always have memory for the                             first signal, we put it here */};struct target_sigaltstack target_sigaltstack_used = {    .ss_sp = 0,    .ss_size = 0,    .ss_flags = TARGET_SS_DISABLE,};static struct emulated_sigaction sigact_table[TARGET_NSIG];static struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */static struct sigqueue *first_free; /* first free siginfo queue entry */static int signal_pending; /* non zero if a signal may be pending */static void host_signal_handler(int host_signum, siginfo_t *info,                                void *puc);static uint8_t host_to_target_signal_table[65] = {    [SIGHUP] = TARGET_SIGHUP,    [SIGINT] = TARGET_SIGINT,    [SIGQUIT] = TARGET_SIGQUIT,    [SIGILL] = TARGET_SIGILL,    [SIGTRAP] = TARGET_SIGTRAP,    [SIGABRT] = TARGET_SIGABRT,/*    [SIGIOT] = TARGET_SIGIOT,*/    [SIGBUS] = TARGET_SIGBUS,    [SIGFPE] = TARGET_SIGFPE,    [SIGKILL] = TARGET_SIGKILL,    [SIGUSR1] = TARGET_SIGUSR1,    [SIGSEGV] = TARGET_SIGSEGV,    [SIGUSR2] = TARGET_SIGUSR2,    [SIGPIPE] = TARGET_SIGPIPE,    [SIGALRM] = TARGET_SIGALRM,    [SIGTERM] = TARGET_SIGTERM,#ifdef SIGSTKFLT    [SIGSTKFLT] = TARGET_SIGSTKFLT,#endif    [SIGCHLD] = TARGET_SIGCHLD,    [SIGCONT] = TARGET_SIGCONT,    [SIGSTOP] = TARGET_SIGSTOP,    [SIGTSTP] = TARGET_SIGTSTP,    [SIGTTIN] = TARGET_SIGTTIN,    [SIGTTOU] = TARGET_SIGTTOU,    [SIGURG] = TARGET_SIGURG,    [SIGXCPU] = TARGET_SIGXCPU,    [SIGXFSZ] = TARGET_SIGXFSZ,    [SIGVTALRM] = TARGET_SIGVTALRM,    [SIGPROF] = TARGET_SIGPROF,    [SIGWINCH] = TARGET_SIGWINCH,    [SIGIO] = TARGET_SIGIO,    [SIGPWR] = TARGET_SIGPWR,    [SIGSYS] = TARGET_SIGSYS,    /* next signals stay the same */};static uint8_t target_to_host_signal_table[65];static inline int on_sig_stack(unsigned long sp){    return (sp - target_sigaltstack_used.ss_sp            < target_sigaltstack_used.ss_size);}static inline int sas_ss_flags(unsigned long sp){    return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE            : on_sig_stack(sp) ? SS_ONSTACK : 0);}static inline int host_to_target_signal(int sig){    return host_to_target_signal_table[sig];}static inline int target_to_host_signal(int sig){    return target_to_host_signal_table[sig];}static void host_to_target_sigset_internal(target_sigset_t *d,                                           const sigset_t *s){    int i;    unsigned long sigmask;    uint32_t target_sigmask;    sigmask = ((unsigned long *)s)[0];    target_sigmask = 0;    for(i = 0; i < 32; i++) {        if (sigmask & (1 << i))            target_sigmask |= 1 << (host_to_target_signal(i + 1) - 1);    }#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32    d->sig[0] = target_sigmask;    for(i = 1;i < TARGET_NSIG_WORDS; i++) {        d->sig[i] = ((unsigned long *)s)[i];    }#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2    d->sig[0] = target_sigmask;    d->sig[1] = sigmask >> 32;#else    /* XXX: do it */#endif}void host_to_target_sigset(target_sigset_t *d, const sigset_t *s){    target_sigset_t d1;    int i;    host_to_target_sigset_internal(&d1, s);    for(i = 0;i < TARGET_NSIG_WORDS; i++)        d->sig[i] = tswapl(d1.sig[i]);}void target_to_host_sigset_internal(sigset_t *d, const target_sigset_t *s){    int i;    unsigned long sigmask;    abi_ulong target_sigmask;    target_sigmask = s->sig[0];    sigmask = 0;    for(i = 0; i < 32; i++) {        if (target_sigmask & (1 << i))            sigmask |= 1 << (target_to_host_signal(i + 1) - 1);    }#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32    ((unsigned long *)d)[0] = sigmask;    for(i = 1;i < TARGET_NSIG_WORDS; i++) {        ((unsigned long *)d)[i] = s->sig[i];    }#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2    ((unsigned long *)d)[0] = sigmask | ((unsigned long)(s->sig[1]) << 32);#else    /* XXX: do it */#endif /* TARGET_ABI_BITS */}void target_to_host_sigset(sigset_t *d, const target_sigset_t *s){    target_sigset_t s1;    int i;    for(i = 0;i < TARGET_NSIG_WORDS; i++)        s1.sig[i] = tswapl(s->sig[i]);    target_to_host_sigset_internal(d, &s1);}void host_to_target_old_sigset(abi_ulong *old_sigset,                               const sigset_t *sigset){    target_sigset_t d;    host_to_target_sigset(&d, sigset);    *old_sigset = d.sig[0];}void target_to_host_old_sigset(sigset_t *sigset,                               const abi_ulong *old_sigset){    target_sigset_t d;    int i;    d.sig[0] = *old_sigset;    for(i = 1;i < TARGET_NSIG_WORDS; i++)        d.sig[i] = 0;    target_to_host_sigset(sigset, &d);}/* siginfo conversion */static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,                                                 const siginfo_t *info){    int sig;    sig = host_to_target_signal(info->si_signo);    tinfo->si_signo = sig;    tinfo->si_errno = 0;    tinfo->si_code = 0;    if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||        sig == SIGBUS || sig == SIGTRAP) {        /* should never come here, but who knows. The information for           the target is irrelevant */        tinfo->_sifields._sigfault._addr = 0;    } else if (sig == SIGIO) {	tinfo->_sifields._sigpoll._fd = info->si_fd;    } else if (sig >= TARGET_SIGRTMIN) {        tinfo->_sifields._rt._pid = info->si_pid;        tinfo->_sifields._rt._uid = info->si_uid;        /* XXX: potential problem if 64 bit */        tinfo->_sifields._rt._sigval.sival_ptr =            (abi_ulong)(unsigned long)info->si_value.sival_ptr;    }}static void tswap_siginfo(target_siginfo_t *tinfo,                          const target_siginfo_t *info){    int sig;    sig = info->si_signo;    tinfo->si_signo = tswap32(sig);    tinfo->si_errno = tswap32(info->si_errno);    tinfo->si_code = tswap32(info->si_code);    if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||        sig == SIGBUS || sig == SIGTRAP) {        tinfo->_sifields._sigfault._addr =            tswapl(info->_sifields._sigfault._addr);    } else if (sig == SIGIO) {	tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd);    } else if (sig >= TARGET_SIGRTMIN) {        tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid);        tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid);        tinfo->_sifields._rt._sigval.sival_ptr =            tswapl(info->_sifields._rt._sigval.sival_ptr);    }}void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info){    host_to_target_siginfo_noswap(tinfo, info);    tswap_siginfo(tinfo, tinfo);}/* XXX: we support only POSIX RT signals are used. *//* XXX: find a solution for 64 bit (additional malloced data is needed) */void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo){    info->si_signo = tswap32(tinfo->si_signo);    info->si_errno = tswap32(tinfo->si_errno);    info->si_code = tswap32(tinfo->si_code);    info->si_pid = tswap32(tinfo->_sifields._rt._pid);    info->si_uid = tswap32(tinfo->_sifields._rt._uid);    info->si_value.sival_ptr =            (void *)(long)tswapl(tinfo->_sifields._rt._sigval.sival_ptr);}void signal_init(void){    struct sigaction act;    int i, j;    /* generate signal conversion tables */    for(i = 1; i <= 64; i++) {        if (host_to_target_signal_table[i] == 0)            host_to_target_signal_table[i] = i;    }    for(i = 1; i <= 64; i++) {        j = host_to_target_signal_table[i];        target_to_host_signal_table[j] = i;    }    /* set all host signal handlers. ALL signals are blocked during       the handlers to serialize them. */    sigfillset(&act.sa_mask);    act.sa_flags = SA_SIGINFO;    act.sa_sigaction = host_signal_handler;    for(i = 1; i < NSIG; i++) {        sigaction(i, &act, NULL);    }    memset(sigact_table, 0, sizeof(sigact_table));    first_free = &sigqueue_table[0];    for(i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++)        sigqueue_table[i].next = &sigqueue_table[i + 1];    sigqueue_table[MAX_SIGQUEUE_SIZE - 1].next = NULL;}/* signal queue handling */static inline struct sigqueue *alloc_sigqueue(void){    struct sigqueue *q = first_free;    if (!q)        return NULL;    first_free = q->next;    return q;}static inline void free_sigqueue(struct sigqueue *q){    q->next = first_free;    first_free = q;}/* abort execution with signal */void __attribute((noreturn)) force_sig(int sig){    int host_sig;    host_sig = target_to_host_signal(sig);    fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n",            sig, strsignal(host_sig));#if 1    _exit(-host_sig);#else    {        struct sigaction act;        sigemptyset(&act.sa_mask);        act.sa_flags = SA_SIGINFO;        act.sa_sigaction = SIG_DFL;        sigaction(SIGABRT, &act, NULL);        abort();    }#endif}/* queue a signal so that it will be send to the virtual CPU as soon   as possible */int queue_signal(int sig, target_siginfo_t *info){    struct emulated_sigaction *k;    struct sigqueue *q, **pq;    abi_ulong handler;#if defined(DEBUG_SIGNAL)    fprintf(stderr, "queue_signal: sig=%d\n",            sig);#endif    k = &sigact_table[sig - 1];    handler = k->sa._sa_handler;    if (handler == TARGET_SIG_DFL) {        /* default handler : ignore some signal. The other are fatal */        if (sig != TARGET_SIGCHLD &&            sig != TARGET_SIGURG &&            sig != TARGET_SIGWINCH) {            force_sig(sig);        } else {            return 0; /* indicate ignored */        }    } else if (handler == TARGET_SIG_IGN) {        /* ignore signal */        return 0;    } else if (handler == TARGET_SIG_ERR) {        force_sig(sig);    } else {        pq = &k->first;        if (sig < TARGET_SIGRTMIN) {            /* if non real time signal, we queue exactly one signal */            if (!k->pending)                q = &k->info;            else                return 0;        } else {            if (!k->pending) {                /* first signal */                q = &k->info;            } else {                q = alloc_sigqueue();                if (!q)                    return -EAGAIN;                while (*pq != NULL)                    pq = &(*pq)->next;            }        }        *pq = q;        q->info = *info;        q->next = NULL;        k->pending = 1;        /* signal that a new signal is pending */        signal_pending = 1;        return 1; /* indicates that the signal was queued */    }}static void host_signal_handler(int host_signum, siginfo_t *info,                                void *puc){    int sig;    target_siginfo_t tinfo;    /* the CPU emulator uses some host signals to detect exceptions,       we we forward to it some signals */    if (host_signum == SIGSEGV || host_signum == SIGBUS) {        if (cpu_signal_handler(host_signum, info, puc))            return;    }    /* get target signal number */    sig = host_to_target_signal(host_signum);    if (sig < 1 || sig > TARGET_NSIG)        return;#if defined(DEBUG_SIGNAL)    fprintf(stderr, "qemu: got signal %d\n", sig);#endif    host_to_target_siginfo_noswap(&tinfo, info);    if (queue_signal(sig, &tinfo) == 1) {        /* interrupt the virtual CPU as soon as possible */        cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);    }}/* do_sigaltstack() returns target values and errnos. *//* compare linux/kernel/signal.c:do_sigaltstack() */abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp){    int ret;    struct target_sigaltstack oss;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级电影网站| 欧美日韩精品免费| 免费欧美高清视频| 国产精品免费av| 日韩欧美国产午夜精品| 色呦呦国产精品| 国产成人av资源| 久久精品国产亚洲aⅴ| 亚洲男帅同性gay1069| 久久色视频免费观看| 欧美日韩情趣电影| 91免费看视频| 国产suv精品一区二区6| 日韩电影在线观看电影| 亚洲精品乱码久久久久久黑人| 欧美va天堂va视频va在线| 欧美色视频在线观看| 国产不卡一区视频| 久草精品在线观看| 天天影视涩香欲综合网 | 欧美成人欧美edvon| 在线免费观看视频一区| 国产.欧美.日韩| 国产一区美女在线| 久久精品国产77777蜜臀| 一区二区三区日本| 中文字幕综合网| 国产精品夫妻自拍| 国产精品美女久久久久aⅴ| 精品成人在线观看| 欧美成人精品高清在线播放| 制服丝袜亚洲色图| 欧美另类videos死尸| 在线看不卡av| 日本乱人伦一区| 色嗨嗨av一区二区三区| 91色九色蝌蚪| 色综合视频一区二区三区高清| 波多野结衣视频一区| 成人少妇影院yyyy| 成人动漫中文字幕| www.亚洲精品| 色综合久久中文综合久久97| 色8久久精品久久久久久蜜| 色一情一伦一子一伦一区| 日本丶国产丶欧美色综合| 色综合久久天天综合网| 欧洲一区二区三区在线| 在线观看欧美黄色| 欧美日韩在线一区二区| 欧美日高清视频| 日韩一卡二卡三卡四卡| 欧美不卡一区二区三区四区| 精品盗摄一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 国产偷v国产偷v亚洲高清| 中国av一区二区三区| 亚洲色欲色欲www在线观看| 亚洲国产精品久久艾草纯爱| 丝袜脚交一区二区| 久草这里只有精品视频| 成人国产精品免费| 色噜噜狠狠成人中文综合| 欧美精品久久99久久在免费线| 日韩一区二区免费电影| 久久一二三国产| 综合久久国产九一剧情麻豆| 亚洲电影视频在线| 精品一区二区免费| youjizz久久| 欧美精品乱人伦久久久久久| 26uuu久久综合| 最好看的中文字幕久久| 日本少妇一区二区| 国产91丝袜在线播放| 在线观看av一区| 亚洲精品一区二区三区蜜桃下载| 国产精品你懂的在线欣赏| 亚洲最新视频在线观看| 久久99精品一区二区三区三区| 成人av网站在线| 在线播放一区二区三区| 亚洲国产精品ⅴa在线观看| 亚洲午夜免费电影| 国产一区激情在线| 欧美日韩亚洲丝袜制服| 国产欧美一区二区精品秋霞影院| 一区二区在线观看av| 韩国三级在线一区| 欧美亚洲一区二区三区四区| 欧美va亚洲va香蕉在线 | 极品销魂美女一区二区三区| a级精品国产片在线观看| 337p亚洲精品色噜噜狠狠| 国产无人区一区二区三区| 亚洲.国产.中文慕字在线| 国产成人综合精品三级| 欧美精品日日鲁夜夜添| 成人免费在线视频| 国产主播一区二区| 欧美日韩中文精品| 自拍av一区二区三区| 激情文学综合插| 在线电影欧美成精品| 亚洲乱码国产乱码精品精可以看| 国产一区 二区 三区一级| 在线不卡一区二区| 一区二区三区在线观看欧美| 成人高清视频免费观看| 精品国精品国产| 日韩在线观看一区二区| 欧美午夜精品久久久久久孕妇| 欧美激情一区二区三区不卡| 另类小说色综合网站| 欧美丰满一区二区免费视频| 洋洋av久久久久久久一区| av成人免费在线| 日本一区二区三级电影在线观看| 免费观看一级欧美片| 欧美情侣在线播放| 亚洲午夜羞羞片| 在线看日韩精品电影| 亚洲人成在线观看一区二区| 粉嫩一区二区三区性色av| 欧美白人最猛性xxxxx69交| 午夜电影网亚洲视频| 欧美日韩日日摸| 亚洲电影一级黄| 欧美猛男超大videosgay| 亚洲福利视频导航| 欧美日本视频在线| 天天色图综合网| 欧美精品一二三| 日本不卡在线视频| 欧美一区二区精品久久911| 亚洲国产精品自拍| 欧美日韩国产区一| 日韩av电影免费观看高清完整版| 精品视频免费看| 婷婷夜色潮精品综合在线| 91精品国产综合久久久久久| 日本成人在线电影网| 日韩欧美成人一区| 狠狠色狠狠色综合系列| 国产欧美日产一区| 成人av网址在线观看| 综合久久一区二区三区| 欧美在线播放高清精品| 午夜精品久久久久久| 欧美高清精品3d| 经典三级一区二区| 国产精品美女久久久久av爽李琼| 99热99精品| 性久久久久久久| 欧美一区二区三区在线观看 | 久久综合网色—综合色88| 国产成人丝袜美腿| 中文字幕在线观看不卡| 在线观看亚洲精品| 三级在线观看一区二区| 欧美α欧美αv大片| 成人免费看视频| 亚洲一区二区影院| 日韩精品一区在线观看| 成人小视频免费在线观看| 亚洲激情中文1区| 欧美精品在线一区二区三区| 国产一区欧美日韩| 自拍偷拍国产精品| 日韩一区二区免费在线电影| 国产a级毛片一区| 亚洲欧美国产毛片在线| 欧美疯狂做受xxxx富婆| 国产成人精品三级| 亚洲国产精品天堂| 久久亚洲影视婷婷| 一本色道久久加勒比精品| 日韩精品电影一区亚洲| 欧美激情中文不卡| 在线不卡一区二区| gogogo免费视频观看亚洲一| 亚洲大片在线观看| 国产天堂亚洲国产碰碰| 欧美性生活影院| 粗大黑人巨茎大战欧美成人| 丝袜美腿亚洲综合| 中文字幕视频一区| 日韩欧美国产高清| 在线中文字幕不卡| 国产麻豆视频一区| 日韩精品电影在线观看| 亚洲人午夜精品天堂一二香蕉| 精品久久人人做人人爱| 欧美三级乱人伦电影| 9久草视频在线视频精品| 精品亚洲成av人在线观看| 亚洲一区二区在线播放相泽| 国产精品剧情在线亚洲| 精品成人在线观看| 制服丝袜中文字幕一区|