From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49990) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TG2Q2-0005AZ-3M for qemu-devel@nongnu.org; Mon, 24 Sep 2012 02:45:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TG2Q0-00026E-C8 for qemu-devel@nongnu.org; Mon, 24 Sep 2012 02:45:26 -0400 Received: from [222.73.24.84] (port=19051 helo=song.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TG2Pz-00023f-K9 for qemu-devel@nongnu.org; Mon, 24 Sep 2012 02:45:24 -0400 Message-ID: <506002D4.4050604@cn.fujitsu.com> Date: Mon, 24 Sep 2012 14:51:00 +0800 From: Wen Congyang MIME-Version: 1.0 References: <1348226255-4226-1-git-send-email-vasilis.liaskovitis@profitbricks.com> <1348226255-4226-20-git-send-email-vasilis.liaskovitis@profitbricks.com> In-Reply-To: <1348226255-4226-20-git-send-email-vasilis.liaskovitis@profitbricks.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [RFC PATCH v3 19/19][SeaBIOS] Calculate pcimem_start and pcimem64_start from SRAT entries List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vasilis Liaskovitis Cc: gleb@redhat.com, kvm@vger.kernel.org, seabios@seabios.org, qemu-devel@nongnu.org, blauwirbel@gmail.com, kevin@koconnor.net, avi@redhat.com, anthony@codemonkey.ws, imammedo@redhat.com, eblake@redhat.com, kraxel@redhat.com At 09/21/2012 07:17 PM, Vasilis Liaskovitis Wrote: > pcimem=5Fstart and pcimem64=5Fstart are adjusted from srat entries. For t= his reason, > paravirt info (NUMA SRAT entries and number of cpus) need to be read befo= re pci=5Fsetup. > Imho, this is an ugly code change since SRAT bios tables and number of > cpus have to be read earlier. But the advantage is that no new paravirt i= nterface > is introduced. Suggestions to make the code change cleaner are welcome. >=20 > The alternative patch (will be sent as a reply to this patch) implements a > paravirt interface to read the starting values of pcimem=5Fstart and > pcimem64=5Fstart from QEMU. >=20 > Signed-off-by: Vasilis Liaskovitis > --- > src/acpi.c | 82 ++++++++++++++++++++++++++++++++++++++++-----------= ----- > src/acpi.h | 3 ++ > src/pciinit.c | 6 +++- > src/post.c | 3 ++ > src/smp.c | 4 +++ > 5 files changed, 72 insertions(+), 26 deletions(-) >=20 > diff --git a/src/acpi.c b/src/acpi.c > index 1223b52..9e99aa7 100644 > --- a/src/acpi.c > +++ b/src/acpi.c > @@ -428,7 +428,10 @@ encodeLen(u8 *ssdt=5Fptr, int length, int bytes) > #define MEM=5FOFFSET=5FEND 63 > #define MEM=5FOFFSET=5FSIZE 79 > =20 > -u64 nb=5Fhp=5Fmemslots =3D 0; > +u64 nb=5Fhp=5Fmemslots =3D 0, nb=5Fnumanodes; > +u64 *numa=5Fdata, *hp=5Fmemdata; > +u64 below=5F4g=5Fhp=5Fmem=5Fsize =3D 0; > +u64 above=5F4g=5Fhp=5Fmem=5Fsize =3D 0; > struct srat=5Fmemory=5Faffinity *mem; > =20 > #define SSDT=5FSIGNATURE 0x54445353 // SSDT > @@ -763,17 +766,7 @@ acpi=5Fbuild=5Fsrat=5Fmemory(struct srat=5Fmemory=5F= affinity *numamem, > static void * > build=5Fsrat(void) > { > - int nb=5Fnuma=5Fnodes =3D qemu=5Fcfg=5Fget=5Fnuma=5Fnodes(); > - > - u64 *numadata =3D malloc=5Ftmphigh(sizeof(u64) * (MaxCountCPUs + nb= =5Fnuma=5Fnodes)); > - if (!numadata) { > - warn=5Fnoalloc(); > - return NULL; > - } > - > - qemu=5Fcfg=5Fget=5Fnuma=5Fdata(numadata, MaxCountCPUs + nb=5Fnuma=5F= nodes); > - > - qemu=5Fcfg=5Fget=5Fnuma=5Fdata(&nb=5Fhp=5Fmemslots, 1); > + int nb=5Fnuma=5Fnodes =3D nb=5Fnumanodes; > struct system=5Fresource=5Faffinity=5Ftable *srat; > int srat=5Fsize =3D sizeof(*srat) + > sizeof(struct srat=5Fprocessor=5Faffinity) * MaxCountCPUs + > @@ -782,7 +775,7 @@ build=5Fsrat(void) > srat =3D malloc=5Fhigh(srat=5Fsize); > if (!srat) { > warn=5Fnoalloc(); > - free(numadata); > + free(numa=5Fdata); > return NULL; > } > =20 > @@ -791,6 +784,7 @@ build=5Fsrat(void) > struct srat=5Fprocessor=5Faffinity *core =3D (void*)(srat + 1); > int i; > u64 curnode; > + u64 *numadata =3D numa=5Fdata; > =20 > for (i =3D 0; i < MaxCountCPUs; ++i) { > core->type =3D SRAT=5FPROCESSOR; > @@ -847,15 +841,7 @@ build=5Fsrat(void) > mem =3D (void*)numamem; > =20 > if (nb=5Fhp=5Fmemslots) { > - u64 *hpmemdata =3D malloc=5Ftmphigh(sizeof(u64) * (3 * nb=5Fhp= =5Fmemslots)); > - if (!hpmemdata) { > - warn=5Fnoalloc(); > - free(hpmemdata); > - free(numadata); > - return NULL; > - } > - > - qemu=5Fcfg=5Fget=5Fnuma=5Fdata(hpmemdata, 3 * nb=5Fhp=5Fmemslots= ); > + u64 *hpmemdata =3D hp=5Fmemdata; > =20 > for (i =3D 1; i < nb=5Fhp=5Fmemslots + 1; ++i) { > mem=5Fbase =3D *hpmemdata++; > @@ -865,7 +851,7 @@ build=5Fsrat(void) > numamem++; > slots++; > } > - free(hpmemdata); > + free(hp=5Fmemdata); > } > =20 > for (; slots < nb=5Fnuma=5Fnodes + nb=5Fhp=5Fmemslots + 2; slots++) { > @@ -875,10 +861,58 @@ build=5Fsrat(void) > =20 > build=5Fheader((void*)srat, SRAT=5FSIGNATURE, srat=5Fsize, 1); > =20 > - free(numadata); > + free(numa=5Fdata); > return srat; > } > =20 > +/* QEMU paravirt SRAT entries need to be read in before pci initilizatio= n */ > +void read=5Fsrat=5Fearly(void) > +{ > + int i; > + > + nb=5Fnumanodes =3D qemu=5Fcfg=5Fget=5Fnuma=5Fnodes(); > + u64 *hpmemdata; > + u64 mem=5Flen, mem=5Fbase; > + > + numa=5Fdata =3D malloc=5Ftmphigh(sizeof(u64) * (MaxCountCPUs + nb=5F= numanodes)); > + if (!numa=5Fdata) { > + warn=5Fnoalloc(); > + } > + > + qemu=5Fcfg=5Fget=5Fnuma=5Fdata(numa=5Fdata, MaxCountCPUs + nb=5Fnuma= nodes); > + qemu=5Fcfg=5Fget=5Fnuma=5Fdata(&nb=5Fhp=5Fmemslots, 1); > + > + if (nb=5Fhp=5Fmemslots) { > + hp=5Fmemdata =3D malloc=5Ftmphigh(sizeof(u64) * (3 * nb=5Fhp=5Fm= emslots)); > + if (!hp=5Fmemdata) { > + warn=5Fnoalloc(); > + free(hp=5Fmemdata); > + free(numa=5Fdata); > + } > + > + qemu=5Fcfg=5Fget=5Fnuma=5Fdata(hp=5Fmemdata, 3 * nb=5Fhp=5Fmemsl= ots); > + hpmemdata =3D hp=5Fmemdata; > + > + for (i =3D 1; i < nb=5Fhp=5Fmemslots + 1; ++i) { > + mem=5Fbase =3D *hpmemdata++; > + mem=5Flen =3D *hpmemdata++; > + hpmemdata++; > + if (mem=5Fbase >=3D 0x100000000LL) { > + above=5F4g=5Fhp=5Fmem=5Fsize +=3D mem=5Flen; > + } > + /* if dimm fits before pci hole, append it normally */ > + else if (mem=5Fbase + mem=5Flen <=3D BUILD=5FPCIMEM=5FSTART)= { > + below=5F4g=5Fhp=5Fmem=5Fsize +=3D mem=5Flen; > + } > + /* otherwise place it above 4GB */ > + else { > + above=5F4g=5Fhp=5Fmem=5Fsize +=3D mem=5Flen; > + } > + } > + > + } > +} > + > static const struct pci=5Fdevice=5Fid acpi=5Ffind=5Ftbl[] =3D { > /* PIIX4 Power Management device. */ > PCI=5FDEVICE(PCI=5FVENDOR=5FID=5FINTEL, PCI=5FDEVICE=5FID=5FINTEL=5F= 82371AB=5F3, NULL), > diff --git a/src/acpi.h b/src/acpi.h > index cb21561..d29837f 100644 > --- a/src/acpi.h > +++ b/src/acpi.h > @@ -5,6 +5,9 @@ > =20 > void acpi=5Fbios=5Finit(void); > u32 find=5Fresume=5Fvector(void); > +void read=5Fsrat=5Fearly(void); > +extern u64 below=5F4g=5Fhp=5Fmem=5Fsize; > +extern u64 above=5F4g=5Fhp=5Fmem=5Fsize; > =20 > #define RSDP=5FSIGNATURE 0x2052545020445352LL // "RSD PTR " > =20 > diff --git a/src/pciinit.c b/src/pciinit.c > index 31115ee..c5a4b24 100644 > --- a/src/pciinit.c > +++ b/src/pciinit.c > @@ -12,6 +12,7 @@ > #include "ioport.h" // PORT=5FATA1=5FCMD=5FBASE > #include "config.h" // CONFIG=5F* > #include "xen.h" // usingXen > +#include "acpi.h" > =20 > #define PCI=5FDEVICE=5FMEM=5FMIN 0x1000 > #define PCI=5FBRIDGE=5FIO=5FMIN 0x1000 > @@ -597,7 +598,7 @@ static void pci=5Fregion=5Fmap=5Fentries(struct pci= =5Fbus *busses, struct pci=5Fregion *r) > =20 > static void pci=5Fbios=5Fmap=5Fdevices(struct pci=5Fbus *busses) > { > - pcimem=5Fstart =3D RamSize; > + pcimem=5Fstart =3D RamSize + below=5F4g=5Fhp=5Fmem=5Fsize; > =20 > if (pci=5Fbios=5Finit=5Froot=5Fregions(busses)) { > struct pci=5Fregion r64=5Fmem, r64=5Fpref; > @@ -616,7 +617,8 @@ static void pci=5Fbios=5Fmap=5Fdevices(struct pci=5Fb= us *busses) > u64 align=5Fmem =3D pci=5Fregion=5Falign(&r64=5Fmem); > u64 align=5Fpref =3D pci=5Fregion=5Falign(&r64=5Fpref); > =20 > - r64=5Fmem.base =3D ALIGN(0x100000000LL + RamSizeOver4G, align=5F= mem); > + r64=5Fmem.base =3D ALIGN(0x100000000LL + RamSizeOver4G + > + above=5F4g=5Fhp=5Fmem=5Fsize, align=5Fmem); > r64=5Fpref.base =3D ALIGN(r64=5Fmem.base + sum=5Fmem, align=5Fpr= ef); > pcimem64=5Fstart =3D r64=5Fmem.base; > pcimem64=5Fend =3D r64=5Fpref.base + sum=5Fpref; > diff --git a/src/post.c b/src/post.c > index 924b311..c37730b 100644 > --- a/src/post.c > +++ b/src/post.c > @@ -234,6 +234,9 @@ maininit(void) > // Initialize mtrr > mtrr=5Fsetup(); > =20 > + smp=5Fget=5Fncpus(); > + read=5Fsrat=5Fearly(); > + > // Initialize pci > pci=5Fsetup(); > smm=5Finit(); > diff --git a/src/smp.c b/src/smp.c > index 4975412..3922776 100644 > --- a/src/smp.c > +++ b/src/smp.c > @@ -138,7 +138,11 @@ smp=5Fprobe(void) > =20 > // Restore memory. > *(u64*)BUILD=5FAP=5FBOOT=5FADDR =3D old; > +} > =20 > +void > +smp=5Fget=5Fncpus(void) You don't declare this function, and use it in another file. It will break building: src/post.c: In function =91maininit=92: src/post.c:237: warning: implicit declaration of function =91smp=5Fget=5Fnc= pus=92 src/smp.c:144: note: previous definition of =91smp=5Fget=5Fncpus=92 was here src/post.c:237: error: incompatible implicit declaration of function =91smp= =5Fget=5Fncpus=92 src/smp.c:144: note: previous definition of =91smp=5Fget=5Fncpus=92 was here Thanks Wen Congyang > +{ > MaxCountCPUs =3D qemu=5Fcfg=5Fget=5Fmax=5Fcpus(); > if (!MaxCountCPUs || MaxCountCPUs < CountCPUs) > MaxCountCPUs =3D CountCPUs; =