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

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

?? signal.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* *  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>#ifdef __ia64__#undef uc_mcontext#undef uc_sigmask#undef uc_stack#undef uc_link#endif#include <signal.h>#include "qemu.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 sigaltstack target_sigaltstack_used = {    0, 0, SA_DISABLE};static struct emulated_sigaction sigact_table[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 inline int host_to_target_signal(int sig){    return sig;}static inline int target_to_host_signal(int sig){    return sig;}/* siginfo conversion */void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info){}void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo){}void signal_init(void){    struct sigaction act;    int 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));    _exit(-host_sig);}/* 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;    target_ulong handler;#if defined(DEBUG_SIGNAL)    fprintf(stderr, "queue_signal: sig=%d\n",            sig);#endif    k = &sigact_table[sig - 1];    handler = (target_ulong)k->sa.sa_handler;    if (handler == SIG_DFL) {        /* default handler : ignore some signal. The other are fatal */        if (sig != SIGCHLD &&            sig != SIGURG &&            sig != SIGWINCH) {            force_sig(sig);        } else {            return 0; /* indicate ignored */        }    } else if (handler == host_to_target_signal(SIG_IGN)) {        /* ignore signal */        return 0;    } else if (handler == host_to_target_signal(SIG_ERR)) {        force_sig(sig);    } else {        pq = &k->first;        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, (void*)info, puc))            return;    }    /* get target signal number */    sig = host_to_target_signal(host_signum);    if (sig < 1 || sig > NSIG)        return;#if defined(DEBUG_SIGNAL)	fprintf(stderr, "qemu: got signal %d\n", sig);#endif    if (queue_signal(sig, &tinfo) == 1) {        /* interrupt the virtual CPU as soon as possible */        cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);    }}int do_sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss){    /* XXX: test errors */    if(oss)    {        oss->ss_sp = tswap32(target_sigaltstack_used.ss_sp);        oss->ss_size = tswap32(target_sigaltstack_used.ss_size);        oss->ss_flags = tswap32(target_sigaltstack_used.ss_flags);    }    if(ss)    {        target_sigaltstack_used.ss_sp = tswap32(ss->ss_sp);        target_sigaltstack_used.ss_size = tswap32(ss->ss_size);        target_sigaltstack_used.ss_flags = tswap32(ss->ss_flags);    }    return 0;}int do_sigaction(int sig, const struct sigaction *act,                 struct sigaction *oact){    struct emulated_sigaction *k;    struct sigaction act1;    int host_sig;    if (sig < 1 || sig > NSIG)        return -EINVAL;    k = &sigact_table[sig - 1];#if defined(DEBUG_SIGNAL)    fprintf(stderr, "sigaction 1 sig=%d act=0x%08x, oact=0x%08x\n",            sig, (int)act, (int)oact);#endif    if (oact) {#if defined(DEBUG_SIGNAL)    fprintf(stderr, "sigaction 1 sig=%d act=0x%08x, oact=0x%08x\n",            sig, (int)act, (int)oact);#endif        oact->sa_handler = tswapl(k->sa.sa_handler);        oact->sa_flags = tswapl(k->sa.sa_flags);        oact->sa_mask = tswapl(k->sa.sa_mask);    }    if (act) {#if defined(DEBUG_SIGNAL)    fprintf(stderr, "sigaction handler 0x%x flag 0x%x mask 0x%x\n",            act->sa_handler, act->sa_flags, act->sa_mask);#endif        k->sa.sa_handler = tswapl(act->sa_handler);        k->sa.sa_flags = tswapl(act->sa_flags);        k->sa.sa_mask = tswapl(act->sa_mask);        /* we update the host signal state */        host_sig = target_to_host_signal(sig);        if (host_sig != SIGSEGV && host_sig != SIGBUS) {#if defined(DEBUG_SIGNAL)    fprintf(stderr, "sigaction handler going to call sigaction\n",            act->sa_handler, act->sa_flags, act->sa_mask);#endif            sigfillset(&act1.sa_mask);            act1.sa_flags = SA_SIGINFO;            if (k->sa.sa_flags & SA_RESTART)                act1.sa_flags |= SA_RESTART;            /* NOTE: it is important to update the host kernel signal               ignore state to avoid getting unexpected interrupted               syscalls */            if (k->sa.sa_handler == SIG_IGN) {                act1.sa_sigaction = (void *)SIG_IGN;            } else if (k->sa.sa_handler == SIG_DFL) {                act1.sa_sigaction = (void *)SIG_DFL;            } else {                act1.sa_sigaction = host_signal_handler;            }            sigaction(host_sig, &act1, NULL);        }    }    return 0;}#ifdef TARGET_I386static inline void *get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size){    /* XXX Fix that */    if(target_sigaltstack_used.ss_flags & SA_DISABLE)    {        int esp;        /* Default to using normal stack */        esp = env->regs[R_ESP];        return (void *)((esp - frame_size) & -8ul);    }    else    {        return target_sigaltstack_used.ss_sp;    }}static void setup_frame(int sig, struct emulated_sigaction *ka,			void *set, CPUState *env){	void *frame;	int i, err = 0;    fprintf(stderr, "setup_frame %d\n", sig);	frame = get_sigframe(ka, env, sizeof(*frame));	/* Set up registers for signal handler */	env->regs[R_ESP] = (unsigned long) frame;	env->eip = (unsigned long) ka->sa.sa_handler;	env->eflags &= ~TF_MASK;	return;give_sigsegv:	if (sig == SIGSEGV)		ka->sa.sa_handler = SIG_DFL;	force_sig(SIGSEGV /* , current */);}long do_sigreturn(CPUState *env, int num){    int i = 0;    struct target_sigcontext *scp = get_int_arg(&i, env);    /* XXX Get current signal number */    /* XXX Adjust accordin to sc_onstack, sc_mask */    if(tswapl(scp->sc_onstack) & 0x1)        target_sigaltstack_used.ss_flags |= ~SA_DISABLE;    else        target_sigaltstack_used.ss_flags &=  SA_DISABLE;    int set = tswapl(scp->sc_eax);    sigprocmask(SIG_SETMASK, &set, NULL);    fprintf(stderr, "do_sigreturn: partially implemented %x EAX:%x EBX:%x\n", scp->sc_mask, tswapl(scp->sc_eax), tswapl(scp->sc_ebx));    fprintf(stderr, "ECX:%x EDX:%x EDI:%x\n", scp->sc_ecx, tswapl(scp->sc_edx), tswapl(scp->sc_edi));    fprintf(stderr, "EIP:%x\n", tswapl(scp->sc_eip));    env->regs[R_EAX] = tswapl(scp->sc_eax);    env->regs[R_EBX] = tswapl(scp->sc_ebx);    env->regs[R_ECX] = tswapl(scp->sc_ecx);    env->regs[R_EDX] = tswapl(scp->sc_edx);    env->regs[R_EDI] = tswapl(scp->sc_edi);    env->regs[R_ESI] = tswapl(scp->sc_esi);    env->regs[R_EBP] = tswapl(scp->sc_ebp);    env->regs[R_ESP] = tswapl(scp->sc_esp);    env->segs[R_SS].selector = (void*)tswapl(scp->sc_ss);    env->eflags = tswapl(scp->sc_eflags);    env->eip = tswapl(scp->sc_eip);    env->segs[R_CS].selector = (void*)tswapl(scp->sc_cs);    env->segs[R_DS].selector = (void*)tswapl(scp->sc_ds);    env->segs[R_ES].selector = (void*)tswapl(scp->sc_es);    env->segs[R_FS].selector = (void*)tswapl(scp->sc_fs);    env->segs[R_GS].selector = (void*)tswapl(scp->sc_gs);    /* Again, because our caller's caller will reset EAX */    return env->regs[R_EAX];}#elsestatic void setup_frame(int sig, struct emulated_sigaction *ka,			void *set, CPUState *env){    fprintf(stderr, "setup_frame: not implemented\n");}long do_sigreturn(CPUState *env, int num){    int i = 0;    struct target_sigcontext *scp = get_int_arg(&i, env);    fprintf(stderr, "do_sigreturn: not implemented\n");    return -ENOSYS;}#endifvoid process_pending_signals(void *cpu_env){    struct emulated_sigaction *k;    struct sigqueue *q;    target_ulong handler;    int sig;    if (!signal_pending)        return;    k = sigact_table;    for(sig = 1; sig <= NSIG; sig++) {        if (k->pending)            goto handle_signal;        k++;    }    /* if no signal is pending, just return */    signal_pending = 0;    return;handle_signal:    #ifdef DEBUG_SIGNAL    fprintf(stderr, "qemu: process signal %d\n", sig);    #endif    /* dequeue signal */    q = k->first;    k->first = q->next;    if (!k->first)        k->pending = 0;    sig = gdb_handlesig (cpu_env, sig);    if (!sig) {        fprintf (stderr, "Lost signal\n");        abort();    }    handler = k->sa.sa_handler;    if (handler == SIG_DFL) {        /* default handler : ignore some signal. The other are fatal */        if (sig != SIGCHLD &&            sig != SIGURG &&            sig != SIGWINCH) {            force_sig(sig);        }    } else if (handler == SIG_IGN) {        /* ignore sig */    } else if (handler == SIG_ERR) {        force_sig(sig);    } else {        setup_frame(sig, k, 0, cpu_env);	if (k->sa.sa_flags & SA_RESETHAND)            k->sa.sa_handler = SIG_DFL;    }    if (q != &k->info)        free_sigqueue(q);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人在线免费| 亚洲人成亚洲人成在线观看图片| 99国产一区二区三精品乱码| 国产精品中文字幕一区二区三区| 久久成人av少妇免费| 蜜臀91精品一区二区三区| 麻豆国产欧美一区二区三区| 三级久久三级久久| 秋霞午夜鲁丝一区二区老狼| 美女mm1313爽爽久久久蜜臀| 蜜芽一区二区三区| 国产一区二区日韩精品| 国产伦精品一区二区三区免费迷| 九一九一国产精品| 国产成a人亚洲精品| 白白色亚洲国产精品| 91在线观看一区二区| 色婷婷久久综合| 欧美丰满一区二区免费视频| 日韩视频免费直播| 国产亚洲一二三区| 亚洲精品伦理在线| 亚洲一区二区三区免费视频| 视频在线在亚洲| 国产精品一区二区在线观看不卡| 成人精品视频网站| 欧美日韩激情一区二区| 精品国产伦一区二区三区免费| 欧美激情一二三区| 美女看a上一区| 97久久久精品综合88久久| 欧美色图12p| 精品日韩欧美在线| 亚洲欧美日韩在线| 国内精品自线一区二区三区视频| 99视频精品在线| 日韩女优制服丝袜电影| 国产精品久久久久久久久久久免费看 | 国产精品综合网| 97超碰欧美中文字幕| 91精品欧美福利在线观看| 国产欧美日韩在线视频| 亚洲一区二区三区四区在线观看| 老司机免费视频一区二区三区| 成人精品一区二区三区四区 | 国产欧美久久久精品影院| 亚洲男人天堂一区| 国产一区二区剧情av在线| 色综合久久综合| 精品国产不卡一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 国产一区欧美二区| www国产精品av| 婷婷一区二区三区| 99re亚洲国产精品| 中文幕一区二区三区久久蜜桃| 蜜桃av噜噜一区二区三区小说| 色妞www精品视频| 国产欧美精品一区二区三区四区| 久热成人在线视频| 欧美丰满嫩嫩电影| 亚洲综合色自拍一区| av电影一区二区| 国产精品萝li| 国产成人精品亚洲午夜麻豆| 精品国产欧美一区二区| 免费成人av资源网| 91精品久久久久久蜜臀| 亚洲一区电影777| 欧美系列在线观看| 亚洲自拍偷拍图区| 在线视频你懂得一区| 亚洲三级小视频| 99麻豆久久久国产精品免费 | 亚洲一卡二卡三卡四卡| 99久久精品国产导航| 国产精品人妖ts系列视频| 福利一区福利二区| 中文字幕高清不卡| av电影天堂一区二区在线| 国产精品水嫩水嫩| bt欧美亚洲午夜电影天堂| 中文字幕av不卡| 99久久精品国产导航| 亚洲精品乱码久久久久久日本蜜臀| 97精品超碰一区二区三区| 国产精品久久福利| 色拍拍在线精品视频8848| 亚洲第一福利一区| 欧美人牲a欧美精品| 免费的成人av| 国产欧美日韩综合| 在线亚洲+欧美+日本专区| 午夜激情一区二区三区| 91精品国产麻豆国产自产在线 | 精品美女在线观看| 精品午夜久久福利影院| 2022国产精品视频| aaa亚洲精品| 日本不卡的三区四区五区| 欧美成人福利视频| 成人福利电影精品一区二区在线观看| 国产精品乱人伦中文| 在线观看av一区| 精品一二三四区| 日韩毛片高清在线播放| 制服丝袜成人动漫| 成人av免费在线观看| 亚洲国产精品久久久久婷婷884| 日韩精品一区二区三区视频播放 | 欧美精品日韩一本| 国产福利一区二区三区视频在线| 国产欧美日韩另类一区| 欧美吻胸吃奶大尺度电影| 极品少妇xxxx精品少妇| 亚洲欧美在线观看| 日韩视频一区二区三区| 99麻豆久久久国产精品免费| 日本不卡视频在线观看| 中文字幕日韩一区| 精品国产乱码久久久久久老虎| 北岛玲一区二区三区四区| 免费看日韩a级影片| 亚洲日本va午夜在线影院| 欧美精品高清视频| 91麻豆成人久久精品二区三区| 精品一区二区三区影院在线午夜| 国产精品成人一区二区三区夜夜夜| 欧美日韩电影在线| 97超碰欧美中文字幕| 国产精品一区二区免费不卡| 人人狠狠综合久久亚洲| 亚洲欧美日韩一区| 久久久久久免费| 日韩一区二区三区电影在线观看 | 欧美色综合久久| 99riav一区二区三区| 国产一区二区三区电影在线观看| 午夜精品一区二区三区免费视频| 亚洲三级电影网站| 国产精品高潮久久久久无| 久久久久亚洲蜜桃| 精品国产一区久久| 日韩精品一区二区三区中文精品| 91精品国产综合久久久蜜臀图片| 色综合久久久久综合| 91在线免费播放| 色综合久久天天综合网| av亚洲精华国产精华精| 成人国产精品免费观看动漫| 国产精品亚洲第一| 国产乱子伦视频一区二区三区| 黄色日韩三级电影| 国产综合色在线视频区| 国产剧情一区二区| 国产乱码一区二区三区| 国产一区二区免费视频| 精一区二区三区| 国产麻豆精品在线观看| 国产精品一二三区在线| 国产一区激情在线| 国产成人av网站| av电影在线观看完整版一区二区| 一本色道久久综合精品竹菊| 91美女精品福利| 欧美性受xxxx黑人xyx性爽| 欧美日韩亚洲综合| 日韩一卡二卡三卡国产欧美| 精品久久久网站| 国产精品色噜噜| 亚洲午夜羞羞片| 久久成人18免费观看| 国产91综合网| 色就色 综合激情| 欧美日韩一区二区三区四区五区| 在线不卡一区二区| 久久久精品黄色| 亚洲最新视频在线观看| 日本中文字幕一区| 成人小视频在线| 欧美午夜在线一二页| 精品国产免费一区二区三区香蕉| 日本一区二区综合亚洲| 亚洲综合色丁香婷婷六月图片| 日本成人在线看| 不卡一区在线观看| 在线成人小视频| 最新国产の精品合集bt伙计| 亚洲国产精品嫩草影院| 国产精品一二三四| 欧美亚洲另类激情小说| 欧美成人精精品一区二区频| 中文字幕亚洲一区二区av在线| 日韩制服丝袜先锋影音| 粉嫩蜜臀av国产精品网站| 欧美特级限制片免费在线观看| 精品对白一区国产伦| 一区二区高清视频在线观看| 国产乱码精品一区二区三区av | 岛国精品一区二区|