|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 03/16] arm: poison initmem when it is freed.
On Mon, Sep 19, 2016 at 11:35:57AM +0200, Julien Grall wrote:
> Hi Konrad,
>
> On 16/09/2016 18:38, Konrad Rzeszutek Wilk wrote:
> > The current byte sequence is '0xcc' which makes sense on x86,
> > but on ARM it is:
> >
> > cccccccc stclgt 12, cr12, [ip], {204} ; 0xcc
> >
> > Picking something more ARM applicable such as:
> >
> > efefefef svc 0x00efefef
> >
> > Creates a nice crash if one executes that code:
> > (XEN) CPU1: Unexpected Trap: Supervisor Call
> >
> > But unfortunatly that may not be a good choice either as in the future
>
> s/unfortunatly/unfortunately/
>
> > we may want to implement support for it.
> >
> > Julien suggested that we use a 4-byte insn instruction instead
> > of trying to work with one byte.
> >
> > As such on ARM 32 we use the udf instruction (see A8.8.247
> > in ARM DDI 0406C.c) and on ARM 64 use the AARCH64_BREAK_FAULT
> > instruction (aka brk instruction).
> >
> > We don't have to worry about Thumb code so this instruction
> > is a safe to execute.
> >
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> > ---
> > Cc: Julien Grall <julien.grall@xxxxxxx>
> > Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> >
> > v3: New submission
> > v4: Instead of using 0xef, use specific insn for architectures.
> > ---
> > xen/arch/arm/mm.c | 17 ++++++++++++++++-
> > 1 file changed, 16 insertions(+), 1 deletion(-)
> >
> > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> > index 07e2037..438bed7 100644
> > --- a/xen/arch/arm/mm.c
> > +++ b/xen/arch/arm/mm.c
> > @@ -994,8 +994,23 @@ void free_init_memory(void)
> > {
> > paddr_t pa = virt_to_maddr(__init_begin);
> > unsigned long len = __init_end - __init_begin;
> > + uint32_t insn;
> > + unsigned int i, nr = len / sizeof(insn);
> > +
> > set_pte_flags_on_range(__init_begin, len, mg_rw);
> > - memset(__init_begin, 0xcc, len);
> > +#ifdef CONFIG_ARM_32
> > + /* udf instruction i.e (see A8.8.247 in ARM DDI 0406C.c) */
> > + insn = 0xe7f000f0;
> > +#else
> > + insn = AARCH64_BREAK_FAULT;
> > +#endif
> > + for ( i = 0; i < nr; i++ )
> > + *(__init_begin + i) = insn;
>
> __init_begin is char[], so you will only copy the first byte of the
> instruction.
>
> And because of nr = len / sizeof(insn) only 1/4 of the initmem will be
> poisoned.
>
> So this should be something like:
>
> uint32_t *p = (uint32_t *)__init_begin;
> for ( i = 0; i < nr; i++)
> *(p + i) = insn;
>
Yes of course!
> > +
> > + nr = len % sizeof(insn);
> > + if ( nr )
> > + memset(__init_begin + len - nr, 0xcc, nr);
>
> I am wondering if we should instead align __init_end to 4-byte. With a
> BUILD_BUG_ON in the code to check this assumption.
The __init_end is already aligned:
175 . = ALIGN(STACK_SIZE);
176 __init_end = .;
So we are good there, but I do like the BUILD_BUG_ON. Let me do that.
>
> Any opinions?
>
> > +
> > set_pte_flags_on_range(__init_begin, len, mg_clear);
> > init_domheap_pages(pa, pa + len);
> > printk("Freed %ldkB init memory.\n",
> > (long)(__init_end-__init_begin)>>10);
> >
>
> Regards,
>
> --
> Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |