diff mbox series

x86: refine link time stub area related assertion

Message ID 39b51904-37d8-f0c0-2ad3-6a0dd7df59d7@suse.com (mailing list archive)
State Superseded
Headers show
Series x86: refine link time stub area related assertion | expand

Commit Message

Jan Beulich Jan. 15, 2020, 10:26 a.m. UTC
While it has been me to introduce this, the use of | there has become
(and perhaps was from the very beginning) misleading. Rather than
avoiding the right side of it when linking the xen.efi intermediate file
at a different base address, make the expression cope with that case,
thus verifying placement on every step.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

Comments

Andrew Cooper Jan. 15, 2020, 2:36 p.m. UTC | #1
On 15/01/2020 10:26, Jan Beulich wrote:
> While it has been me to introduce this, the use of | there has become
> (and perhaps was from the very beginning) misleading. Rather than
> avoiding the right side of it when linking the xen.efi intermediate file
> at a different base address, make the expression cope with that case,
> thus verifying placement on every step.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> as this is simply a
rearranging, but...

>
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -351,8 +351,8 @@ SECTIONS
>    .comment 0 : { *(.comment) }
>  }
>  
> -ASSERT(__image_base__ > XEN_VIRT_START |
> -       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
> +ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
> +                          NR_CPUS * PAGE_SIZE,

... doesn't this want a stubs_per_page term?  We don't have 4k per cpu.

Wei: FYI, if you do introduce executable fixmap entries, this ASSERT()
wants adjusting by NR_X_FIXMAP * PAGE_SIZE as well.

~Andrew
Wei Liu Jan. 15, 2020, 4:08 p.m. UTC | #2
On Wed, Jan 15, 2020 at 02:36:24PM +0000, Andrew Cooper wrote:
> On 15/01/2020 10:26, Jan Beulich wrote:
> > While it has been me to introduce this, the use of | there has become
> > (and perhaps was from the very beginning) misleading. Rather than
> > avoiding the right side of it when linking the xen.efi intermediate file
> > at a different base address, make the expression cope with that case,
> > thus verifying placement on every step.
> >
> > Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> as this is simply a
> rearranging, but...
> 
> >
> > --- a/xen/arch/x86/xen.lds.S
> > +++ b/xen/arch/x86/xen.lds.S
> > @@ -351,8 +351,8 @@ SECTIONS
> >    .comment 0 : { *(.comment) }
> >  }
> >  
> > -ASSERT(__image_base__ > XEN_VIRT_START |
> > -       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
> > +ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
> > +                          NR_CPUS * PAGE_SIZE,
> 
> ... doesn't this want a stubs_per_page term?  We don't have 4k per cpu.
> 
> Wei: FYI, if you do introduce executable fixmap entries, this ASSERT()
> wants adjusting by NR_X_FIXMAP * PAGE_SIZE as well.

It is a bit problematic to do that if NR_X_FIXMAP is calculated from the
last enum element (see FIXADDR_SIZE)

I can expose a constant for the largest possible numbers of executable
fixed mappings to put in the ASSERT.

Wei.

> 
> ~Andrew
Jan Beulich Jan. 15, 2020, 4:27 p.m. UTC | #3
On 15.01.2020 15:36, Andrew Cooper wrote:
> On 15/01/2020 10:26, Jan Beulich wrote:
>> While it has been me to introduce this, the use of | there has become
>> (and perhaps was from the very beginning) misleading. Rather than
>> avoiding the right side of it when linking the xen.efi intermediate file
>> at a different base address, make the expression cope with that case,
>> thus verifying placement on every step.
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> as this is simply a
> rearranging, but...
> 
>>
>> --- a/xen/arch/x86/xen.lds.S
>> +++ b/xen/arch/x86/xen.lds.S
>> @@ -351,8 +351,8 @@ SECTIONS
>>    .comment 0 : { *(.comment) }
>>  }
>>  
>> -ASSERT(__image_base__ > XEN_VIRT_START |
>> -       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
>> +ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
>> +                          NR_CPUS * PAGE_SIZE,
> 
> ... doesn't this want a stubs_per_page term?  We don't have 4k per cpu.

Good point - let me see if I can fix this at this same occasion.
I guess when introducing these pages I had one per CPU initially,
and then forgot to update the assertion here (it being too strict
of course is better than it being too lax).

Jan
Andrew Cooper Jan. 15, 2020, 4:29 p.m. UTC | #4
On 15/01/2020 16:27, Jan Beulich wrote:
> On 15.01.2020 15:36, Andrew Cooper wrote:
>> On 15/01/2020 10:26, Jan Beulich wrote:
>>> While it has been me to introduce this, the use of | there has become
>>> (and perhaps was from the very beginning) misleading. Rather than
>>> avoiding the right side of it when linking the xen.efi intermediate file
>>> at a different base address, make the expression cope with that case,
>>> thus verifying placement on every step.
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> as this is simply a
>> rearranging, but...
>>
>>> --- a/xen/arch/x86/xen.lds.S
>>> +++ b/xen/arch/x86/xen.lds.S
>>> @@ -351,8 +351,8 @@ SECTIONS
>>>    .comment 0 : { *(.comment) }
>>>  }
>>>  
>>> -ASSERT(__image_base__ > XEN_VIRT_START |
>>> -       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
>>> +ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
>>> +                          NR_CPUS * PAGE_SIZE,
>> ... doesn't this want a stubs_per_page term?  We don't have 4k per cpu.
> Good point - let me see if I can fix this at this same occasion.
> I guess when introducing these pages I had one per CPU initially,
> and then forgot to update the assertion here (it being too strict
> of course is better than it being too lax).

With some suitable term, feel free to up my A-by to R-by.

~Andrew
Jan Beulich Jan. 15, 2020, 4:31 p.m. UTC | #5
On 15.01.2020 17:29, Andrew Cooper wrote:
> On 15/01/2020 16:27, Jan Beulich wrote:
>> On 15.01.2020 15:36, Andrew Cooper wrote:
>>> On 15/01/2020 10:26, Jan Beulich wrote:
>>>> While it has been me to introduce this, the use of | there has become
>>>> (and perhaps was from the very beginning) misleading. Rather than
>>>> avoiding the right side of it when linking the xen.efi intermediate file
>>>> at a different base address, make the expression cope with that case,
>>>> thus verifying placement on every step.
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com> as this is simply a
>>> rearranging, but...
>>>
>>>> --- a/xen/arch/x86/xen.lds.S
>>>> +++ b/xen/arch/x86/xen.lds.S
>>>> @@ -351,8 +351,8 @@ SECTIONS
>>>>    .comment 0 : { *(.comment) }
>>>>  }
>>>>  
>>>> -ASSERT(__image_base__ > XEN_VIRT_START |
>>>> -       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
>>>> +ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
>>>> +                          NR_CPUS * PAGE_SIZE,
>>> ... doesn't this want a stubs_per_page term?  We don't have 4k per cpu.
>> Good point - let me see if I can fix this at this same occasion.
>> I guess when introducing these pages I had one per CPU initially,
>> and then forgot to update the assertion here (it being too strict
>> of course is better than it being too lax).
> 
> With some suitable term, feel free to up my A-by to R-by.

Let me rather post what I have, because there's going to be some
ugliness (and hence room for mistakes) because of the rounding
needed. But thanks for the offer.

Jan
diff mbox series

Patch

--- a/xen/arch/x86/xen.lds.S
+++ b/xen/arch/x86/xen.lds.S
@@ -351,8 +351,8 @@  SECTIONS
   .comment 0 : { *(.comment) }
 }
 
-ASSERT(__image_base__ > XEN_VIRT_START |
-       __2M_rwdata_end <= XEN_VIRT_END - NR_CPUS * PAGE_SIZE,
+ASSERT(__2M_rwdata_end <= XEN_VIRT_END - XEN_VIRT_START + __XEN_VIRT_START -
+                          NR_CPUS * PAGE_SIZE,
        "Xen image overlaps stubs area")
 
 #ifdef CONFIG_KEXEC