亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲国产日韩一区二区| 奇米亚洲午夜久久精品| 欧美在线免费播放| 美女视频免费一区| 依依成人精品视频| 精品1区2区在线观看| 99精品欧美一区| 久久99精品一区二区三区三区| 国产精品久久久久久久久久久免费看 | 国产一区二区三区在线观看免费 | 亚洲韩国一区二区三区| 国产日产欧美一区| 欧美一二三区在线| 欧美性视频一区二区三区| 高清久久久久久| 美国三级日本三级久久99| 亚洲国产欧美另类丝袜| 亚洲色图一区二区| 国产精品美女久久久久久2018| 日韩一区二区三区精品视频| 色综合久久中文综合久久97| 从欧美一区二区三区| 精品影视av免费| 性做久久久久久| 亚洲国产日产av| 亚洲精品视频一区| 《视频一区视频二区| 国产欧美一区二区三区在线老狼| 精品国产露脸精彩对白| 日韩一区二区中文字幕| 日韩欧美高清一区| 中文字幕精品一区| 久久九九国产精品| 久久综合久色欧美综合狠狠| 日韩一级片在线播放| 欧美一级欧美三级| 日韩一区二区影院| 日韩一区二区不卡| 26uuu精品一区二区在线观看| 日韩一区二区三区观看| 欧美电视剧在线观看完整版| 欧美一级久久久久久久大片| 日韩一区二区在线看片| 欧美大胆人体bbbb| 久久综合给合久久狠狠狠97色69| 欧美精品一区二区三区高清aⅴ | 亚洲图片欧美一区| 日韩国产欧美视频| 蜜臀精品久久久久久蜜臀| 蜜臀久久99精品久久久久宅男| 美女视频一区在线观看| 国产另类ts人妖一区二区| 国产成人免费在线观看| 99热精品一区二区| 欧美午夜片在线观看| 欧美精品乱码久久久久久| 91精品国产综合久久久蜜臀粉嫩 | 欧美视频在线观看一区二区| 69p69国产精品| 精品国产伦一区二区三区免费 | 日韩一区二区电影| 国产色产综合产在线视频| 国产精品第13页| 亚洲伊人色欲综合网| 另类综合日韩欧美亚洲| 懂色av一区二区夜夜嗨| 日本电影亚洲天堂一区| 51精品视频一区二区三区| 久久先锋资源网| 丝袜美腿高跟呻吟高潮一区| 亚洲最大的成人av| 视频一区视频二区中文| 蜜臀精品久久久久久蜜臀| 黑人巨大精品欧美一区| 高清国产午夜精品久久久久久| 粉嫩欧美一区二区三区高清影视| 99精品偷自拍| 欧美丰满少妇xxxbbb| 欧美不卡在线视频| 国产精品不卡一区二区三区| 亚洲成人三级小说| 国产成人精品亚洲日本在线桃色 | 精品国产乱码久久久久久闺蜜| 久久久久久久免费视频了| 亚洲一区二区三区四区不卡| 久久国产免费看| 不卡一区二区在线| 91免费看`日韩一区二区| 成人高清视频免费观看| 成人av在线影院| 欧美性xxxxxx少妇| 亚洲一区在线视频| 久久嫩草精品久久久久| 色婷婷激情久久| 日韩电影在线一区二区三区| 成人免费毛片嘿嘿连载视频| 欧美日本视频在线| 亚洲欧美日韩人成在线播放| 国产毛片精品国产一区二区三区| 欧美色成人综合| 最新日韩在线视频| 国产精品亚洲专一区二区三区 | 欧美激情艳妇裸体舞| 日韩在线一区二区| 色妹子一区二区| 国产欧美精品在线观看| 久久精品久久99精品久久| 在线免费亚洲电影| 中文字幕制服丝袜一区二区三区| 美女一区二区三区| 欧美情侣在线播放| 一区二区三区自拍| fc2成人免费人成在线观看播放| 欧美成人精品1314www| 婷婷久久综合九色国产成人 | 国产盗摄视频一区二区三区| 欧美一区二区三区视频免费| 亚洲综合一区二区精品导航| 成人在线视频一区二区| 久久综合狠狠综合久久激情 | 国产日韩精品视频一区| 日韩av电影一区| 欧美日韩国产在线观看| 一区二区三区在线高清| 91在线国产福利| 国产精品成人免费在线| 成人丝袜高跟foot| 亚洲国产精品v| 成人一区二区在线观看| 久久久国产精华| 国产一区二区女| 国产亚洲一区二区三区在线观看| 黑人巨大精品欧美黑白配亚洲| 日韩一级高清毛片| 午夜精品久久久久久久久久久| 在线观看av一区| 亚洲一区二区三区爽爽爽爽爽| 99久久精品国产一区二区三区| 国产精品五月天| 99久久夜色精品国产网站| 亚洲欧洲成人自拍| 色综合久久久久网| 亚洲一区免费视频| 欧美久久久久久蜜桃| 免费精品99久久国产综合精品| 日韩视频免费观看高清在线视频| 久久不见久久见中文字幕免费| 日韩精品一区二区三区中文精品| 久久精品999| 久久久久88色偷偷免费 | 日韩午夜小视频| 激情久久五月天| 国产三级久久久| 色综合久久六月婷婷中文字幕| 亚洲国产另类精品专区| 欧美一区二区三区精品| 国产一区二区三区精品欧美日韩一区二区三区 | 国产真实精品久久二三区| 无码av免费一区二区三区试看 | 69堂国产成人免费视频| www.亚洲在线| 福利电影一区二区三区| 国产老肥熟一区二区三区| 蜜桃精品视频在线| 手机精品视频在线观看| 亚洲自拍欧美精品| 亚洲免费在线视频一区 二区| 欧美韩日一区二区三区| 国产人妖乱国产精品人妖| 亚洲欧美国产高清| 日本午夜精品视频在线观看| 粉嫩av一区二区三区| 一本一本大道香蕉久在线精品 | 久久久精品2019中文字幕之3| 日本一区二区三级电影在线观看 | 蜜臀av一区二区在线免费观看| wwwwww.欧美系列| 色综合久久综合网| 免费成人小视频| 亚洲欧洲成人av每日更新| 欧美一区二区国产| 成人性视频免费网站| 亚洲一区免费在线观看| 久久久一区二区三区捆绑**| 欧美亚洲国产bt| 国产精品影视网| 亚洲国产日产av| 国产精品久久久久aaaa樱花| 91精品啪在线观看国产60岁| www.成人网.com| 经典一区二区三区| 亚洲高清视频中文字幕| 国产欧美一区二区三区网站| 欧美人动与zoxxxx乱| 成人app在线观看| 久久精品国产99国产精品| 亚洲一二三级电影| 国产精品萝li| 2欧美一区二区三区在线观看视频| 欧美三级视频在线播放|