Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb0b4aa8 authored by Laura Abbott's avatar Laura Abbott Committed by Boris Ostrovsky
Browse files

x86/xen: Remove use of VLAs

There's an ongoing effort to remove VLAs[1] from the kernel to eventually
turn on -Wvla. It turns out, the few VLAs in use in Xen produce only a
single entry array that is always bounded by GDT_SIZE. Clean up the code to
get rid of the VLA and the loop.

[1] https://lkml.org/lkml/2018/3/7/621



Signed-off-by: default avatarLaura Abbott <labbott@redhat.com>
Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>

[boris: Use BUG_ON(size>PAGE_SIZE) instead of GDT_SIZE]
Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
parent ebf04f33
Loading
Loading
Loading
Loading
+31 −55
Original line number Diff line number Diff line
@@ -421,24 +421,15 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
{
	unsigned long va = dtr->address;
	unsigned int size = dtr->size + 1;
	unsigned pages = DIV_ROUND_UP(size, PAGE_SIZE);
	unsigned long frames[pages];
	int f;

	/*
	 * A GDT can be up to 64k in size, which corresponds to 8192
	 * 8-byte entries, or 16 4k pages..
	 */

	BUG_ON(size > 65536);
	BUG_ON(va & ~PAGE_MASK);

	for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
	unsigned long pfn, mfn;
	int level;
	pte_t *ptep;
		unsigned long pfn, mfn;
	void *virt;

	/* @size should be at most GDT_SIZE which is smaller than PAGE_SIZE. */
	BUG_ON(size > PAGE_SIZE);
	BUG_ON(va & ~PAGE_MASK);

	/*
	 * The GDT is per-cpu and is in the percpu data area.
	 * That can be virtually mapped, so we need to do a
@@ -453,13 +444,10 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
	mfn = pfn_to_mfn(pfn);
	virt = __va(PFN_PHYS(pfn));

		frames[f] = mfn;

	make_lowmem_page_readonly((void *)va);
	make_lowmem_page_readonly(virt);
	}

	if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
	if (HYPERVISOR_set_gdt(&mfn, size / sizeof(struct desc_struct)))
		BUG();
}

@@ -470,22 +458,13 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
{
	unsigned long va = dtr->address;
	unsigned int size = dtr->size + 1;
	unsigned pages = DIV_ROUND_UP(size, PAGE_SIZE);
	unsigned long frames[pages];
	int f;

	/*
	 * A GDT can be up to 64k in size, which corresponds to 8192
	 * 8-byte entries, or 16 4k pages..
	 */
	unsigned long pfn, mfn;
	pte_t pte;

	BUG_ON(size > 65536);
	/* @size should be at most GDT_SIZE which is smaller than PAGE_SIZE. */
	BUG_ON(size > PAGE_SIZE);
	BUG_ON(va & ~PAGE_MASK);

	for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
		pte_t pte;
		unsigned long pfn, mfn;

	pfn = virt_to_pfn(va);
	mfn = pfn_to_mfn(pfn);

@@ -494,10 +473,7 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
	if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0))
		BUG();

		frames[f] = mfn;
	}

	if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
	if (HYPERVISOR_set_gdt(&mfn, size / sizeof(struct desc_struct)))
		BUG();
}