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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mmap.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號(hào):
/* *  mmap support for qemu * *  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 <stdarg.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <sys/mman.h>#include "qemu.h"//#define DEBUG_MMAP/* NOTE: all the constants are the HOST ones */int target_mprotect(unsigned long start, unsigned long len, int prot){    unsigned long end, host_start, host_end, addr;    int prot1, ret;#ifdef DEBUG_MMAP    printf("mprotect: start=0x%lx len=0x%lx prot=%c%c%c\n", start, len,           prot & PROT_READ ? 'r' : '-',           prot & PROT_WRITE ? 'w' : '-',           prot & PROT_EXEC ? 'x' : '-');#endif    if ((start & ~TARGET_PAGE_MASK) != 0)        return -EINVAL;    len = TARGET_PAGE_ALIGN(len);    end = start + len;    if (end < start)        return -EINVAL;    if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))        return -EINVAL;    if (len == 0)        return 0;    host_start = start & qemu_host_page_mask;    host_end = HOST_PAGE_ALIGN(end);    if (start > host_start) {        /* handle host page containing start */        prot1 = prot;        for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) {            prot1 |= page_get_flags(addr);        }        if (host_end == host_start + qemu_host_page_size) {            for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {                prot1 |= page_get_flags(addr);            }            end = host_end;        }        ret = mprotect((void *)host_start, qemu_host_page_size, prot1 & PAGE_BITS);        if (ret != 0)            return ret;        host_start += qemu_host_page_size;    }    if (end < host_end) {        prot1 = prot;        for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {            prot1 |= page_get_flags(addr);        }        ret = mprotect((void *)(host_end - qemu_host_page_size), qemu_host_page_size,                       prot1 & PAGE_BITS);        if (ret != 0)            return ret;        host_end -= qemu_host_page_size;    }    /* handle the pages in the middle */    if (host_start < host_end) {        ret = mprotect((void *)host_start, host_end - host_start, prot);        if (ret != 0)            return ret;    }    page_set_flags(start, start + len, prot | PAGE_VALID);    return 0;}/* map an incomplete host page */int mmap_frag(unsigned long host_start,               unsigned long start, unsigned long end,               int prot, int flags, int fd, unsigned long offset){    unsigned long host_end, ret, addr;    int prot1, prot_new;    host_end = host_start + qemu_host_page_size;    /* get the protection of the target pages outside the mapping */    prot1 = 0;    for(addr = host_start; addr < host_end; addr++) {        if (addr < start || addr >= end)            prot1 |= page_get_flags(addr);    }    if (prot1 == 0) {        /* no page was there, so we allocate one */        ret = (long)mmap((void *)host_start, qemu_host_page_size, prot,                         flags | MAP_ANONYMOUS, -1, 0);        if (ret == -1)            return ret;    }    prot1 &= PAGE_BITS;    prot_new = prot | prot1;    if (!(flags & MAP_ANONYMOUS)) {        /* msync() won't work here, so we return an error if write is           possible while it is a shared mapping */#ifndef __APPLE__        if ((flags & MAP_TYPE) == MAP_SHARED &&#else        if ((flags &  MAP_SHARED) &&#endif            (prot & PROT_WRITE))            return -EINVAL;        /* adjust protection to be able to read */        if (!(prot1 & PROT_WRITE))            mprotect((void *)host_start, qemu_host_page_size, prot1 | PROT_WRITE);        /* read the corresponding file data */        pread(fd, (void *)start, end - start, offset);        /* put final protection */        if (prot_new != (prot1 | PROT_WRITE))            mprotect((void *)host_start, qemu_host_page_size, prot_new);    } else {        /* just update the protection */        if (prot_new != prot1) {            mprotect((void *)host_start, qemu_host_page_size, prot_new);        }    }    return 0;}/* NOTE: all the constants are the HOST ones */long target_mmap(unsigned long start, unsigned long len, int prot,                 int flags, int fd, unsigned long offset){    unsigned long ret, end, host_start, host_end, retaddr, host_offset, host_len;#if defined(__alpha__) || defined(__sparc__) || defined(__x86_64__)    static unsigned long last_start = 0x40000000;#endif#ifdef DEBUG_MMAP    {        printf("mmap: start=0x%lx len=0x%lx prot=%c%c%c flags=",               start, len,               prot & PROT_READ ? 'r' : '-',               prot & PROT_WRITE ? 'w' : '-',               prot & PROT_EXEC ? 'x' : '-');        if (flags & MAP_FIXED)            printf("MAP_FIXED ");        if (flags & MAP_ANONYMOUS)            printf("MAP_ANON ");#ifndef MAP_TYPE# define MAP_TYPE 0x3#endif        switch(flags & MAP_TYPE) {        case MAP_PRIVATE:            printf("MAP_PRIVATE ");            break;        case MAP_SHARED:            printf("MAP_SHARED ");            break;        default:            printf("[MAP_TYPE=0x%x] ", flags & MAP_TYPE);            break;        }        printf("fd=%d offset=%lx\n", fd, offset);    }#endif    if (offset & ~TARGET_PAGE_MASK)        return -EINVAL;    len = TARGET_PAGE_ALIGN(len);    if (len == 0)        return start;    host_start = start & qemu_host_page_mask;    if (!(flags & MAP_FIXED)) {#if defined(__alpha__) || defined(__sparc__) || defined(__x86_64__)        /* tell the kernel to search at the same place as i386 */        if (host_start == 0) {            host_start = last_start;            last_start += HOST_PAGE_ALIGN(len);        }#endif        if (qemu_host_page_size != qemu_real_host_page_size) {            /* NOTE: this code is only for debugging with '-p' option */            /* reserve a memory area */            host_len = HOST_PAGE_ALIGN(len) + qemu_host_page_size - TARGET_PAGE_SIZE;            host_start = (long)mmap((void *)host_start, host_len, PROT_NONE,                                    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);            if (host_start == -1)                return host_start;            host_end = host_start + host_len;            start = HOST_PAGE_ALIGN(host_start);            end = start + HOST_PAGE_ALIGN(len);            if (start > host_start)                munmap((void *)host_start, start - host_start);            if (end < host_end)                munmap((void *)end, host_end - end);            /* use it as a fixed mapping */            flags |= MAP_FIXED;        } else {            /* if not fixed, no need to do anything */            host_offset = offset & qemu_host_page_mask;            host_len = len + offset - host_offset;            start = (long)mmap((void *)host_start, host_len,                               prot, flags, fd, host_offset);            if (start == -1)                return start;            /* update start so that it points to the file position at 'offset' */            if (!(flags & MAP_ANONYMOUS))                start += offset - host_offset;            goto the_end1;        }    }    if (start & ~TARGET_PAGE_MASK)        return -EINVAL;    end = start + len;    host_end = HOST_PAGE_ALIGN(end);    /* worst case: we cannot map the file because the offset is not       aligned, so we read it */    if (!(flags & MAP_ANONYMOUS) &&        (offset & ~qemu_host_page_mask) != (start & ~qemu_host_page_mask)) {        /* msync() won't work here, so we return an error if write is           possible while it is a shared mapping */#ifndef __APPLE__        if ((flags & MAP_TYPE) == MAP_SHARED &&#else        if ((flags & MAP_SHARED) &&#endif            (prot & PROT_WRITE))            return -EINVAL;        retaddr = target_mmap(start, len, prot | PROT_WRITE,                              MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,                              -1, 0);        if (retaddr == -1)            return retaddr;        pread(fd, (void *)start, len, offset);        if (!(prot & PROT_WRITE)) {            ret = target_mprotect(start, len, prot);            if (ret != 0)                return ret;        }        goto the_end;    }    /* handle the start of the mapping */    if (start > host_start) {        if (host_end == host_start + qemu_host_page_size) {            /* one single host page */            ret = mmap_frag(host_start, start, end,                            prot, flags, fd, offset);            if (ret == -1)                return ret;            goto the_end1;        }        ret = mmap_frag(host_start, start, host_start + qemu_host_page_size,                        prot, flags, fd, offset);        if (ret == -1)            return ret;        host_start += qemu_host_page_size;    }    /* handle the end of the mapping */    if (end < host_end) {        ret = mmap_frag(host_end - qemu_host_page_size,                        host_end - qemu_host_page_size, host_end,                        prot, flags, fd,                        offset + host_end - qemu_host_page_size - start);        if (ret == -1)            return ret;        host_end -= qemu_host_page_size;    }    /* map the middle (easier) */    if (host_start < host_end) {        unsigned long offset1;	if (flags & MAP_ANONYMOUS)	  offset1 = 0;	else	  offset1 = offset + host_start - start;        ret = (long)mmap((void *)host_start, host_end - host_start,                         prot, flags, fd, offset1);        if (ret == -1)            return ret;    } the_end1:    page_set_flags(start, start + len, prot | PAGE_VALID); the_end:#ifdef DEBUG_MMAP    printf("target_mmap: ret=0x%lx\n", (long)start);    page_dump(stdout);    printf("\n");#endif    return start;}int target_munmap(unsigned long start, unsigned long len){    unsigned long end, host_start, host_end, addr;    int prot, ret;#ifdef DEBUG_MMAP    printf("munmap: start=0x%lx len=0x%lx\n", start, len);#endif    if (start & ~TARGET_PAGE_MASK)        return -EINVAL;    len = TARGET_PAGE_ALIGN(len);    if (len == 0)        return -EINVAL;    end = start + len;    host_start = start & qemu_host_page_mask;    host_end = HOST_PAGE_ALIGN(end);    if (start > host_start) {        /* handle host page containing start */        prot = 0;        for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) {            prot |= page_get_flags(addr);        }        if (host_end == host_start + qemu_host_page_size) {            for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {                prot |= page_get_flags(addr);            }            end = host_end;        }        if (prot != 0)            host_start += qemu_host_page_size;    }    if (end < host_end) {        prot = 0;        for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {            prot |= page_get_flags(addr);        }        if (prot != 0)            host_end -= qemu_host_page_size;    }    /* unmap what we can */    if (host_start < host_end) {        ret = munmap((void *)host_start, host_end - host_start);        if (ret != 0)            return ret;    }    page_set_flags(start, start + len, 0);    return 0;}/* XXX: currently, we only handle MAP_ANONYMOUS and not MAP_FIXED   blocks which have been allocated starting on a host page */long target_mremap(unsigned long old_addr, unsigned long old_size,                   unsigned long new_size, unsigned long flags,                   unsigned long new_addr){#ifndef __APPLE__    /* XXX: use 5 args syscall */    new_addr = (long)mremap((void *)old_addr, old_size, new_size, flags);    if (new_addr == -1)        return new_addr;    prot = page_get_flags(old_addr);    page_set_flags(old_addr, old_addr + old_size, 0);    page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID);    return new_addr;#else    qerror("target_mremap: unsupported\n");#endif}int target_msync(unsigned long start, unsigned long len, int flags){    unsigned long end;    if (start & ~TARGET_PAGE_MASK)        return -EINVAL;    len = TARGET_PAGE_ALIGN(len);    end = start + len;    if (end < start)        return -EINVAL;    if (end == start)        return 0;    start &= qemu_host_page_mask;    return msync((void *)start, end - start, flags);}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国一区二区| 欧美高清性hdvideosex| 亚洲国产成人精品视频| 精品国产免费人成电影在线观看四季| 国产白丝精品91爽爽久久| 午夜精品一区二区三区免费视频 | 欧美在线不卡一区| 日韩av中文在线观看| 国产精品入口麻豆九色| 日韩一区二区三区三四区视频在线观看| 一区二区三区精品在线| 久久精品亚洲精品国产欧美| 国产婷婷色一区二区三区| 久久国产精品色| 欧美一区二区久久| 99精品久久只有精品| 久久精品噜噜噜成人av农村| 亚洲夂夂婷婷色拍ww47| 国产精品盗摄一区二区三区| 亚洲精品一区二区三区蜜桃下载| 在线视频亚洲一区| 成人97人人超碰人人99| 国产露脸91国语对白| 欧美aaaaa成人免费观看视频| 一区二区三区在线视频免费| 国产精品毛片无遮挡高清| 亚洲精品在线网站| 日韩精品一区二区在线观看| 欧美一区二区三区免费在线看| 日本黄色一区二区| 色视频成人在线观看免| 99久久亚洲一区二区三区青草| 国产剧情一区在线| 久久国产精品色婷婷| 美女mm1313爽爽久久久蜜臀| 奇米色777欧美一区二区| 午夜精品爽啪视频| 亚洲国产精品自拍| 一区二区三区自拍| 亚洲一区在线电影| 亚洲激情一二三区| 亚洲自拍欧美精品| 亚洲午夜精品17c| 色婷婷av久久久久久久| gogo大胆日本视频一区| av电影在线观看不卡| 白白色亚洲国产精品| 99久久久久免费精品国产 | 精品国产电影一区二区| 日韩免费电影一区| 日韩欧美一区中文| 久久久久久亚洲综合| 久久久久久影视| 日本一区二区免费在线| 国产日产欧产精品推荐色| 国产精品丝袜91| 成人欧美一区二区三区视频网页| 一色屋精品亚洲香蕉网站| 亚洲日本一区二区三区| 亚洲国产视频a| 日本aⅴ亚洲精品中文乱码| 久久99热国产| 成人激情免费网站| 色综合久久久久网| 日韩亚洲电影在线| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲国产电影在线观看| 中文字幕视频一区二区三区久| 国产精品日韩精品欧美在线| 亚洲精品一二三四区| 亚洲国产精品久久人人爱蜜臀| 日本特黄久久久高潮| 国产剧情一区二区三区| 色婷婷av一区二区三区软件| 欧美丰满少妇xxxbbb| 久久蜜臀中文字幕| 亚洲人成电影网站色mp4| 亚洲成av人片| 国产乱子伦一区二区三区国色天香 | 亚洲天堂网中文字| 午夜精品一区二区三区电影天堂 | 一区二区三区四区激情| 免费亚洲电影在线| 成人深夜在线观看| 欧美三级蜜桃2在线观看| 亚洲精品一区二区三区四区高清| 亚洲三级电影网站| 另类专区欧美蜜桃臀第一页| 99久免费精品视频在线观看 | 日本黄色一区二区| 久久久综合精品| 亚洲综合久久av| 欧美一三区三区四区免费在线看 | 中文字幕不卡的av| 婷婷丁香激情综合| 懂色av噜噜一区二区三区av| 欧美日韩成人一区二区| 中文字幕一区视频| 精品一区二区久久久| 在线免费观看日韩欧美| 久久久99精品久久| 亚洲777理论| 波多野结衣中文字幕一区| 日韩视频一区二区在线观看| 自拍偷拍国产精品| 国产黄色精品网站| 欧美一级爆毛片| 亚洲一区二区三区中文字幕 | 正在播放亚洲一区| 日韩理论片一区二区| 国产一区二区三区香蕉| 欧美精品久久天天躁| 亚洲免费色视频| 高清不卡一区二区在线| 日韩视频不卡中文| 亚洲一区免费视频| 色噜噜狠狠色综合中国| 亚洲国产精品99久久久久久久久| 久久精品av麻豆的观看方式| 欧美日韩精品一区视频| 亚洲男人天堂av网| 91在线高清观看| 中文字幕精品综合| 国产精品一区二区在线观看网站| 777欧美精品| 午夜视频一区二区三区| 欧美午夜精品久久久久久孕妇 | 日韩欧美国产精品一区| 午夜精品一区二区三区免费视频 | 国产成人啪免费观看软件 | 亚洲已满18点击进入久久| 成人免费看视频| 国产日韩精品视频一区| 国产福利不卡视频| 久久久精品2019中文字幕之3| 久久精品免费观看| 精品国产一二三| 精一区二区三区| 日韩免费一区二区三区在线播放| 日韩va欧美va亚洲va久久| 在线不卡免费欧美| 日韩高清在线不卡| 欧美成人艳星乳罩| 精品一区二区三区视频| 欧美va亚洲va| 国产综合色在线视频区| 久久精品一区二区三区不卡| 国产乱对白刺激视频不卡| 亚洲国产精品高清| 99久久伊人久久99| 亚洲柠檬福利资源导航| 欧美日韩综合在线| 日本视频中文字幕一区二区三区| 日韩三级精品电影久久久| 蜜臀av亚洲一区中文字幕| 精品sm在线观看| 国产69精品久久久久777| 国产欧美综合色| 972aa.com艺术欧美| 亚洲一区二区三区国产| 制服丝袜亚洲色图| 国产美女精品人人做人人爽| 中文字幕中文字幕一区| 91激情五月电影| 琪琪一区二区三区| 国产三级精品三级在线专区| av激情成人网| 丝袜美腿亚洲色图| 久久久久国产精品人| 99久久99久久综合| 偷拍亚洲欧洲综合| 久久久久国产成人精品亚洲午夜| 国产精品18久久久久久久久久久久 | 国产麻豆视频一区| 亚洲欧美偷拍另类a∨色屁股| 欧美男同性恋视频网站| 国产一区二区三区| 亚洲精品免费视频| 日韩免费高清av| 91日韩在线专区| 午夜精品一区二区三区电影天堂 | 成人午夜激情在线| 亚洲国产一区在线观看| 久久综合久久综合九色| 91网址在线看| 久久精品理论片| 亚洲三级理论片| 欧美www视频| 99久久久久免费精品国产 | 久久久久久综合| 欧美婷婷六月丁香综合色| 国产一区日韩二区欧美三区| 亚洲三级在线观看| 日韩欧美不卡一区| 91免费看片在线观看| 国产一区二区视频在线播放| 午夜成人免费电影| 国产精品热久久久久夜色精品三区| 91麻豆精品国产91久久久使用方法| 不卡一区二区在线|