[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] xen/arm32: Introduce alternative runtime patching
Hi Julien, On 2017/3/24 18:48, Julien Grall wrote: > On 03/17/2017 06:35 AM, Wei Chen wrote: >> Hi Julien, > > Hi Wei, > > Sorry for the late answer, I missed that e-mail. > >> On 2017/3/17 6:24, Julien Grall wrote: >>> On 03/16/2017 09:53 AM, Wei Chen wrote: > > [...] > >>>> +/* >>>> + * Decode the branch offset from a branch instruction's imm field. >>>> + * The branch offset is a signed value, so it can be used to compute >>>> + * a new branch target. >>>> + */ >>>> +int32_t aarch32_get_branch_offset(uint32_t insn) >>>> +{ >>>> + uint32_t imm; >>>> + >>>> + /* Retrieve imm from branch instruction. */ >>>> + imm = ( insn >> BRANCH_INSN_IMM_SHIFT ) & BRANCH_INSN_IMM_MASK; >>>> + >>>> + /* >>>> + * Check the imm signed bit. If the imm is a negative value, we >>>> + * have to extend the imm to a full 32 bit negative value. >>>> + */ >>>> + if ( imm & BIT(23) ) >>>> + imm |= GENMASK(31, 24); >>>> + >>>> + return (int32_t)(imm << 2); >>>> +} >>>> + >>>> +/* >>>> + * Encode the displacement of a branch in the imm field and return the >>>> + * updated instruction. >>>> + */ >>>> +uint32_t aarch32_set_branch_offset(uint32_t insn, int32_t offset) >>>> +{ >>>> + if ( offset & 0x3 ) >>>> + { >>>> + printk(XENLOG_ERR >>>> + "%s: ARM32 instructions must be word aligned.\n", >>>> __func__); >>> >>> This error message looks wrong to me. The offset is not an instruction. >>> But do we really care about checking that offset is aligned to 4-bit? >>> After all we will shift the value later on. >>> >> >> I think we must care about the offset alignment. Even though we will >> shift the last two bits later on. But a unaligned offset itself >> indicates some problems (Compiler issue or target offset calculate bug). >> If we ignore it, we will ignore some potential problems. > > I don't think this is really important. I looked at the ARM64 > counterpart (see aarch64_set_branch_offset) and we don't do the check. > Ok, it seems we'd better to remove this pointless check. >> >> About the message can we change to: >> "Target ARM32 instructions must be placed on word aligned addresses?" > > That would be ok. If so, we don't need this message any more. > > > [...] > >>>> /* >>>> diff --git a/xen/include/asm-arm/arm32/insn.h >>>> b/xen/include/asm-arm/arm32/insn.h >>>> new file mode 100644 >>>> index 0000000..045acc3 >>>> --- /dev/null >>>> +++ b/xen/include/asm-arm/arm32/insn.h >>>> @@ -0,0 +1,57 @@ >>>> +/* >>>> + * Copyright (C) 2017 ARM Ltd. >>>> + * >>>> + * This program is free software; you can redistribute it and/or modify >>>> + * it under the terms of the GNU General Public License version 2 as >>>> + * published by the Free Software Foundation. >>>> + * >>>> + * 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, see <http://www.gnu.org/licenses/>. >>>> + */ >>>> +#ifndef __ARCH_ARM_ARM32_INSN >>>> +#define __ARCH_ARM_ARM32_INSN >>>> + >>>> +#include <xen/types.h> >>>> + >>>> +#define __AARCH32_INSN_FUNCS(abbr, mask, val) \ >>>> +static always_inline bool_t aarch32_insn_is_##abbr(uint32_t code) \ >>>> +{ \ >>>> + return (code & (mask)) == (val); \ >>>> +} >>>> + >>>> +__AARCH32_INSN_FUNCS(b, 0x0F000000, 0x0A000000) >>> >>> Looking at the ARM ARM (A8.8.18 in DDI406C.c) when cond = 0b1111, this >>> will be a bx. Thankfully we also want to catch them. >>> >>> I think this needs to be spelled out in the code to help the reader >>> understand how bx is handled. >>> >> >> Sorry, I am not very clear about this comment. I read the (A5.7 in >> DDI406C.c) and could not find bx unconditional instructions list. >> Did you mean the unconditional bl/blx? > > I meant blx rather than bx in my previous e-mail. Sorry. > >> >> Anyhow I think your concern is right. We have to cover the condition >> field. Some unconditional instructions may have a conflicted op field >> as conditional branch instructions. > > The only unconditional instruction with the same encoding is blx. So it > is fine. But this either need to be: > 1) properly documented > 2) introducing a blx macro > Yes, I re-checked the list, you're right. I will do it in next version. > Cheers, > -- Regards, Wei Chen _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |