|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 4/4] arch: boilerplate Arm support for thread-local storage
Hi Florian,
On 4/24/19 10:27 AM, Florian Schmidt wrote:
> Hi Costin,
>
> On 4/16/19 3:22 PM, Costin Lupu wrote:
>> Hi Florian,
>>
>> I'm not sure what is the expected outcome of this patch, however I
>> couldn't build on ARM64 because the following files are not included in
>> the Makefile:
>
> The whole point of this patch was simply to make sure unikraft still
> compiled on Arm, even if there was no usable functionality in some
> parts. Apparently, I failed with that task. ;-)
>
> However:
>
>> +LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
>> $(UK_PLAT_COMMON_BASE)/thread.c|common
>> +LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
>> $(UK_PLAT_COMMON_BASE)/sw_ctx.c|common
>
> That doesn't seem right to me either, for two reasons: There is no
> proper scheduling implemented yet for Arm, if I remember correctly; and
> sw_ctx.c can't properly work on Arm because it includes x86-specific
> code at this point in time. I think any build that enables uksched at
> this point in time fails to build. Maybe that can be fixed by including
> those two files, but I would expect everything to fail spectacularly as
> soon as you run it, then.
>
The problem here is that sw_ctx.c should not contain any hardware
specific code. So the x86-specific code should be moved elsewhere and an
abstraction should be used instead.
The software context (sw_ctx) is an abstraction used in scheduling when
the hardware support isn't used, e.g. in cooperative scheduling. It's
the opposite of hardware context (hw_ctx) which involves using hardware
support for preemptive scheduling.
> So yeah, the files in this patch are just there to allow compiling and
> linking on Arm with the current feature set (scheduling disabled). Plus
> some very preliminary untested implementation of tls_copy() for Arm64,
> since I figured I'd do it now that I had read all the documentation
> fresh in my mind.
>
>
>>
>> Now, I lost track of the ARM changes and I'm not sure if this is WIP or
>> it should be fixed by these TLS series.
>>
>> Please see my other comments inline.
>>
>> On 4/15/19 1:03 PM, Florian Schmidt wrote:
>>> Arm32 is ure boilerplate. Arm64 has some rough guesses about how the
>>
>> A typo here: ure?
>
> Ah, yes. It should have been "pure boilerplate".
>
>>
>>> layout should look like, but is untested.
>>>
>>> Signed-off-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>
>>> ---
>>> arch/arm/arm/include/uk/asm/thread.h | 60 ++++++++++++++++++++++
>>> arch/arm/arm64/include/uk/asm/thread.h | 70 ++++++++++++++++++++++++++
>>> plat/kvm/arm/link64.lds.S | 18 +++++++
>>> plat/xen/arm/link32.lds | 18 +++++++
>>> 4 files changed, 166 insertions(+)
>>> create mode 100644 arch/arm/arm/include/uk/asm/thread.h
>>> create mode 100644 arch/arm/arm64/include/uk/asm/thread.h
>>>
>>> diff --git a/arch/arm/arm/include/uk/asm/thread.h
>>> b/arch/arm/arm/include/uk/asm/thread.h
>>> new file mode 100644
>>> index 00000000..7225209e
>>> --- /dev/null
>>> +++ b/arch/arm/arm/include/uk/asm/thread.h
>>> @@ -0,0 +1,60 @@
>>> +/* SPDX-License-Identifier: BSD-3-Clause */
>>> +/*
>>> + * Authors: Florian Schmidt <florian.schmidt@xxxxxxxxx>
>>> + *
>>> + * Copyright (c) 2019, NEC Europe Ltd., NEC Corporation. All rights
>>> reserved.
>>> + *
>>> + * Redistribution and use in source and binary forms, with or without
>>> + * modification, are permitted provided that the following conditions
>>> + * are met:
>>> + *
>>> + * 1. Redistributions of source code must retain the above copyright
>>> + * notice, this list of conditions and the following disclaimer.
>>> + * 2. Redistributions in binary form must reproduce the above copyright
>>> + * notice, this list of conditions and the following disclaimer
>>> in the
>>> + * documentation and/or other materials provided with the
>>> distribution.
>>> + * 3. Neither the name of the copyright holder nor the names of its
>>> + * contributors may be used to endorse or promote products
>>> derived from
>>> + * this software without specific prior written permission.
>>> + *
>>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
>>> CONTRIBUTORS "AS IS"
>>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
>>> TO, THE
>>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
>>> PARTICULAR PURPOSE
>>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
>>> CONTRIBUTORS BE
>>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>>> BUSINESS
>>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>>> WHETHER IN
>>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>>> OTHERWISE)
>>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
>>> ADVISED OF THE
>>> + * POSSIBILITY OF SUCH DAMAGE.
>>> + *
>>> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
>>> + */
>>> +
>>> +#ifndef __UKARCH_THREAD_H__
>>> +#error Do not include this header directly
>>> +#endif
>>> +
>>> +#error Thread-local storage not implemented for arm32!
>>> +
>>> +extern char _tls_start[], _etdata[], _tls_end[];
>>> +
>>> +static inline unsigned long tls_area_size(void)
>>> +{
>>> + return 0;
>>> +}
>>> +
>>> +static inline unsigned int tls_area_align(void)
>>> +{
>>> + return 1;
>>> +}
>>> +
>>> +static inline void tls_copy(void *tls_area)
>>> +{
>>> +}
>>> +
>>> +static inline void *tls_pointer(void *tls_area)
>>> +{
>>> + return NULL;
>>> +}
>>> diff --git a/arch/arm/arm64/include/uk/asm/thread.h
>>> b/arch/arm/arm64/include/uk/asm/thread.h
>>> new file mode 100644
>>> index 00000000..2f5d9b98
>>> --- /dev/null
>>> +++ b/arch/arm/arm64/include/uk/asm/thread.h
>>
>> Lets follow the same suggestions for this files as the ones mentioned
>> for the previous patches.
>>
>>> @@ -0,0 +1,70 @@
>>> +/* SPDX-License-Identifier: BSD-3-Clause */
>>> +/*
>>> + * Authors: Florian Schmidt <florian.schmidt@xxxxxxxxx>
>>> + *
>>> + * Copyright (c) 2019, NEC Europe Ltd., NEC Corporation. All rights
>>> reserved.
>>> + *
>>> + * Redistribution and use in source and binary forms, with or without
>>> + * modification, are permitted provided that the following conditions
>>> + * are met:
>>> + *
>>> + * 1. Redistributions of source code must retain the above copyright
>>> + * notice, this list of conditions and the following disclaimer.
>>> + * 2. Redistributions in binary form must reproduce the above copyright
>>> + * notice, this list of conditions and the following disclaimer
>>> in the
>>> + * documentation and/or other materials provided with the
>>> distribution.
>>> + * 3. Neither the name of the copyright holder nor the names of its
>>> + * contributors may be used to endorse or promote products
>>> derived from
>>> + * this software without specific prior written permission.
>>> + *
>>> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
>>> CONTRIBUTORS "AS IS"
>>> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
>>> TO, THE
>>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
>>> PARTICULAR PURPOSE
>>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
>>> CONTRIBUTORS BE
>>> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>>> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>>> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>>> BUSINESS
>>> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>>> WHETHER IN
>>> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>>> OTHERWISE)
>>> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
>>> ADVISED OF THE
>>> + * POSSIBILITY OF SUCH DAMAGE.
>>> + *
>>> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
>>> + */
>>> +
>>> +#ifndef __UKARCH_THREAD_H__
>>> +#error Do not include this header directly
>>> +#endif
>>> +
>>> +#warning Thread-local storage has not been tested on aarch64!
>>> +
>>> +extern char _tls_start[], _etdata[], _tls_end[];
>>> +
>>> +static inline unsigned long tls_area_size(void)
>>> +{
>>> + /* aarch64 ABI adds 16 bytes of TCB at the beginning of the TLS
>>> area,
>>> + * followed by the actual TLS data.
>>> + */
>>> + return _tls_end - _tls_start + 16;
>>> +}
>>> +
>>> +static inline unsigned int tls_area_align(void)
>>> +{
>>> + return 8;
>>> +}
>>> +
>>> +static inline void tls_copy(void *tls_area)
>>> +{
>>> + unsigned int tls_len = _tls_end - _tls_start;
>>> + unsigned int tls_data_len = _etdata - _tls_start;
>>> + unsigned int tls_bss_len = _tls_end - _etdata;
>>> +
>>> + memset(tls_area, 0, 16);
>>> + memcpy(tls_area+16, _tls_start, tls_data_len);
>>> + memset(tls_area+tls_data_len+16, 0, tls_bss_len);
>>
>> Again, lets stick to Unikraft coding style for the spacing of these 2
>> lines of code in order to avoid propagating such examples.
>
> Agreed.
>
>>
>>> +}
>>> +
>>> +static inline void *tls_pointer(void *tls_area)
>>> +{
>>> + return tls_area;
>>> +}
>>> diff --git a/plat/kvm/arm/link64.lds.S b/plat/kvm/arm/link64.lds.S
>>> index 82328633..1ce22781 100644
>>> --- a/plat/kvm/arm/link64.lds.S
>>> +++ b/plat/kvm/arm/link64.lds.S
>>> @@ -118,6 +118,24 @@ SECTIONS {
>>> _ectors = .;
>>> . = ALIGN(__PAGE_SIZE);
>>> + . = ALIGN(0x8);
>>> + _tls_start = .;
>>> + .tdata :
>>> + {
>>> + *(.tdata)
>>> + *(.tdata.*)
>>> + *(.gnu.linkonce.td.*)
>>> + }
>>> + _etdata = .;
>>> + .tbss :
>>> + {
>>> + *(.tbss)
>>> + *(.tbss.*)
>>> + *(.gnu.linkonce.tb.*)
>>> + . = ALIGN(0x8);
>>> + }
>>> + _tls_end = . + SIZEOF(.tbss);
>>> +
>>
>> Again these linker script changes may be refactored into a single linker
>> file which would be used by all architectures and platforms.
>>
>>> /* Read-write data that is initialized explicitly in code */
>>> _data = .;
>>> .data :
>>> diff --git a/plat/xen/arm/link32.lds b/plat/xen/arm/link32.lds
>>> index 2b8e42dd..e679ba6f 100644
>>> --- a/plat/xen/arm/link32.lds
>>> +++ b/plat/xen/arm/link32.lds
>>> @@ -96,6 +96,24 @@ SECTIONS
>>> . = ALIGN(4096);
>>> _ectors = .;
>>> + . = ALIGN(0x8);
>>> + _tls_start = .;
>>> + .tdata :
>>> + {
>>> + *(.tdata)
>>> + *(.tdata.*)
>>> + *(.gnu.linkonce.td.*)
>>> + }
>>> + _etdata = .;
>>> + .tbss :
>>> + {
>>> + *(.tbss)
>>> + *(.tbss.*)
>>> + *(.gnu.linkonce.tb.*)
>>> + . = ALIGN(0x8);
>>> + }
>>> + _tls_end = . + SIZEOF(.tbss);
>>> +
>>> /* Data */
>>> _data = .;
>>> .data : {
>>>
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |