From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 30850 invoked from network); 18 Dec 2020 07:15:49 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 18 Dec 2020 07:15:49 -0000 Received: (qmail 5481 invoked by uid 550); 18 Dec 2020 07:15:43 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 5456 invoked from network); 18 Dec 2020 07:15:42 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=z2P7l9nW4SnkY4hfWhk6jXipO8ZpQKmQVBtAnjpO6EA=; b=Y7rU0ikkLRswrh75LNy+91ra4ijyE8Z95bz+NXyv9DU+N8u/TEHA6FBSYFsrRhzDZj Z4dyu15aOd4LzswYzuiMe0g1LDie5ZpSmogYDidZO/mUeuibeXc6PBHyvQpPk7RskmFq 5xfgyVZsPr5T9PaKHKWueB1Awi0sg4HRotpY0vu3tz1WwC2vMv9ZDQ1UJ4UNQYUoWS5e nodmzTMeG7cNTgtLvKIlb3kPgmE8+2Jmr9T1Xc8T3kc+yogQ3xkrCjH1k9IZCqTR8Gek jRFlDwSETomr36UY+Z5S7xtpXesq8munw04kCa76AN6XD7kL7Zz35zLolWJzcYmv238q sQGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=z2P7l9nW4SnkY4hfWhk6jXipO8ZpQKmQVBtAnjpO6EA=; b=LKe2PaGWLPPkCwjkfSC4KDYDP8kD04HRAMGJWs0a/DmOh1WMlGGSRLaCbwp7BnWidB xR9hbcjoA86YM+KwOB1UT7yB4GUxZiyUHi35J4W721l6oagMCpZ3hCfIyuRNk6xj9UHU UI7XDr5vLaQnZRo+NpQFQr1NV3Lr8WISkDVfj3BtQCi4gpVndHzIap4+62ZSOrFgnFbY 9MeiF7s0sxlcZvyfB/AExmXahriATUHrLWGNDn7OKPqP9PQjdsWQ5bsfFTkTqm+VKyLI OQyaYUdU44n+D3wDl7Mdmzd6eg1qjqN9v6f5CKNtLq93aCI/7LeqhD0YxZkpJOMX1t6r 0t2g== X-Gm-Message-State: AOAM532mBsoH4oNYunyI2b2uL7cfG7ZlYG/ljt5AKrPPKpy6ToL62Qv7 nM4e47JOptyBPWyiK4HPfzAiU0J1gIVjSD6U5SM= X-Google-Smtp-Source: ABdhPJz+OscYcU3reeaLArjyJprvYAwFYnlqwYOM8Nds5b67/4FUZNEFrxtPDTP6h8aN8tzfoqf3H+zuR2d59uXWglI= X-Received: by 2002:a5d:8b98:: with SMTP id p24mr180531iol.7.1608275730383; Thu, 17 Dec 2020 23:15:30 -0800 (PST) MIME-Version: 1.0 References: <20201217002348.GO534@brightrain.aerifal.cx> In-Reply-To: <20201217002348.GO534@brightrain.aerifal.cx> From: Jesse DeGuire Date: Fri, 18 Dec 2020 02:15:20 -0500 Message-ID: To: Rich Felker Cc: musl@lists.openwall.com Content-Type: multipart/mixed; boundary="0000000000009c8b0b05b6b7df0c" Subject: Re: [musl] Musl on Cortex-M Devices --0000000000009c8b0b05b6b7df0c Content-Type: text/plain; charset="UTF-8" On Wed, Dec 16, 2020 at 7:23 PM Rich Felker wrote: > > On Wed, Dec 16, 2020 at 06:43:15PM -0500, Jesse DeGuire wrote: > > Hey everyone, > > > > I'm working on putting together a Clang-based toolchain to use with > > Microchip PIC32 (MIPS32) and SAM (Cortex-M) microcontrollers as an > > alternative to their paid XC32 toolchain and I'd like to use Musl as > > the C library. Currently, I'm trying to get it to build for a few > > different Cortex-M devices and have found that Musl builds fine for > > ARMv7-M, but not for ARMv6-M or v8-M Baseline because Musl uses > > instructions not supported on the Thumb ISA subset used by v6-M and > > v8-M Baseline devices. I'm using the v1.2.1 tag version of Musl, but > > can easily switch to HEAD if needed. I am using a Python script to > > build Musl (and eventually the rest of the toolchain), which you can > > see on GitHub at the following link. It's a bit of a mess at the > > moment, but the build_musl() function is what I'm currently using to > > build Musl. > > I had assumed the thumb1[-ish?] subset wouldn't be interesting, but if > it is, let's have a look. > > > https://github.com/jdeguire/buildPic32Clang/blob/master/buildPic32Clang.py > > > > Anyway, I have managed to get Musl to build for v6-M, v7-M, and v8-M > > Baseline and have attached a diff to this email. If you like, I can go > > into more detail as to why I made the changes I made; however, many > > changes were merely the result of my attempts to correct errors > > reported by Clang due to it encountering instruction sequences not > > supported on ARMv6-M. > > Are there places where clang's linker is failing to make substitutions > that the GNU one can do, that would make this simpler? For example I > know the GNU one can replace bx rn by mov pc,rn if needed (based on a > relocation the assembler emits on the insn). The main issue I ran into is that ARMv6-M and v8-M.base have many instructions that can accept only registers R0-R7 as input, so some extra care or shuffling is required. Many of these were pretty easily worked around. > > A number of errors were simply the result of > > ARMv6-M requiring one to use the "S" variant of an instruction that > > sets status flags (such as "ADDS" vs "ADD" or "MOVS" vs "MOV"). A few > > files I had to change from a "lower case s" to a "capital-S" file so > > that I could use macros to check for either the Thumb1 ISA > > ("__thumb2__ || !__thumb__") or for an M-Profile device > > ("!__ARM_ARCH_ISA_ARM"). > > Is __ARM_ARCH_ISA_ARM universally available (even on old compilers)? > If not this may need an alternate detection. But I'd like to drop as > much as possible and just make the code compatible rather than having > 2 versions of it. I don't think there are any places where the > performance or size is at all relevant. I hadn't thought enough about that until your reply, so I used Compiler Explorer to at least get a general idea of when that macro was supported. Clang 3.5 supports it, but Clang 3.4.1 does not. GCC 5.4 supports it, but 4.64 (the previous version available on Compiler Explorer) does not. With that, I tried to come up with something to detect M-Profile devices and have updated my changes with it. #if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ \ || (__ARM_ARCH > 7 && !__ARM_ARCH_ISA_ARM) This presumes that the __ARM_ARCH_xx__ macros were supported for as long as that variant was supported and that any compiler that supports an ARM arch greater than 7 is new enough to have the __ARM_ARCH_ISA_ARM macro, but this should cover a wider range of toolchains. I also did merge some of the alternate paths like you suggested. > > The changes under > > "src/thread/arm/__set_thread_area.c" are different in that I made > > those because I don't believe Cortex-M devices could handle what was > > there (no M-Profile device has Coprocessor 15, for example) and so I > > Unless this is an ISA level that can't be executed on a normal (non-M) > ARM profile, it still needs all the backends that might be needed and > runtime selection of which to use. This is okay. I believe Linux for > nommu ARM has a syscall for get_tp, which is rather awful but probably > needs to be added as a backend. The right way to do this would have > been with trap-and-emulate (of cp15) I think... Out of curiosity, what makes that syscall awful? > > sort of punted for now and figured that a user's fault handler could > > handle those "_kuser" calls given that there probably won't be a > > kernel to do so. > > I don't think you can use the kuser_helper versions here because (1) > they're at ARM addresses, not thumb ones, and (2) they're in the > address range that Cortex M uses for special stuff. Ah, right you are! It turns out that the range 0xE0100000 and above is a "vendor system region", presumably for vendors to add their own system control or debug features on top of what ARM already provides and so one cannot assume that the region is empty. > > Unfortunately, I'm not far enough yet in my project to build code that > > would actually run on one of the micros I have with me, so I haven't > > yet been able to properly try out these changes. Also, I should > > mention that my eventual plan is to make a "baremetal" layer that > > would provide stubs to handle syscalls or thread-related things that > > you wouldn't normally have on a microcontroller, but I want to get > > Musl building without that first because I think I'll be able to > > utilize a lot of what's already present when I get to that point. > > Hopefully, what's here is still somewhat useful as a starting point > > should Musl want to support Cortex-M. I'll try to update this diff as > > a result of feedback or my own eventual testing (I'm a long way from > > that, though!). > > Thanks for the update. Please try to attach as UTF-8 rather than > UTF-16 next time so it's more readable/accessible. I had to guess it > was UTF-16 and switch the mime encoding headers to read it. Oops, sorry about that. I must have accidentally created the diff with PowerShell instead of my normal WSL Bash terminal. > Further comments inline below: > > > diff --git a/arch/arm/atomic_arch.h b/arch/arm/atomic_arch.h > > index 9e3937cc..21f102ad 100644 > > --- a/arch/arm/atomic_arch.h > > +++ b/arch/arm/atomic_arch.h > > @@ -64,11 +64,18 @@ static inline int a_cas(volatile int *p, int t, int s) > > > > #ifndef a_barrier > > #define a_barrier a_barrier > > +#if __ARM_ARCH_ISA_ARM > > static inline void a_barrier() > > { > > register uintptr_t ip __asm__("ip") = __a_barrier_ptr; > > __asm__ __volatile__( BLX " ip" : "+r"(ip) : : "memory", "cc", "lr" ); > > } > > +#else > > +static inline void a_barrier() > > +{ > > + __asm__ __volatile__ ("dmb" : : : "memory"); > > +} > > +#endif > > #endif > > There's a condition above with this code already; you just need to > make it used for an additional case. Fixed. The original code was nested inside an ifdef that also would have used LDREX and STREX--neither of which ARMv6-M supports--so I moved that out and added the extra check. > > #define a_crash a_crash > > diff --git a/arch/arm/crt_arch.h b/arch/arm/crt_arch.h > > index 99508b1d..c48b14b0 100644 > > --- a/arch/arm/crt_arch.h > > +++ b/arch/arm/crt_arch.h > > @@ -3,13 +3,25 @@ __asm__( > > ".global " START " \n" > > ".type " START ",%function \n" > > START ": \n" > > +#if defined(__thumb2__) || !defined(__thumb__) > > " mov fp, #0 \n" > > " mov lr, #0 \n" > > +#else > > +" movs a3, #0 \n" > > +" mov fp, a3 \n" > > +" mov lr, a3 \n" > > +#endif > > " ldr a2, 1f \n" > > " add a2, pc, a2 \n" > > " mov a1, sp \n" > > +#if defined(__thumb2__) || !defined(__thumb__) > > "2: and ip, a1, #-16 \n" > > " mov sp, ip \n" > > +#else > > +"2: subs a3, #16 \n" > > +" ands a1, a3 \n" > > +" mov sp, a1 \n" > > +#endif > > " bl " START "_c \n" > > ".weak _DYNAMIC \n" > > ".hidden _DYNAMIC \n" > > This can just use the new code unconditionally. Done. > > diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h > > index e689ea21..a89fb554 100644 > > --- a/arch/arm/pthread_arch.h > > +++ b/arch/arm/pthread_arch.h > > @@ -1,5 +1,5 @@ > > -#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > - || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 > > +#if __ARM_ARCH_ISA_ARM && (((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > + || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7) > > That's probably not the right condition. Can you provide more detail as I'm missing what you mean? The intent was to prevent this check from succeeding for any M-Profile device so that they fall back to the __a gettp_ptr solution. I did update this check to what I described at the top of this reply. > > static inline pthread_t __pthread_self() > > { > > diff --git a/configure b/configure > > old mode 100755 > > new mode 100644 > > diff --git a/crt/arm/crtn.S b/crt/arm/crtn.S > > index dc020f92..83e20da2 100644 > > --- a/crt/arm/crtn.S > > +++ b/crt/arm/crtn.S > > @@ -1,9 +1,17 @@ > > .syntax unified > > > > .section .init > > +#if __ARM_ARCH_ISA_ARM > > pop {r0,lr} > > bx lr > > +#else > > + pop {r0,pc} > > +#endif > > > > .section .fini > > +#if __ARM_ARCH_ISA_ARM > > pop {r0,lr} > > bx lr > > +#else > > + pop {r0,pc} > > +#endif > > Ideally the linker could handle this. The issue here is that ARMv6-M (and I believe v8-M.base) cannot POP into LR. Can this sequence replace LR with R1? My current version POPs into R1 and moves that into LR because I wasn't sure if that was important for the caller. > > diff --git a/src/ldso/arm/tlsdesc.S b/src/ldso/arm/tlsdesc.S > > index 3ae133c9..1843d97d 100644 > > --- a/src/ldso/arm/tlsdesc.S > > +++ b/src/ldso/arm/tlsdesc.S > > @@ -12,13 +12,19 @@ __tlsdesc_static: > > .hidden __tlsdesc_dynamic > > .type __tlsdesc_dynamic,%function > > __tlsdesc_dynamic: > > +#if defined(__thumb2__) || !defined(__thumb__) > > push {r2,r3,ip,lr} > > +#else > > + push {r2-r4,lr} > > + mov r2,ip > > + push {r2} > > +#endif > > AFAICT ip is not special here. If it's a pain to push/pop, just use a > different register. Gotcha. It looks like there isn't really a good reason for the original to use IP, either, so I could change that and merge a couple of those alternate code paths. If you don't mind a few extra instructions, I think I can get rid of all of the (__thumb2__ || !__thumb__) checks in there. > > ldr r1,[r0] > > ldr r2,[r1,#4] // r2 = offset > > ldr r1,[r1] // r1 = modid > > > > -#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > - || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 > > +#if __ARM_ARCH_ISA_ARM && (((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > + || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7) > > mrc p15,0,r0,c13,c0,3 > > #else > > ldr r0,1f > > @@ -36,19 +42,34 @@ __tlsdesc_dynamic: > > bx r0 > > #endif > > #endif > > +#if defined(__thumb2__) || !defined(__thumb__) > > ldr r3,[r0,#-4] // r3 = dtv > > ldr ip,[r3,r1,LSL #2] > > sub r0,ip,r0 > > +#else > > + mov r4,r0 > > + subs r4,#4 > > + ldr r3,[r4] > > + lsls r4,r1,#2 > > + ldr r4,[r3,r4] > > + subs r0,r4,r0 > > +#endif > > add r0,r0,r2 // r0 = r3[r1]-r0+r2 > > +#if defined(__thumb2__) || !defined(__thumb__) > > #if __ARM_ARCH >= 5 > > pop {r2,r3,ip,pc} > > #else > > pop {r2,r3,ip,lr} > > bx lr > > #endif > > +#else > > + pop {r2} > > + mov ip,r2 > > + pop {r2-r4,pc} > > +#endif > > > > -#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > - || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 > > +#if __ARM_ARCH_ISA_ARM && (((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ > > + || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7) > > #else > > .align 2 > > 1: .word __a_gettp_ptr - 2b > > diff --git a/src/process/arm/vfork.s b/src/process/arm/vfork.s > > index d7ec41b3..b6f0260e 100644 > > --- a/src/process/arm/vfork.s > > +++ b/src/process/arm/vfork.s > > @@ -3,7 +3,7 @@ > > .type vfork,%function > > vfork: > > mov ip, r7 > > - mov r7, 190 > > + movs r7, 190 > > svc 0 > > mov r7, ip > > .hidden __syscall_ret > > OK. > > > diff --git a/src/setjmp/arm/longjmp.S b/src/setjmp/arm/longjmp.S > > index 8df0b819..745c9ba2 100644 > > --- a/src/setjmp/arm/longjmp.S > > +++ b/src/setjmp/arm/longjmp.S > > @@ -5,6 +5,7 @@ > > .type longjmp,%function > > _longjmp: > > longjmp: > > +#if defined(__thumb2__) || !defined(__thumb__) > > mov ip,r0 > > movs r0,r1 > > moveq r0,#1 > > @@ -16,7 +17,7 @@ longjmp: > > ldr r2,1f > > ldr r1,[r1,r2] > > > > -#if __ARM_ARCH < 8 > > +#if __ARM_ARCH_ISA_ARM && __ARM_ARCH < 8 > > tst r1,#0x260 > > beq 3f > > // HWCAP_ARM_FPA > > @@ -31,7 +32,7 @@ longjmp: > > .fpu softvfp > > .eabi_attribute 10, 0 > > .eabi_attribute 27, 0 > > -#if __ARM_ARCH < 8 > > +#if __ARM_ARCH_ISA_ARM && __ARM_ARCH < 8 > > // HWCAP_ARM_IWMMXT > > 2: tst r1,#0x200 > > beq 3f > > @@ -42,6 +43,36 @@ longjmp: > > ldcl p1, cr14, [ip], #8 > > ldcl p1, cr15, [ip], #8 > > #endif > > +#else > > + mov ip,r0 > > + movs r0,r1 > > + bne 4f > > + movs r0,#1 > > +4: mov r1,ip > > + adds r1,#16 > > + ldmia r1!, {r2-r7} > > + mov lr,r7 > > + mov sp,r6 > > + mov r11,r5 > > + mov r10,r4 > > + mov r9,r3 > > + mov r8,r2 > > + mov ip,r1 > > + subs r1,#40 > > + ldmia r1!, {r4-r7} > > + > > + adr r1,1f > > + ldr r2,1f > > + ldr r1,[r1,r2] > > + movs r2,#0x40 > > + tst r1,r2 > > + beq 2f > > + .fpu vfp > > + vldmia ip!, {d8-d15} > > + .fpu softvfp > > + .eabi_attribute 10, 0 > > + .eabi_attribute 27, 0 > > +#endif > > 2: > > 3: bx lr > > This should probably be unified somehow. I was able to partially merge this. > > diff --git a/src/setjmp/arm/setjmp.S b/src/setjmp/arm/setjmp.S > > index 45731d22..440c166d 100644 > > --- a/src/setjmp/arm/setjmp.S > > +++ b/src/setjmp/arm/setjmp.S > > @@ -8,6 +8,7 @@ > > __setjmp: > > _setjmp: > > setjmp: > > +#if defined(__thumb2__) || !defined(__thumb__) > > mov ip,r0 > > stmia ip!,{v1,v2,v3,v4,v5,v6,sl,fp} > > mov r2,sp > > @@ -18,7 +19,7 @@ setjmp: > > ldr r2,1f > > ldr r1,[r1,r2] > > > > -#if __ARM_ARCH < 8 > > +#if __ARM_ARCH_ISA_ARM && __ARM_ARCH < 8 > > tst r1,#0x260 > > beq 3f > > // HWCAP_ARM_FPA > > @@ -33,7 +34,7 @@ setjmp: > > .fpu softvfp > > .eabi_attribute 10, 0 > > .eabi_attribute 27, 0 > > -#if __ARM_ARCH < 8 > > +#if __ARM_ARCH_ISA_ARM && __ARM_ARCH < 8 > > // HWCAP_ARM_IWMMXT > > 2: tst r1,#0x200 > > beq 3f > > @@ -44,6 +45,30 @@ setjmp: > > stcl p1, cr14, [ip], #8 > > stcl p1, cr15, [ip], #8 > > #endif > > +#else > > + stmia r0!,{r4-r7} > > + mov r1,r8 > > + mov r2,r9 > > + mov r3,r10 > > + mov r4,r11 > > + mov r5,sp > > + mov r6,lr > > + stmia r0!,{r1-r6} > > + mov ip,r0 > > + movs r0,#0 > > + > > + adr r1,1f > > + ldr r2,1f > > + ldr r1,[r1,r2] > > + movs r2,#0x40 > > + tst r1,r2 > > + beq 2f > > + .fpu vfp > > + vstmia ip!, {d8-d15} > > + .fpu softvfp > > + .eabi_attribute 10, 0 > > + .eabi_attribute 27, 0 > > +#endif > > 2: > > 3: bx lr > > Same here. I partially merged this as well. > > diff --git a/src/signal/arm/restore.s b/src/signal/arm/restore.s > > index fb086d9b..2b7621b1 100644 > > --- a/src/signal/arm/restore.s > > +++ b/src/signal/arm/restore.s > > @@ -4,12 +4,12 @@ > > .hidden __restore > > .type __restore,%function > > __restore: > > - mov r7,#119 > > + movs r7,#119 > > swi 0x0 > > > > .global __restore_rt > > .hidden __restore_rt > > .type __restore_rt,%function > > __restore_rt: > > - mov r7,#173 > > + movs r7,#173 > > swi 0x0 > > Probably OK, unles gdb does something ridiculous wanting the exact > insn sequence... > > > diff --git a/src/signal/arm/sigsetjmp.S b/src/signal/arm/sigsetjmp.S > > index 69ebbf49..85a71666 100644 > > --- a/src/signal/arm/sigsetjmp.S > > +++ b/src/signal/arm/sigsetjmp.S > > @@ -9,16 +9,36 @@ __sigsetjmp: > > bne 1f > > b setjmp > > > > +#if defined(__thumb2__) || !defined(__thumb__) > > 1: str lr,[r0,#256] > > str r4,[r0,#260+8] > > +#else > > +1: mov ip,r2 > > + mov r2,lr > > + adds r0,#200 > > + str r2,[r0,#56] > > + str r4,[r0,#60+8] > > + subs r0,#200 > > + mov r2,ip > > +#endif > > mov r4,r0 > > > > bl setjmp > > > > mov r1,r0 > > mov r0,r4 > > +#if defined(__thumb2__) || !defined(__thumb__) > > ldr lr,[r0,#256] > > ldr r4,[r0,#260+8] > > +#else > > + mov ip,r2 > > + adds r0,#200 > > + ldr r2,[r0,#56] > > + mov lr,r2 > > + ldr r4,[r0,#60+8] > > + subs r0,#200 > > + mov r2,ip > > +#endif > > Ideally should be unified. Done. > > .hidden __sigsetjmp_tail > > b __sigsetjmp_tail > > diff --git a/src/string/arm/memcpy.S b/src/string/arm/memcpy.S > > index 869e3448..c5d17533 100644 > > --- a/src/string/arm/memcpy.S > > +++ b/src/string/arm/memcpy.S > > @@ -43,6 +43,8 @@ > > * building as thumb 2 and big-endian. > > */ > > > > +#if defined(__thumb2__) || !defined(__thumb__) > > + > > .syntax unified > > > > .global memcpy > > @@ -477,3 +479,4 @@ copy_last_3_and_return: > > ldmfd sp!, {r0, r4, lr} > > bx lr > > > > +#endif // defined(__thumb2__) || !defined(__thumb__) > > The logic to enable the C memcpy seems to be missing. I wasn't actually sure of the best way to do this. In my current version, I sort of followed the lead of the stuff in src/math/arm and made it a C file that will either conditionally have the ARM version as inline assembly or include the generic C version. Is there a better way? The diff didn't capture this because of the rename; should I attach it separately? > > diff --git a/src/thread/arm/__set_thread_area.c b/src/thread/arm/__set_thread_area.c > > index 09de65aa..cb5d757d 100644 > > --- a/src/thread/arm/__set_thread_area.c > > +++ b/src/thread/arm/__set_thread_area.c > > @@ -26,7 +26,11 @@ extern hidden uintptr_t __a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr; > > > > int __set_thread_area(void *p) > > { > > -#if !__ARM_ARCH_7A__ && !__ARM_ARCH_7R__ && __ARM_ARCH < 7 > > +#if !__ARM_ARCH_ISA_ARM > > + __a_gettp_ptr = __a_gettp_kuser; > > + __a_cas_ptr = __a_cas_kuser; > > + __a_barrier_ptr = __a_barrier_kuser; > > +#elif !__ARM_ARCH_7A__ && !__ARM_ARCH_7R__ && __ARM_ARCH < 7 > > if (__hwcap & HWCAP_TLS) { > > size_t *aux; > > __a_cas_ptr = __a_cas_v7; > > HWCAP needs to be honored here. You also need to add the new logic to > use the syscall for getting thread pointer, I think. I updated this to use the "get_tls" syscall (0xf0006) for M-Profile devices. The barrier and cas pointers point to the default dummy functions. I'm not entirely sure how I should handle HWCAP. What should I do if TLS is or isn't set? If it isn't set, the original code uses those 'kuser' addresses that you pointed out aren't usable and will bail out if the version at the special address isn't correct. Right now, I have mine set to call a_crash() if TLS is not set in HWCAP because that seems to be the closest I can come to the current functionality. > > diff --git a/src/thread/arm/__unmapself.s b/src/thread/arm/__unmapself.s > > index 29c2d07b..fe0406e3 100644 > > --- a/src/thread/arm/__unmapself.s > > +++ b/src/thread/arm/__unmapself.s > > @@ -3,7 +3,7 @@ > > .global __unmapself > > .type __unmapself,%function > > __unmapself: > > - mov r7,#91 > > + movs r7,#91 > > svc 0 > > - mov r7,#1 > > + movs r7,#1 > > svc 0 > > OK, but this file can't be used on nommu anyway. Instead the generic C > version has to be used. LIke memcpy above (and the stuffi in src/math/arm), I made this a C file that will either have this code as inline assembly or will include the generic C version. The diff didn't capture this, should I attach this separately? > > diff --git a/src/thread/arm/atomics.S b/src/thread/arm/atomics.S > > index da50508d..d49809d9 100644 > > --- a/src/thread/arm/atomics.S > > +++ b/src/thread/arm/atomics.S > > @@ -1,3 +1,5 @@ > > +#if __ARM_ARCH_ISA_ARM > > + > > .syntax unified > > .text > > > > @@ -104,3 +106,5 @@ __a_cas_ptr: > > .hidden __a_gettp_ptr > > __a_gettp_ptr: > > .word __a_gettp_cp15 > > + > > +#endif > > This file should not be conditional. If it can't be assembled in > default mode it just needs ISA level override directives. Which > functions are actually called is selected at runtime. I removed the condition so that everything in here is always built and added directives as needed. I did run into an issue, though. Is there a way to restore the default architecture after setting it using ".arch "? Something like ".set push" and ".set pop" in MIPS assembly? I didn't realize what the "scope" of those .arch directives were until it occurred to me that one of the functions shouldn't have built for ARMv6-M. I rearranged the functions so that the ones without .arch directives come first, which did take care of the problem for now. Trying ".arch" by itself gets me an error from Clang. > > diff --git a/src/thread/arm/clone.S b/src/thread/arm/clone.S > > index bb0965da..70d29f70 100644 > > --- a/src/thread/arm/clone.S > > +++ b/src/thread/arm/clone.S > > @@ -4,24 +4,30 @@ > > .hidden __clone > > .type __clone,%function > > __clone: > > - stmfd sp!,{r4,r5,r6,r7} > > - mov r7,#120 > > + push {r4,r5,r6,r7} > > + movs r7,#120 > > mov r6,r3 > > mov r5,r0 > > mov r0,r2 > > +#if defined(__thumb2__) || !defined(__thumb__) > > and r1,r1,#-16 > > +#else > > + movs r2,#0 > > + subs r2,#16 > > + ands r1,r2 > > +#endif > > ldr r2,[sp,#16] > > ldr r3,[sp,#20] > > ldr r4,[sp,#24] > > svc 0 > > tst r0,r0 > > beq 1f > > - ldmfd sp!,{r4,r5,r6,r7} > > + pop {r4,r5,r6,r7} > > bx lr > > > > 1: mov r0,r6 > > bl 3f > > -2: mov r7,#1 > > +2: movs r7,#1 > > svc 0 > > b 2b > > I think this can all be unconditional, no #if's. Changed to remove the #ifs. > > diff --git a/src/thread/arm/syscall_cp.S b/src/thread/arm/syscall_cp.S > > index e607dd42..f53cbb3a 100644 > > --- a/src/thread/arm/syscall_cp.S > > +++ b/src/thread/arm/syscall_cp.S > > @@ -11,7 +11,7 @@ > > .type __syscall_cp_asm,%function > > __syscall_cp_asm: > > mov ip,sp > > - stmfd sp!,{r4,r5,r6,r7} > > + push {r4,r5,r6,r7} > > __cp_begin: > > ldr r0,[r0] > > cmp r0,#0 > > @@ -19,11 +19,16 @@ __cp_begin: > > mov r7,r1 > > mov r0,r2 > > mov r1,r3 > > +#if defined(__thumb2__) || !defined(__thumb__) > > ldmfd ip,{r2,r3,r4,r5,r6} > > +#else > > + mov r2,ip > > + ldmfd r2,{r2,r3,r4,r5,r6} > > +#endif > > svc 0 > > __cp_end: > > - ldmfd sp!,{r4,r5,r6,r7} > > + pop {r4,r5,r6,r7} > > bx lr > > __cp_cancel: > > - ldmfd sp!,{r4,r5,r6,r7} > > + pop {r4,r5,r6,r7} > > b __cancel > > diff --git a/tools/install.sh b/tools/install.sh > > old mode 100755 > > new mode 100644 > > This can be unconditional, and maybe a register other than ip can be > used to make it simpler..? > > Rich Removed the condition. Thanks for your help! Jesse --0000000000009c8b0b05b6b7df0c Content-Type: application/octet-stream; name="musl_cortexm_v2.diff" Content-Disposition: attachment; filename="musl_cortexm_v2.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kitxu5oc0 ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2F0b21pY19hcmNoLmggYi9hcmNoL2FybS9hdG9taWNfYXJj aC5oCmluZGV4IDllMzkzN2NjLi5mYThhODU3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYXRvbWlj X2FyY2guaAorKysgYi9hcmNoL2FybS9hdG9taWNfYXJjaC5oCkBAIC0yNywxNiArMjcsNiBAQCBz dGF0aWMgaW5saW5lIGludCBhX3NjKHZvbGF0aWxlIGludCAqcCwgaW50IHYpCiAJcmV0dXJuICFy OwogfQogCi0jaWYgX19BUk1fQVJDSF83QV9fIHx8IF9fQVJNX0FSQ0hfN1JfXyB8fCAgX19BUk1f QVJDSCA+PSA3Ci0KLSNkZWZpbmUgYV9iYXJyaWVyIGFfYmFycmllcgotc3RhdGljIGlubGluZSB2 b2lkIGFfYmFycmllcigpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJkbWIgaXNoIiA6IDog OiAibWVtb3J5Iik7Ci19Ci0KLSNlbmRpZgotCiAjZGVmaW5lIGFfcHJlX2xsc2MgYV9iYXJyaWVy CiAjZGVmaW5lIGFfcG9zdF9sbHNjIGFfYmFycmllcgogCkBAIC02MiwxMyArNTIsMjIgQEAgc3Rh dGljIGlubGluZSBpbnQgYV9jYXModm9sYXRpbGUgaW50ICpwLCBpbnQgdCwgaW50IHMpCiAKICNl bmRpZgogCi0jaWZuZGVmIGFfYmFycmllcgogI2RlZmluZSBhX2JhcnJpZXIgYV9iYXJyaWVyCisj aWYgX19BUk1fQVJDSF82TV9fIHx8IF9fQVJNX0FSQ0hfN0FfXyB8fCBfX0FSTV9BUkNIXzdSX18g fHwgIF9fQVJNX0FSQ0ggPj0gNworCitzdGF0aWMgaW5saW5lIHZvaWQgYV9iYXJyaWVyKCkKK3sK KwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRtYiBpc2giIDogOiA6ICJtZW1vcnkiKTsKK30KKwor I2Vsc2UKKwogc3RhdGljIGlubGluZSB2b2lkIGFfYmFycmllcigpCiB7CiAJcmVnaXN0ZXIgdWlu dHB0cl90IGlwIF9fYXNtX18oImlwIikgPSBfX2FfYmFycmllcl9wdHI7CiAJX19hc21fXyBfX3Zv bGF0aWxlX18oIEJMWCAiIGlwIiA6ICIrciIoaXApIDogOiAibWVtb3J5IiwgImNjIiwgImxyIiAp OwogfQorCiAjZW5kaWYKIAogI2RlZmluZSBhX2NyYXNoIGFfY3Jhc2gKZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtL2NydF9hcmNoLmggYi9hcmNoL2FybS9jcnRfYXJjaC5oCmluZGV4IDk5NTA4YjFkLi42 NjA4MDQyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY3J0X2FyY2guaAorKysgYi9hcmNoL2FybS9j cnRfYXJjaC5oCkBAIC0zLDEzICszLDE1IEBAIF9fYXNtX18oCiAiLmdsb2JhbCAiIFNUQVJUICIg XG4iCiAiLnR5cGUgIiBTVEFSVCAiLCVmdW5jdGlvbiBcbiIKIFNUQVJUICI6IFxuIgotIgltb3Yg ZnAsICMwIFxuIgotIgltb3YgbHIsICMwIFxuIgorIgltb3ZzIGEzLCAjMCBcbiIKKyIJbW92IGZw LCBhMyBcbiIKKyIJbW92IGxyLCBhMyBcbiIKICIJbGRyIGEyLCAxZiBcbiIKICIJYWRkIGEyLCBw YywgYTIgXG4iCiAiCW1vdiBhMSwgc3AgXG4iCi0iMjoJYW5kIGlwLCBhMSwgIy0xNiBcbiIKLSIJ bW92IHNwLCBpcCBcbiIKKyIyOglzdWJzIGEzLCAjMTYgXG4iCisiCWFuZHMgYTEsIGEzIFxuIgor Igltb3Ygc3AsIGExIFxuIgogIglibCAiIFNUQVJUICJfYyBcbiIKICIud2VhayBfRFlOQU1JQyBc biIKICIuaGlkZGVuIF9EWU5BTUlDIFxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcHRocmVhZF9h cmNoLmggYi9hcmNoL2FybS9wdGhyZWFkX2FyY2guaAppbmRleCBlNjg5ZWEyMS4uYWI4ZjJhZjIg MTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3B0aHJlYWRfYXJjaC5oCisrKyBiL2FyY2gvYXJtL3B0aHJl YWRfYXJjaC5oCkBAIC0xLDUgKzEsNiBAQAotI2lmICgoX19BUk1fQVJDSF82S19fIHx8IF9fQVJN X0FSQ0hfNktaX18gfHwgX19BUk1fQVJDSF82WktfXykgJiYgIV9fdGh1bWJfXykgXAotIHx8IF9f QVJNX0FSQ0hfN0FfXyB8fCBfX0FSTV9BUkNIXzdSX18gfHwgX19BUk1fQVJDSCA+PSA3CisjaWYg IShfX0FSTV9BUkNIXzZNX18gfHwgX19BUk1fQVJDSF83TV9fIHx8IF9fQVJNX0FSQ0hfN0VNX18g fHwgKF9fQVJNX0FSQ0ggPiA3ICYmICFfX0FSTV9BUkNIX0lTQV9BUk0pKSBcCisgJiYgKCgoX19B Uk1fQVJDSF82S19fIHx8IF9fQVJNX0FSQ0hfNktaX18gfHwgX19BUk1fQVJDSF82WktfXykgJiYg IV9fdGh1bWJfXykgXAorIHx8IF9fQVJNX0FSQ0hfN0FfXyB8fCBfX0FSTV9BUkNIXzdSX18gfHwg X19BUk1fQVJDSCA+PSA3KQogCiBzdGF0aWMgaW5saW5lIHB0aHJlYWRfdCBfX3B0aHJlYWRfc2Vs ZigpCiB7CmRpZmYgLS1naXQgYS9jcnQvYXJtL2NydG4ucyBiL2NydC9hcm0vY3J0bi5zCmluZGV4 IGRjMDIwZjkyLi5kNzUxZjhjZCAxMDA2NDQKLS0tIGEvY3J0L2FybS9jcnRuLnMKKysrIGIvY3J0 L2FybS9jcnRuLnMKQEAgLTEsOSArMSwxMSBAQAogLnN5bnRheCB1bmlmaWVkCiAKIC5zZWN0aW9u IC5pbml0Ci0JcG9wIHtyMCxscn0KKwlwb3Age3IwLHIxfQorCW1vdiBscixyMQogCWJ4IGxyCiAK IC5zZWN0aW9uIC5maW5pCi0JcG9wIHtyMCxscn0KKwlwb3Age3IwLHIxfQorCW1vdiBscixyMQog CWJ4IGxyCmRpZmYgLS1naXQgYS9zcmMvbGRzby9hcm0vdGxzZGVzYy5TIGIvc3JjL2xkc28vYXJt L3Rsc2Rlc2MuUwppbmRleCAzYWUxMzNjOS4uZjNmY2RmNDMgMTAwNjQ0Ci0tLSBhL3NyYy9sZHNv L2FybS90bHNkZXNjLlMKKysrIGIvc3JjL2xkc28vYXJtL3Rsc2Rlc2MuUwpAQCAtMTIsMTMgKzEy LDE4IEBAIF9fdGxzZGVzY19zdGF0aWM6CiAuaGlkZGVuIF9fdGxzZGVzY19keW5hbWljCiAudHlw ZSBfX3Rsc2Rlc2NfZHluYW1pYywlZnVuY3Rpb24KIF9fdGxzZGVzY19keW5hbWljOgorI2lmIGRl ZmluZWQoX190aHVtYjJfXykgIHx8ICAhZGVmaW5lZChfX3RodW1iX18pCiAJcHVzaCB7cjIscjMs aXAsbHJ9CisjZWxzZQorCXB1c2gge3IyLXI0LGxyfQorI2VuZGlmCiAJbGRyIHIxLFtyMF0KIAls ZHIgcjIsW3IxLCM0XSAgLy8gcjIgPSBvZmZzZXQKIAlsZHIgcjEsW3IxXSAgICAgLy8gcjEgPSBt b2RpZAogCi0jaWYgKChfX0FSTV9BUkNIXzZLX18gfHwgX19BUk1fQVJDSF82S1pfXyB8fCBfX0FS TV9BUkNIXzZaS19fKSAmJiAhX190aHVtYl9fKSBcCi0gfHwgX19BUk1fQVJDSF83QV9fIHx8IF9f QVJNX0FSQ0hfN1JfXyB8fCBfX0FSTV9BUkNIID49IDcKKyNpZiAhKF9fQVJNX0FSQ0hfNk1fXyB8 fCBfX0FSTV9BUkNIXzdNX18gfHwgX19BUk1fQVJDSF83RU1fXyB8fCAoX19BUk1fQVJDSCA+IDcg JiYgIV9fQVJNX0FSQ0hfSVNBX0FSTSkpIFwKKyAmJiAoKChfX0FSTV9BUkNIXzZLX18gfHwgX19B Uk1fQVJDSF82S1pfXyB8fCBfX0FSTV9BUkNIXzZaS19fKSAmJiAhX190aHVtYl9fKSBcCisgfHwg X19BUk1fQVJDSF83QV9fIHx8IF9fQVJNX0FSQ0hfN1JfXyB8fCBfX0FSTV9BUkNIID49IDcpCiAJ bXJjIHAxNSwwLHIwLGMxMyxjMCwzCiAjZWxzZQogCWxkciByMCwxZgpAQCAtMzYsMTkgKzQxLDMz IEBAIF9fdGxzZGVzY19keW5hbWljOgogCWJ4IHIwCiAjZW5kaWYKICNlbmRpZgorI2lmIGRlZmlu ZWQoX190aHVtYjJfXykgIHx8ICAhZGVmaW5lZChfX3RodW1iX18pCiAJbGRyIHIzLFtyMCwjLTRd IC8vIHIzID0gZHR2CiAJbGRyIGlwLFtyMyxyMSxMU0wgIzJdCiAJc3ViIHIwLGlwLHIwCisjZWxz ZQorCW1vdiByNCxyMAorCXN1YnMgcjQsIzQKKwlsZHIgcjMsW3I0XQorCWxzbHMgcjQscjEsIzIK KwlsZHIgcjQsW3IzLHI0XQorCXN1YnMgcjAscjQscjAKKyNlbmRpZgogCWFkZCByMCxyMCxyMiAg ICAvLyByMCA9IHIzW3IxXS1yMCtyMgorI2lmIGRlZmluZWQoX190aHVtYjJfXykgIHx8ICAhZGVm aW5lZChfX3RodW1iX18pCiAjaWYgX19BUk1fQVJDSCA+PSA1CiAJcG9wIHtyMixyMyxpcCxwY30K ICNlbHNlCiAJcG9wIHtyMixyMyxpcCxscn0KIAlieCBscgogI2VuZGlmCisjZWxzZQorCXBvcCB7 cjItcjQscGN9CisjZW5kaWYKIAotI2lmICgoX19BUk1fQVJDSF82S19fIHx8IF9fQVJNX0FSQ0hf NktaX18gfHwgX19BUk1fQVJDSF82WktfXykgJiYgIV9fdGh1bWJfXykgXAotIHx8IF9fQVJNX0FS Q0hfN0FfXyB8fCBfX0FSTV9BUkNIXzdSX18gfHwgX19BUk1fQVJDSCA+PSA3CisjaWYgIShfX0FS TV9BUkNIXzZNX18gfHwgX19BUk1fQVJDSF83TV9fIHx8IF9fQVJNX0FSQ0hfN0VNX18gfHwgKF9f QVJNX0FSQ0ggPiA3ICYmICFfX0FSTV9BUkNIX0lTQV9BUk0pKSBcCisgJiYgKCgoX19BUk1fQVJD SF82S19fIHx8IF9fQVJNX0FSQ0hfNktaX18gfHwgX19BUk1fQVJDSF82WktfXykgJiYgIV9fdGh1 bWJfXykgXAorIHx8IF9fQVJNX0FSQ0hfN0FfXyB8fCBfX0FSTV9BUkNIXzdSX18gfHwgX19BUk1f QVJDSCA+PSA3KQogI2Vsc2UKIAkuYWxpZ24gMgogMToJLndvcmQgX19hX2dldHRwX3B0ciAtIDJi CmRpZmYgLS1naXQgYS9zcmMvcHJvY2Vzcy9hcm0vdmZvcmsucyBiL3NyYy9wcm9jZXNzL2FybS92 Zm9yay5zCmluZGV4IGQ3ZWM0MWIzLi5iNmYwMjYwZSAxMDA2NDQKLS0tIGEvc3JjL3Byb2Nlc3Mv YXJtL3Zmb3JrLnMKKysrIGIvc3JjL3Byb2Nlc3MvYXJtL3Zmb3JrLnMKQEAgLTMsNyArMyw3IEBA CiAudHlwZSB2Zm9yaywlZnVuY3Rpb24KIHZmb3JrOgogCW1vdiBpcCwgcjcKLQltb3YgcjcsIDE5 MAorCW1vdnMgcjcsIDE5MAogCXN2YyAwCiAJbW92IHI3LCBpcAogCS5oaWRkZW4gX19zeXNjYWxs X3JldApkaWZmIC0tZ2l0IGEvc3JjL3NldGptcC9hcm0vbG9uZ2ptcC5TIGIvc3JjL3NldGptcC9h cm0vbG9uZ2ptcC5TCmluZGV4IDhkZjBiODE5Li4wMjQxMDExYSAxMDA2NDQKLS0tIGEvc3JjL3Nl dGptcC9hcm0vbG9uZ2ptcC5TCisrKyBiL3NyYy9zZXRqbXAvYXJtL2xvbmdqbXAuUwpAQCAtNSwx OCArNSwzNiBAQAogLnR5cGUgbG9uZ2ptcCwlZnVuY3Rpb24KIF9sb25nam1wOgogbG9uZ2ptcDoK KyNpZiBkZWZpbmVkKF9fdGh1bWIyX18pICB8fCAgIWRlZmluZWQoX190aHVtYl9fKQogCW1vdiBp cCxyMAogCW1vdnMgcjAscjEKIAltb3ZlcSByMCwjMQogCWxkbWlhIGlwISwge3YxLHYyLHYzLHY0 LHY1LHY2LHNsLGZwfQogCWxkbWlhIGlwISwge3IyLGxyfQogCW1vdiBzcCxyMgotCisjZWxzZQor CW1vdiBpcCxyMAorCW1vdnMgcjAscjEKKwlibmUgNGYKKwltb3ZzIHIwLCMxCis0Ogltb3YgcjEs aXAKKwlhZGRzIHIxLCMxNgorCWxkbWlhIHIxISwge3IyLXI3fQorCW1vdiBscixyNworCW1vdiBz cCxyNgorCW1vdiByMTEscjUKKwltb3YgcjEwLHI0CisJbW92IHI5LHIzCisJbW92IHI4LHIyCisJ bW92IGlwLHIxCisJc3VicyByMSwjNDAKKwlsZG1pYSByMSEsIHtyNC1yN30KKyNlbmRpZgogCWFk ciByMSwxZgogCWxkciByMiwxZgogCWxkciByMSxbcjEscjJdCiAKLSNpZiBfX0FSTV9BUkNIIDwg OAorI2lmICFfX0FSTV9BUkNIXzZNX18gJiYgIV9fQVJNX0FSQ0hfN01fXyAmJiAhX19BUk1fQVJD SF83RU1fXyAmJiBfX0FSTV9BUkNIIDwgOAogCXRzdCByMSwjMHgyNjAKIAliZXEgM2YKIAkvLyBI V0NBUF9BUk1fRlBBCkBAIC0yNCwxNCArNDIsMTUgQEAgbG9uZ2ptcDoKIAliZXEgMmYKIAlsZGMg cDIsIGNyNCwgW2lwXSwgIzQ4CiAjZW5kaWYKLTI6CXRzdCByMSwjMHg0MAorMjoJbW92cyByMiwj MHg0MAorCXRzdCByMSxyMgogCWJlcSAyZgogCS5mcHUgdmZwCiAJdmxkbWlhIGlwISwge2Q4LWQx NX0KIAkuZnB1IHNvZnR2ZnAKIAkuZWFiaV9hdHRyaWJ1dGUgMTAsIDAKIAkuZWFiaV9hdHRyaWJ1 dGUgMjcsIDAKLSNpZiBfX0FSTV9BUkNIIDwgOAorI2lmICFfX0FSTV9BUkNIXzZNX18gJiYgIV9f QVJNX0FSQ0hfN01fXyAmJiAhX19BUk1fQVJDSF83RU1fXyAmJiBfX0FSTV9BUkNIIDwgOAogCS8v IEhXQ0FQX0FSTV9JV01NWFQKIDI6CXRzdCByMSwjMHgyMDAKIAliZXEgM2YKZGlmZiAtLWdpdCBh L3NyYy9zZXRqbXAvYXJtL3NldGptcC5TIGIvc3JjL3NldGptcC9hcm0vc2V0am1wLlMKaW5kZXgg NDU3MzFkMjIuLjk4ZTcxMDY4IDEwMDY0NAotLS0gYS9zcmMvc2V0am1wL2FybS9zZXRqbXAuUwor KysgYi9zcmMvc2V0am1wL2FybS9zZXRqbXAuUwpAQCAtOCwxNyArOCwyOCBAQAogX19zZXRqbXA6 CiBfc2V0am1wOgogc2V0am1wOgorI2lmIGRlZmluZWQoX190aHVtYjJfXykgIHx8ICAhZGVmaW5l ZChfX3RodW1iX18pCiAJbW92IGlwLHIwCiAJc3RtaWEgaXAhLHt2MSx2Mix2Myx2NCx2NSx2Nixz bCxmcH0KIAltb3YgcjIsc3AKIAlzdG1pYSBpcCEse3IyLGxyfQotCW1vdiByMCwjMAotCisjZWxz ZQorCXN0bWlhIHIwISx7cjQtcjd9CisJbW92IHIxLHI4CisJbW92IHIyLHI5CisJbW92IHIzLHIx MAorCW1vdiByNCxyMTEKKwltb3YgcjUsc3AKKwltb3YgcjYsbHIKKwlzdG1pYSByMCEse3IxLXI2 fQorCW1vdiBpcCxyMAorI2VuZGlmCisJbW92cyByMCwjMAogCWFkciByMSwxZgogCWxkciByMiwx ZgogCWxkciByMSxbcjEscjJdCiAKLSNpZiBfX0FSTV9BUkNIIDwgOAorI2lmICFfX0FSTV9BUkNI XzZNX18gJiYgIV9fQVJNX0FSQ0hfN01fXyAmJiAhX19BUk1fQVJDSF83RU1fXyAmJiBfX0FSTV9B UkNIIDwgOAogCXRzdCByMSwjMHgyNjAKIAliZXEgM2YKIAkvLyBIV0NBUF9BUk1fRlBBCkBAIC0y NiwxNCArMzcsMTUgQEAgc2V0am1wOgogCWJlcSAyZgogCXN0YyBwMiwgY3I0LCBbaXBdLCAjNDgK ICNlbmRpZgotMjoJdHN0IHIxLCMweDQwCisyOgltb3ZzIHIyLCMweDQwCisJdHN0IHIxLHIyCiAJ YmVxIDJmCiAJLmZwdSB2ZnAKIAl2c3RtaWEgaXAhLCB7ZDgtZDE1fQogCS5mcHUgc29mdHZmcAog CS5lYWJpX2F0dHJpYnV0ZSAxMCwgMAogCS5lYWJpX2F0dHJpYnV0ZSAyNywgMAotI2lmIF9fQVJN X0FSQ0ggPCA4CisjaWYgIV9fQVJNX0FSQ0hfNk1fXyAmJiAhX19BUk1fQVJDSF83TV9fICYmICFf X0FSTV9BUkNIXzdFTV9fICYmIF9fQVJNX0FSQ0ggPCA4CiAJLy8gSFdDQVBfQVJNX0lXTU1YVAog MjoJdHN0IHIxLCMweDIwMAogCWJlcSAzZgpkaWZmIC0tZ2l0IGEvc3JjL3NpZ25hbC9hcm0vcmVz dG9yZS5zIGIvc3JjL3NpZ25hbC9hcm0vcmVzdG9yZS5zCmluZGV4IGZiMDg2ZDliLi4yYjc2MjFi MSAxMDA2NDQKLS0tIGEvc3JjL3NpZ25hbC9hcm0vcmVzdG9yZS5zCisrKyBiL3NyYy9zaWduYWwv YXJtL3Jlc3RvcmUucwpAQCAtNCwxMiArNCwxMiBAQAogLmhpZGRlbiBfX3Jlc3RvcmUKIC50eXBl IF9fcmVzdG9yZSwlZnVuY3Rpb24KIF9fcmVzdG9yZToKLQltb3YgcjcsIzExOQorCW1vdnMgcjcs IzExOQogCXN3aSAweDAKIAogLmdsb2JhbCBfX3Jlc3RvcmVfcnQKIC5oaWRkZW4gX19yZXN0b3Jl X3J0CiAudHlwZSBfX3Jlc3RvcmVfcnQsJWZ1bmN0aW9uCiBfX3Jlc3RvcmVfcnQ6Ci0JbW92IHI3 LCMxNzMKKwltb3ZzIHI3LCMxNzMKIAlzd2kgMHgwCmRpZmYgLS1naXQgYS9zcmMvc2lnbmFsL2Fy bS9zaWdzZXRqbXAucyBiL3NyYy9zaWduYWwvYXJtL3NpZ3NldGptcC5zCmluZGV4IDY5ZWJiZjQ5 Li40OGViZTdjYiAxMDA2NDQKLS0tIGEvc3JjL3NpZ25hbC9hcm0vc2lnc2V0am1wLnMKKysrIGIv c3JjL3NpZ25hbC9hcm0vc2lnc2V0am1wLnMKQEAgLTksMTYgKzksMjYgQEAgX19zaWdzZXRqbXA6 CiAJYm5lIDFmCiAJYiBzZXRqbXAKIAotMToJc3RyIGxyLFtyMCwjMjU2XQotCXN0ciByNCxbcjAs IzI2MCs4XQorMToJbW92IGlwLHIyCisJbW92IHIyLGxyCisJYWRkcyByMCwjMjAwCisJc3RyIHIy LFtyMCwjNTZdCisJc3RyIHI0LFtyMCwjNjArOF0KKwlzdWJzIHIwLCMyMDAKKwltb3YgcjIsaXAK IAltb3YgcjQscjAKIAogCWJsIHNldGptcAogCiAJbW92IHIxLHIwCiAJbW92IHIwLHI0Ci0JbGRy IGxyLFtyMCwjMjU2XQotCWxkciByNCxbcjAsIzI2MCs4XQorCW1vdiBpcCxyMgorCWFkZHMgcjAs IzIwMAorCWxkciByMixbcjAsIzU2XQorCW1vdiBscixyMgorCWxkciByNCxbcjAsIzYwKzhdCisJ c3VicyByMCwjMjAwCisJbW92IHIyLGlwCiAKIC5oaWRkZW4gX19zaWdzZXRqbXBfdGFpbAogCWIg X19zaWdzZXRqbXBfdGFpbApkaWZmIC0tZ2l0IGEvc3JjL3RocmVhZC9hcm0vX19zZXRfdGhyZWFk X2FyZWEuYyBiL3NyYy90aHJlYWQvYXJtL19fc2V0X3RocmVhZF9hcmVhLmMKaW5kZXggMDlkZTY1 YWEuLmFkY2NkMmNlIDEwMDY0NAotLS0gYS9zcmMvdGhyZWFkL2FybS9fX3NldF90aHJlYWRfYXJl YS5jCisrKyBiL3NyYy90aHJlYWQvYXJtL19fc2V0X3RocmVhZF9hcmVhLmMKQEAgLTgsNyArOCw3 IEBACiBleHRlcm4gaGlkZGVuIGNvbnN0IHVuc2lnbmVkIGNoYXIKIAlfX2FfYmFycmllcl9vbGRr dXNlcltdLCBfX2FfYmFycmllcl92NltdLCBfX2FfYmFycmllcl92N1tdLAogCV9fYV9jYXNfdjZb XSwgX19hX2Nhc192N1tdLAotCV9fYV9nZXR0cF9jcDE1W107CisJX19hX2dldHRwX2NwMTVbXSwg X19hX2dldHRwX3N5c2NhbGxbXTsKIAogI2RlZmluZSBfX2FfYmFycmllcl9rdXNlciAweGZmZmYw ZmEwCiAjZGVmaW5lIF9fYV9iYXJyaWVyX29sZGt1c2VyICh1aW50cHRyX3QpX19hX2JhcnJpZXJf b2xka3VzZXIKQEAgLTI2LDcgKzI2LDEzIEBAIGV4dGVybiBoaWRkZW4gdWludHB0cl90IF9fYV9i YXJyaWVyX3B0ciwgX19hX2Nhc19wdHIsIF9fYV9nZXR0cF9wdHI7CiAKIGludCBfX3NldF90aHJl YWRfYXJlYSh2b2lkICpwKQogewotI2lmICFfX0FSTV9BUkNIXzdBX18gJiYgIV9fQVJNX0FSQ0hf N1JfXyAmJiBfX0FSTV9BUkNIIDwgNworI2lmIF9fQVJNX0FSQ0hfNk1fXyB8fCBfX0FSTV9BUkNI XzdNX18gfHwgX19BUk1fQVJDSF83RU1fXyB8fCAoX19BUk1fQVJDSCA+IDcgJiYgIV9fQVJNX0FS Q0hfSVNBX0FSTSkKKwlpZiAoX19od2NhcCAmIEhXQ0FQX1RMUykgeworCQlfX2FfZ2V0dHBfcHRy ID0gX19hX2dldHRwX3N5c2NhbGw7CisJfSBlbHNlIHsKKwkJYV9jcmFzaCgpOworCX0KKyNlbGlm ICFfX0FSTV9BUkNIXzdBX18gJiYgIV9fQVJNX0FSQ0hfN1JfXyAmJiBfX0FSTV9BUkNIIDwgNwog CWlmIChfX2h3Y2FwICYgSFdDQVBfVExTKSB7CiAJCXNpemVfdCAqYXV4OwogCQlfX2FfY2FzX3B0 ciA9IF9fYV9jYXNfdjc7CmRpZmYgLS1naXQgYS9zcmMvdGhyZWFkL2FybS9fX3VubWFwc2VsZi5z IGIvc3JjL3RocmVhZC9hcm0vX191bm1hcHNlbGYucwppbmRleCAyOWMyZDA3Yi4uZmUwNDA2ZTMg MTAwNjQ0Ci0tLSBhL3NyYy90aHJlYWQvYXJtL19fdW5tYXBzZWxmLnMKKysrIGIvc3JjL3RocmVh ZC9hcm0vX191bm1hcHNlbGYucwpAQCAtMyw3ICszLDcgQEAKIC5nbG9iYWwgX191bm1hcHNlbGYK IC50eXBlICAgX191bm1hcHNlbGYsJWZ1bmN0aW9uCiBfX3VubWFwc2VsZjoKLQltb3YgcjcsIzkx CisJbW92cyByNywjOTEKIAlzdmMgMAotCW1vdiByNywjMQorCW1vdnMgcjcsIzEKIAlzdmMgMApk aWZmIC0tZ2l0IGEvc3JjL3RocmVhZC9hcm0vYXRvbWljcy5zIGIvc3JjL3RocmVhZC9hcm0vYXRv bWljcy5zCmluZGV4IGRhNTA1MDhkLi5hZjNiNjBhMiAxMDA2NDQKLS0tIGEvc3JjL3RocmVhZC9h cm0vYXRvbWljcy5zCisrKyBiL3NyYy90aHJlYWQvYXJtL2F0b21pY3MucwpAQCAtNywxMCArNywz NSBAQAogX19hX2JhcnJpZXJfZHVtbXk6CiAJYnggbHIKIAorLmdsb2JhbCBfX2FfY2FzX2R1bW15 CisuaGlkZGVuIF9fYV9jYXNfZHVtbXkKKy50eXBlIF9fYV9jYXNfZHVtbXksJWZ1bmN0aW9uCitf X2FfY2FzX2R1bW15OgorCW1vdiByMyxyMAorCWxkciByMCxbcjJdCisJc3VicyByMCxyMyxyMAor CWJuZSAxZgorCXN0ciByMSxbcjJdCisxOglieCBscgorCisuZ2xvYmFsIF9fYV9nZXR0cF9jcDE1 CisuaGlkZGVuIF9fYV9nZXR0cF9jcDE1CisudHlwZSBfX2FfZ2V0dHBfY3AxNSwlZnVuY3Rpb24K K19fYV9nZXR0cF9zeXNjYWxsOgorCXB1c2gge3I3fQorCW1vdnMgcjcsIzB4ZgorCWxzbHMgcjcs cjcsIzE2CisJYWRkcyByNywjNiAgICAgICAgICAvKiBBUk0gZ2V0X3RscyBzeXNjYWxsICgweGYw MDA2KSAqLworCXN2YyAwCisJcG9wIHtyN30KKwlieCBscgorCiAuZ2xvYmFsIF9fYV9iYXJyaWVy X29sZGt1c2VyCiAuaGlkZGVuIF9fYV9iYXJyaWVyX29sZGt1c2VyCiAudHlwZSBfX2FfYmFycmll cl9vbGRrdXNlciwlZnVuY3Rpb24KIF9fYV9iYXJyaWVyX29sZGt1c2VyOgorCS5hcmNoIGFybXY2 CisJLmFybQogCXB1c2gge3IwLHIxLHIyLHIzLGlwLGxyfQogCW1vdiByMSxyMAogCW1vdiByMixz cApAQCAtMzYsMTYgKzYxLDYgQEAgX19hX2JhcnJpZXJfdjc6CiAJZG1iIGlzaAogCWJ4IGxyCiAK LS5nbG9iYWwgX19hX2Nhc19kdW1teQotLmhpZGRlbiBfX2FfY2FzX2R1bW15Ci0udHlwZSBfX2Ff Y2FzX2R1bW15LCVmdW5jdGlvbgotX19hX2Nhc19kdW1teToKLQltb3YgcjMscjAKLQlsZHIgcjAs W3IyXQotCXN1YnMgcjAscjMscjAKLQlzdHJlcSByMSxbcjJdCi0JYnggbHIKLQogLmdsb2JhbCBf X2FfY2FzX3Y2CiAuaGlkZGVuIF9fYV9jYXNfdjYKIC50eXBlIF9fYV9jYXNfdjYsJWZ1bmN0aW9u CkBAIC04MCw2ICs5NSw4IEBAIF9fYV9jYXNfdjc6CiAuaGlkZGVuIF9fYV9nZXR0cF9jcDE1CiAu dHlwZSBfX2FfZ2V0dHBfY3AxNSwlZnVuY3Rpb24KIF9fYV9nZXR0cF9jcDE1OgorCS5hcmNoIGFy bXY2CisJLmFybQogCW1yYyBwMTUsMCxyMCxjMTMsYzAsMwogCWJ4IGxyCiAKZGlmZiAtLWdpdCBh L3NyYy90aHJlYWQvYXJtL2Nsb25lLnMgYi9zcmMvdGhyZWFkL2FybS9jbG9uZS5zCmluZGV4IGJi MDk2NWRhLi4zM2MyZTU5YiAxMDA2NDQKLS0tIGEvc3JjL3RocmVhZC9hcm0vY2xvbmUucworKysg Yi9zcmMvdGhyZWFkL2FybS9jbG9uZS5zCkBAIC00LDI0ICs0LDI2IEBACiAuaGlkZGVuIF9fY2xv bmUKIC50eXBlICAgX19jbG9uZSwlZnVuY3Rpb24KIF9fY2xvbmU6Ci0Jc3RtZmQgc3AhLHtyNCxy NSxyNixyN30KLQltb3YgcjcsIzEyMAorCXB1c2gge3I0LHI1LHI2LHI3fQorCW1vdnMgcjcsIzEy MAogCW1vdiByNixyMwogCW1vdiByNSxyMAogCW1vdiByMCxyMgotCWFuZCByMSxyMSwjLTE2CisJ bW92cyByMiwjMAorCXN1YnMgcjIsIzE2CisJYW5kcyByMSxyMgogCWxkciByMixbc3AsIzE2XQog CWxkciByMyxbc3AsIzIwXQogCWxkciByNCxbc3AsIzI0XQogCXN2YyAwCiAJdHN0IHIwLHIwCiAJ YmVxIDFmCi0JbGRtZmQgc3AhLHtyNCxyNSxyNixyN30KKwlwb3Age3I0LHI1LHI2LHI3fQogCWJ4 IGxyCiAKIDE6CW1vdiByMCxyNgogCWJsIDNmCi0yOgltb3YgcjcsIzEKKzI6CW1vdnMgcjcsIzEK IAlzdmMgMAogCWIgMmIKIApkaWZmIC0tZ2l0IGEvc3JjL3RocmVhZC9hcm0vc3lzY2FsbF9jcC5z IGIvc3JjL3RocmVhZC9hcm0vc3lzY2FsbF9jcC5zCmluZGV4IGU2MDdkZDQyLi40MjFlNjRmNCAx MDA2NDQKLS0tIGEvc3JjL3RocmVhZC9hcm0vc3lzY2FsbF9jcC5zCisrKyBiL3NyYy90aHJlYWQv YXJtL3N5c2NhbGxfY3AucwpAQCAtMTEsNyArMTEsNyBAQAogLnR5cGUgX19zeXNjYWxsX2NwX2Fz bSwlZnVuY3Rpb24KIF9fc3lzY2FsbF9jcF9hc206CiAJbW92IGlwLHNwCi0Jc3RtZmQgc3AhLHty NCxyNSxyNixyN30KKwlwdXNoIHtyNCxyNSxyNixyN30KIF9fY3BfYmVnaW46CiAJbGRyIHIwLFty MF0KIAljbXAgcjAsIzAKQEAgLTE5LDExICsxOSwxMiBAQCBfX2NwX2JlZ2luOgogCW1vdiByNyxy MQogCW1vdiByMCxyMgogCW1vdiByMSxyMwotCWxkbWZkIGlwLHtyMixyMyxyNCxyNSxyNn0KKwlt b3YgcjIsaXAKKwlsZG1mZCByMix7cjIscjMscjQscjUscjZ9CiAJc3ZjIDAKIF9fY3BfZW5kOgot CWxkbWZkIHNwISx7cjQscjUscjYscjd9CisJcG9wIHtyNCxyNSxyNixyN30KIAlieCBscgogX19j cF9jYW5jZWw6Ci0JbGRtZmQgc3AhLHtyNCxyNSxyNixyN30KKwlwb3Age3I0LHI1LHI2LHI3fQog CWIgX19jYW5jZWwK --0000000000009c8b0b05b6b7df0c--