* [Qemu-devel] [PATCH] linux-user/mmap.c: Support shared memory mapping in mmap_frag() @ 2015-12-30 1:11 chengang 2015-12-30 1:35 ` Chen Gang 0 siblings, 1 reply; 3+ messages in thread From: chengang @ 2015-12-30 1:11 UTC (permalink / raw) To: riku.voipio, laurent; +Cc: peter.maydell, Chen Gang, Chen Gang, qemu-devel, rth From: Chen Gang <chengang@emindsoft.com.cn> It is a temporary fix for i386 target system running Windows. Also remove useless variable 'p'. Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com> --- linux-user/mmap.c | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 445e8c6..07758d4 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -156,12 +156,28 @@ static int mmap_frag(abi_ulong real_start, prot1 |= page_get_flags(addr); } + /* + * It is a temporary fix. Normally, target system will let shared memory + * aligned with 64KB, and allocate them near with each other, no any other + * kinds of mapping regions nearby. e.g. Windows on i386. + */ + if ((start == real_start) && (flags & MAP_SHARED)) { + if (prot1) { + munmap(host_start, qemu_host_page_size); + } + if (mmap(host_start, qemu_host_page_size, prot, flags, fd, offset) + == MAP_FAILED) { + return -1; + } + return 0; + } + if (prot1 == 0) { /* no page was there, so we allocate one */ - void *p = mmap(host_start, qemu_host_page_size, prot, - flags | MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED) + if (mmap(host_start, qemu_host_page_size, prot, flags | MAP_ANONYMOUS, + -1, 0) == MAP_FAILED) { return -1; + } prot1 = prot; } prot1 &= PAGE_BITS; -- 1.7.3.4 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user/mmap.c: Support shared memory mapping in mmap_frag() 2015-12-30 1:11 [Qemu-devel] [PATCH] linux-user/mmap.c: Support shared memory mapping in mmap_frag() chengang @ 2015-12-30 1:35 ` Chen Gang 2015-12-31 8:02 ` Chen Gang 0 siblings, 1 reply; 3+ messages in thread From: Chen Gang @ 2015-12-30 1:35 UTC (permalink / raw) To: riku.voipio, laurent; +Cc: peter.maydell, Chen Gang, qemu-devel, rth Hello all: This patch is only for a discussion, I guess this patch is valuable for i386 wine running Windows. Theoretically, this patch is incorrect, we have to implement softmmu to support different host and target pages (e.g. host 8KB, target 4KB): - If host 8KB is mapped as PRIVATE | FIXED, and runs a while (trigger copy on write). - Then map its low 4KB as SHARED | FIXED. - It has to fail. So this patch is only a temporary fix: - It looks Windows maps shared memory with 64KB alignments (at least, at present, it is true). - OS will manage the process address area: let most shared memory area nearby. - After this patch, we can run Windows Notepad.exe and ACDSee5.0 setup program successfully. Next, I will run wine with the true windows system dlls for a test (e.g. windows own kernel32.dll). I guess, we can use a switch macro or a new input parameter to enable or disable the related code (if they are really valuable enough for some using cases). Thanks. On 2015年12月30日 09:11, chengang@emindsoft.com.cn wrote: > From: Chen Gang <chengang@emindsoft.com.cn> > > It is a temporary fix for i386 target system running Windows. > > Also remove useless variable 'p'. > > Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com> > --- > linux-user/mmap.c | 22 +++++++++++++++++++--- > 1 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/linux-user/mmap.c b/linux-user/mmap.c > index 445e8c6..07758d4 100644 > --- a/linux-user/mmap.c > +++ b/linux-user/mmap.c > @@ -156,12 +156,28 @@ static int mmap_frag(abi_ulong real_start, > prot1 |= page_get_flags(addr); > } > > + /* > + * It is a temporary fix. Normally, target system will let shared memory > + * aligned with 64KB, and allocate them near with each other, no any other > + * kinds of mapping regions nearby. e.g. Windows on i386. > + */ > + if ((start == real_start) && (flags & MAP_SHARED)) { > + if (prot1) { > + munmap(host_start, qemu_host_page_size); > + } > + if (mmap(host_start, qemu_host_page_size, prot, flags, fd, offset) > + == MAP_FAILED) { > + return -1; > + } > + return 0; > + } > + > if (prot1 == 0) { > /* no page was there, so we allocate one */ > - void *p = mmap(host_start, qemu_host_page_size, prot, > - flags | MAP_ANONYMOUS, -1, 0); > - if (p == MAP_FAILED) > + if (mmap(host_start, qemu_host_page_size, prot, flags | MAP_ANONYMOUS, > + -1, 0) == MAP_FAILED) { > return -1; > + } > prot1 = prot; > } > prot1 &= PAGE_BITS; > -- Chen Gang (陈刚) Open, share, and attitude like air, water, and life which God blessed ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] linux-user/mmap.c: Support shared memory mapping in mmap_frag() 2015-12-30 1:35 ` Chen Gang @ 2015-12-31 8:02 ` Chen Gang 0 siblings, 0 replies; 3+ messages in thread From: Chen Gang @ 2015-12-31 8:02 UTC (permalink / raw) To: riku.voipio, laurent; +Cc: peter.maydell, Chen Gang, qemu-devel, rth Oh, sorry, please skip this patch (or discussion), I have send a new fix patch for the related issue, so let the old ACDSee.exe and the latest WinRAR.exe setup programs run successfully under real WinXP system dlls. The related root cause is not related with shared memory, so at least now, we can skip this patch (or discussion). Thanks. On 2015年12月30日 09:35, Chen Gang wrote: > Hello all: > > This patch is only for a discussion, I guess this patch is valuable for > i386 wine running Windows. > > Theoretically, this patch is incorrect, we have to implement softmmu to > support different host and target pages (e.g. host 8KB, target 4KB): > > - If host 8KB is mapped as PRIVATE | FIXED, and runs a while (trigger > copy on write). > > - Then map its low 4KB as SHARED | FIXED. > > - It has to fail. > > So this patch is only a temporary fix: > > - It looks Windows maps shared memory with 64KB alignments (at least, > at present, it is true). > > - OS will manage the process address area: let most shared memory area > nearby. > > - After this patch, we can run Windows Notepad.exe and ACDSee5.0 setup > program successfully. Next, I will run wine with the true windows > system dlls for a test (e.g. windows own kernel32.dll). > > I guess, we can use a switch macro or a new input parameter to enable or > disable the related code (if they are really valuable enough for some > using cases). > > Thanks. > > On 2015年12月30日 09:11, chengang@emindsoft.com.cn wrote: >> From: Chen Gang <chengang@emindsoft.com.cn> >> >> It is a temporary fix for i386 target system running Windows. >> >> Also remove useless variable 'p'. >> >> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com> >> --- >> linux-user/mmap.c | 22 +++++++++++++++++++--- >> 1 files changed, 19 insertions(+), 3 deletions(-) >> >> diff --git a/linux-user/mmap.c b/linux-user/mmap.c >> index 445e8c6..07758d4 100644 >> --- a/linux-user/mmap.c >> +++ b/linux-user/mmap.c >> @@ -156,12 +156,28 @@ static int mmap_frag(abi_ulong real_start, >> prot1 |= page_get_flags(addr); >> } >> >> + /* >> + * It is a temporary fix. Normally, target system will let shared memory >> + * aligned with 64KB, and allocate them near with each other, no any other >> + * kinds of mapping regions nearby. e.g. Windows on i386. >> + */ >> + if ((start == real_start) && (flags & MAP_SHARED)) { >> + if (prot1) { >> + munmap(host_start, qemu_host_page_size); >> + } >> + if (mmap(host_start, qemu_host_page_size, prot, flags, fd, offset) >> + == MAP_FAILED) { >> + return -1; >> + } >> + return 0; >> + } >> + >> if (prot1 == 0) { >> /* no page was there, so we allocate one */ >> - void *p = mmap(host_start, qemu_host_page_size, prot, >> - flags | MAP_ANONYMOUS, -1, 0); >> - if (p == MAP_FAILED) >> + if (mmap(host_start, qemu_host_page_size, prot, flags | MAP_ANONYMOUS, >> + -1, 0) == MAP_FAILED) { >> return -1; >> + } >> prot1 = prot; >> } >> prot1 &= PAGE_BITS; >> > -- Chen Gang (陈刚) Open, share, and attitude like air, water, and life which God blessed ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-12-31 8:02 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-12-30 1:11 [Qemu-devel] [PATCH] linux-user/mmap.c: Support shared memory mapping in mmap_frag() chengang 2015-12-30 1:35 ` Chen Gang 2015-12-31 8:02 ` Chen Gang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).