Re: Linux 4.10-rc1
On Mon, Dec 26, 2016 at 02:23:43PM +, Al Viro wrote: > On Mon, Dec 26, 2016 at 05:45:10PM +0800, Hanjun Guo wrote: > > On 2016/12/26 17:18, Al Viro wrote: > > > On Mon, Dec 26, 2016 at 05:05:37PM +0800, Kefeng Wang wrote: > > >> It looks like we need revert the changes from assembly files. > > > > I tested Kefeng's patch and works. more comments below. > > > > > Better yet, split the damn thing in two and include the asm-only part. > > > > split will cause other places for building errors, because there is no > > > > -#ifndef __ASSEMBLY__ > > Huh? It's included only from assembler files, so what would use the other > parts? FWIW, my arguments for splitting it are * asm and non-asm parts have almost no overlap - only uaccess_{en,dis}able_not_uao (as asm macro and static inline resp.), but that's it. It's not as if there had been arseloads of constants shared between C and assembler, etc. * having no asm/uaccess.h includes left allows to consolidate stuff into linux/uaccess.h; sure, in this case the stuff getting moved there would be under ifndef anyway, but "no includes outside of linux/uaccess.h" is easier to verify than "no includes outside of linux/uaccess.h and arch/arm64/.../*.S" I can live with reverting those several includes to asm/uaccess.h (all interesting stuff is under that ifndef), but I think splitting the asm part away would be cleaner. PS: if that variant does cause any build errors, I would very much like to see .config. Hanjun, could you post one that is triggering those?
Re: Linux 4.10-rc1
On Mon, Dec 26, 2016 at 05:45:10PM +0800, Hanjun Guo wrote: > On 2016/12/26 17:18, Al Viro wrote: > > On Mon, Dec 26, 2016 at 05:05:37PM +0800, Kefeng Wang wrote: > >> It looks like we need revert the changes from assembly files. > > I tested Kefeng's patch and works. more comments below. > > > Better yet, split the damn thing in two and include the asm-only part. > > split will cause other places for building errors, because there is no > > -#ifndef __ASSEMBLY__ Huh? It's included only from assembler files, so what would use the other parts?
Re: Linux 4.10-rc1
On 2016/12/26 17:18, Al Viro wrote: > On Mon, Dec 26, 2016 at 05:05:37PM +0800, Kefeng Wang wrote: >> It looks like we need revert the changes from assembly files. I tested Kefeng's patch and works. more comments below. > Better yet, split the damn thing in two and include the asm-only part. split will cause other places for building errors, because there is no -#ifndef __ASSEMBLY__ in the file. > >> diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S >> diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S > Missed those two... OK, how about this? > > arm64: don't pull uaccess.h into *.S > > Split asm-only parts of arm64 uaccess.h into a new header and use that > from *.S. > > Signed-off-by: Al Viro > > diff --git a/arch/arm64/include/asm/asm-uaccess.h > b/arch/arm64/include/asm/asm-uaccess.h > new file mode 100644 > index ..df411f3e083c > --- /dev/null > +++ b/arch/arm64/include/asm/asm-uaccess.h > @@ -0,0 +1,65 @@ > +#ifndef __ASM_ASM_UACCESS_H > +#define __ASM_ASM_UACCESS_H > + > +#include > +#include > +#include > +#include > + > +/* > + * User access enabling/disabling macros. > + */ > +#ifdef CONFIG_ARM64_SW_TTBR0_PAN > + .macro __uaccess_ttbr0_disable, tmp1 > + mrs \tmp1, ttbr1_el1// swapper_pg_dir > + add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of > swapper_pg_dir > + msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 > + isb > + .endm > + > + .macro __uaccess_ttbr0_enable, tmp1 > + get_thread_info \tmp1 > + ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 > + msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 > + isb > + .endm > + > + .macro uaccess_ttbr0_disable, tmp1 > +alternative_if_not ARM64_HAS_PAN > + __uaccess_ttbr0_disable \tmp1 > +alternative_else_nop_endif > + .endm > + > + .macro uaccess_ttbr0_enable, tmp1, tmp2 > +alternative_if_not ARM64_HAS_PAN > + save_and_disable_irq \tmp2 // avoid preemption > + __uaccess_ttbr0_enable \tmp1 > + restore_irq \tmp2 > +alternative_else_nop_endif > + .endm > +#else > + .macro uaccess_ttbr0_disable, tmp1 > + .endm > + > + .macro uaccess_ttbr0_enable, tmp1, tmp2 > + .endm > +#endif > + > +/* > + * These macros are no-ops when UAO is present. > + */ > + .macro uaccess_disable_not_uao, tmp1 > + uaccess_ttbr0_disable \tmp1 > +alternative_if ARM64_ALT_PAN_NOT_UAO > + SET_PSTATE_PAN(1) > +alternative_else_nop_endif > + .endm > + > + .macro uaccess_enable_not_uao, tmp1, tmp2 > + uaccess_ttbr0_enable \tmp1, \tmp2 > +alternative_if ARM64_ALT_PAN_NOT_UAO > + SET_PSTATE_PAN(0) > +alternative_else_nop_endif > + .endm > + > +#endif > diff --git a/arch/arm64/include/asm/uaccess.h > b/arch/arm64/include/asm/uaccess.h > index d26750ca6e06..46da3ea638bb 100644 > --- a/arch/arm64/include/asm/uaccess.h > +++ b/arch/arm64/include/asm/uaccess.h > @@ -22,8 +22,6 @@ > #include > #include > > -#ifndef __ASSEMBLY__ > - > /* > * User space memory access functions > */ > @@ -424,66 +422,4 @@ extern long strncpy_from_user(char *dest, const char > __user *src, long count); > extern __must_check long strlen_user(const char __user *str); > extern __must_check long strnlen_user(const char __user *str, long n); > > -#else/* __ASSEMBLY__ */ > - > -#include > - > -/* > - * User access enabling/disabling macros. > - */ > -#ifdef CONFIG_ARM64_SW_TTBR0_PAN > - .macro __uaccess_ttbr0_disable, tmp1 > - mrs \tmp1, ttbr1_el1// swapper_pg_dir > - add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of > swapper_pg_dir > - msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 > - isb > - .endm > - > - .macro __uaccess_ttbr0_enable, tmp1 > - get_thread_info \tmp1 > - ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 > - msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 > - isb > - .endm > - > - .macro uaccess_ttbr0_disable, tmp1 > -alternative_if_not ARM64_HAS_PAN > - __uaccess_ttbr0_disable \tmp1 > -alternative_else_nop_endif > - .endm > - > - .macro uaccess_ttbr0_enable, tmp1, tmp2 > -alternative_if_not ARM64_HAS_PAN > - save_and_disable_irq \tmp2 // avoid preemption > - __uaccess_ttbr0_enable \tmp1 > - restore_irq \tmp2 > -alternative_else_nop_endif > - .endm > -#else > - .macro uaccess_ttbr0_disable, tmp1 > - .endm > - > - .macro uaccess_ttbr0_enable, tmp1, tmp2 > - .endm > -#endif > - > -/* > - * These macros are no-ops when UAO is present. > - */ > - .macro uaccess_disable_not_uao, tmp1 > - uaccess_ttbr0_disable \tmp1 > -alternative_if ARM64_ALT_PAN_NOT_UAO > - SET_PSTATE_PAN(1) > -alternative_else_nop_endif > - .endm > - > - .macro uaccess_enable_not_uao, tmp
Re: Linux 4.10-rc1
On 2016/12/26 17:18, Al Viro wrote: > On Mon, Dec 26, 2016 at 05:05:37PM +0800, Kefeng Wang wrote: >> It looks like we need revert the changes from assembly files. > Better yet, split the damn thing in two and include the asm-only part. > >> diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S >> diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S > Missed those two... OK, how about this? It happens some where else, ./include/asm-generic/rwsem.h:48: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/rwsem.h:49: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/rwsem.h:50: Error: unknown mnemonic `return' -- `return 0' ./include/asm-generic/rwsem.h:51: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/rwsem.h:56: Error: unknown mnemonic `static' -- `static inline void __down_write(struct rw_semaphore*sem)' ./include/asm-generic/rwsem.h:57: Error: junk at end of line, first unrecognized character is `{' ./include/asm-generic/rwsem.h:58: Error: unknown mnemonic `long' -- `long tmp' ./include/asm-generic/rwsem.h:60: Error: junk at end of line, first unrecognized character is `(' ./include/asm-generic/rwsem.h:61: Error: junk at end of line, first unrecognized character is `(' ./include/asm-generic/rwsem.h:62: Error: unknown mnemonic `if' -- `if (unlikely(tmp!=((-0xL-1)+0x0001L)))' ./include/asm-generic/rwsem.h:63: Error: unknown mnemonic `rwsem_down_write_failed' -- `rwsem_down_write_failed(sem)' ./include/asm-generic/rwsem.h:64: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/rwsem.h:66: Error: unknown mnemonic `static' -- `static inline int __down_write_killable(struct rw_semaphore*sem)' ./include/asm-generic/rwsem.h:67: Error: junk at end of line, first unrecognized character is `{' ./include/asm-generic/rwsem.h:68: Error: unknown mnemonic `long' -- `long tmp' ./include/asm-generic/rwsem.h:70: Error: junk at end of line, first unrecognized character is `(' ./include/asm-generic/rwsem.h:71: Error: junk at end of line, first unrecognized character is `(' ./include/asm-generic/rwsem.h:72: Error: unknown mnemonic `if' -- `if (unlikely(tmp!=((-0xL-1)+0x0001L)))' ./include/asm-generic/rwsem.h:73: Error: unknown mnemonic `if' -- `if (IS_ERR(rwsem_down_write_failed_killable(sem)))' ./include/asm-generic/rwsem.h:74: Error: unknown mnemonic `return' -- `return -4' ./include/asm-generic/rwsem.h:75: Error: unknown mnemonic `return' -- `return 0' ./include/asm-generic/rwsem.h:76: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/rwsem.h:78: Error: unknown mnemonic `static' -- `static inline int __down_write_trylock(struct rw_semaphore*sem)' ./include/asm-generic/rwsem.h:79: Error: junk at end of line, first unrecognized character is `{' ./include/linux/highuid.h:34: Error: unknown mnemonic `extern' -- `extern int overflowuid' ./include/linux/highuid.h:35: Error: unknown mnemonic `extern' -- `extern int overflowgid' ./include/linux/highuid.h:37: Error: unknown mnemonic `extern' -- `extern void __bad_uid(void)' ./include/linux/uidgid.h:21: Error: unknown mnemonic `uid_t' -- `uid_t val' ./include/linux/uidgid.h:22: Error: junk at end of line, first unrecognized character is `}' ./include/linux/uidgid.h:25: Error: unknown mnemonic `typedef' -- `typedef struct{' ./include/linux/uidgid.h:26: Error: unknown mnemonic `gid_t' -- `gid_t val' ./include/linux/uidgid.h:27: Error: junk at end of line, first unrecognized character is `}' ./include/uapi/linux/sysctl.h:34: Error: unknown mnemonic `struct' -- `struct __sysctl_args{' ./include/uapi/linux/sysctl.h:35: Error: unknown mnemonic `int' -- `int __user*name' ./include/uapi/linux/sysctl.h:36: Error: unknown mnemonic `int' -- `int nlen' ./include/uapi/linux/sysctl.h:37: Error: unknown mnemonic `void' -- `void __user*oldval' Thanks Hanjun > > arm64: don't pull uaccess.h into *.S > > Split asm-only parts of arm64 uaccess.h into a new header and use that > from *.S. > > Signed-off-by: Al Viro > > diff --git a/arch/arm64/include/asm/asm-uaccess.h > b/arch/arm64/include/asm/asm-uaccess.h > new file mode 100644 > index ..df411f3e083c > --- /dev/null > +++ b/arch/arm64/include/asm/asm-uaccess.h > @@ -0,0 +1,65 @@ > +#ifndef __ASM_ASM_UACCESS_H > +#define __ASM_ASM_UACCESS_H > + > +#include > +#include > +#include > +#include > + > +/* > + * User access enabling/disabling macros. > + */ > +#ifdef CONFIG_ARM64_SW_TTBR0_PAN > + .macro __uaccess_ttbr0_disable, tmp1 > + mrs \tmp1, ttbr1_el1// swapper_pg_dir > + add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of > swapper_pg_dir > + msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 > + isb > + .endm > + > + .macro __uaccess_ttbr0_enable, tmp1 > + get_thread_info \tmp1 > +
Re: Linux 4.10-rc1
On Mon, Dec 26, 2016 at 05:05:37PM +0800, Kefeng Wang wrote: > It looks like we need revert the changes from assembly files. Better yet, split the damn thing in two and include the asm-only part. > diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S > diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S Missed those two... OK, how about this? arm64: don't pull uaccess.h into *.S Split asm-only parts of arm64 uaccess.h into a new header and use that from *.S. Signed-off-by: Al Viro diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h new file mode 100644 index ..df411f3e083c --- /dev/null +++ b/arch/arm64/include/asm/asm-uaccess.h @@ -0,0 +1,65 @@ +#ifndef __ASM_ASM_UACCESS_H +#define __ASM_ASM_UACCESS_H + +#include +#include +#include +#include + +/* + * User access enabling/disabling macros. + */ +#ifdef CONFIG_ARM64_SW_TTBR0_PAN + .macro __uaccess_ttbr0_disable, tmp1 + mrs \tmp1, ttbr1_el1// swapper_pg_dir + add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir + msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 + isb + .endm + + .macro __uaccess_ttbr0_enable, tmp1 + get_thread_info \tmp1 + ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 + msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 + isb + .endm + + .macro uaccess_ttbr0_disable, tmp1 +alternative_if_not ARM64_HAS_PAN + __uaccess_ttbr0_disable \tmp1 +alternative_else_nop_endif + .endm + + .macro uaccess_ttbr0_enable, tmp1, tmp2 +alternative_if_not ARM64_HAS_PAN + save_and_disable_irq \tmp2 // avoid preemption + __uaccess_ttbr0_enable \tmp1 + restore_irq \tmp2 +alternative_else_nop_endif + .endm +#else + .macro uaccess_ttbr0_disable, tmp1 + .endm + + .macro uaccess_ttbr0_enable, tmp1, tmp2 + .endm +#endif + +/* + * These macros are no-ops when UAO is present. + */ + .macro uaccess_disable_not_uao, tmp1 + uaccess_ttbr0_disable \tmp1 +alternative_if ARM64_ALT_PAN_NOT_UAO + SET_PSTATE_PAN(1) +alternative_else_nop_endif + .endm + + .macro uaccess_enable_not_uao, tmp1, tmp2 + uaccess_ttbr0_enable \tmp1, \tmp2 +alternative_if ARM64_ALT_PAN_NOT_UAO + SET_PSTATE_PAN(0) +alternative_else_nop_endif + .endm + +#endif diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h index d26750ca6e06..46da3ea638bb 100644 --- a/arch/arm64/include/asm/uaccess.h +++ b/arch/arm64/include/asm/uaccess.h @@ -22,8 +22,6 @@ #include #include -#ifndef __ASSEMBLY__ - /* * User space memory access functions */ @@ -424,66 +422,4 @@ extern long strncpy_from_user(char *dest, const char __user *src, long count); extern __must_check long strlen_user(const char __user *str); extern __must_check long strnlen_user(const char __user *str, long n); -#else /* __ASSEMBLY__ */ - -#include - -/* - * User access enabling/disabling macros. - */ -#ifdef CONFIG_ARM64_SW_TTBR0_PAN - .macro __uaccess_ttbr0_disable, tmp1 - mrs \tmp1, ttbr1_el1// swapper_pg_dir - add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir - msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 - isb - .endm - - .macro __uaccess_ttbr0_enable, tmp1 - get_thread_info \tmp1 - ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 - msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 - isb - .endm - - .macro uaccess_ttbr0_disable, tmp1 -alternative_if_not ARM64_HAS_PAN - __uaccess_ttbr0_disable \tmp1 -alternative_else_nop_endif - .endm - - .macro uaccess_ttbr0_enable, tmp1, tmp2 -alternative_if_not ARM64_HAS_PAN - save_and_disable_irq \tmp2 // avoid preemption - __uaccess_ttbr0_enable \tmp1 - restore_irq \tmp2 -alternative_else_nop_endif - .endm -#else - .macro uaccess_ttbr0_disable, tmp1 - .endm - - .macro uaccess_ttbr0_enable, tmp1, tmp2 - .endm -#endif - -/* - * These macros are no-ops when UAO is present. - */ - .macro uaccess_disable_not_uao, tmp1 - uaccess_ttbr0_disable \tmp1 -alternative_if ARM64_ALT_PAN_NOT_UAO - SET_PSTATE_PAN(1) -alternative_else_nop_endif - .endm - - .macro uaccess_enable_not_uao, tmp1, tmp2 - uaccess_ttbr0_enable \tmp1, \tmp2 -alternative_if ARM64_ALT_PAN_NOT_UAO - SET_PSTATE_PAN(0) -alternative_else_nop_endif - .endm - -#endif /* __ASSEMBLY__ */ - #endif /* __ASM_UACCESS_H */ diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S index add4a1334085..e88fb99c1561 100644 --- a/arch/arm64/lib/clear_user.S +++ b/arch/arm64/lib/clear_user.S @@ -17,7
Re: Linux 4.10-rc1
On Mon, Dec 26, 2016 at 04:38:13PM +0800, Hanjun Guo wrote: > ./include/asm-generic/atomic-long.h:23: Error: unknown mnemonic `typedef' -- > `typedef atomic64_t atomic_long_t' *blink* OK, I see what has happened here - it's "arm64: Factor out PAN enabling/disabling into separate uaccess_* macros" that went in during this window, adding an include of asm/uaccess.h into several assembler files. AFAICS, the easiest way to deal with that is to separate for-asm parts of uaccess.h into a new header and use _that_ from *.S, as in (completely untested) diff below. Seeing that there's basically no overlap between the __ASSEMBLY__ and normal parts of arm64 uaccess.h, that would seem to be a fairly obvious solution... Objections? diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h new file mode 100644 index ..df411f3e083c --- /dev/null +++ b/arch/arm64/include/asm/asm-uaccess.h @@ -0,0 +1,65 @@ +#ifndef __ASM_ASM_UACCESS_H +#define __ASM_ASM_UACCESS_H + +#include +#include +#include +#include + +/* + * User access enabling/disabling macros. + */ +#ifdef CONFIG_ARM64_SW_TTBR0_PAN + .macro __uaccess_ttbr0_disable, tmp1 + mrs \tmp1, ttbr1_el1// swapper_pg_dir + add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir + msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 + isb + .endm + + .macro __uaccess_ttbr0_enable, tmp1 + get_thread_info \tmp1 + ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 + msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 + isb + .endm + + .macro uaccess_ttbr0_disable, tmp1 +alternative_if_not ARM64_HAS_PAN + __uaccess_ttbr0_disable \tmp1 +alternative_else_nop_endif + .endm + + .macro uaccess_ttbr0_enable, tmp1, tmp2 +alternative_if_not ARM64_HAS_PAN + save_and_disable_irq \tmp2 // avoid preemption + __uaccess_ttbr0_enable \tmp1 + restore_irq \tmp2 +alternative_else_nop_endif + .endm +#else + .macro uaccess_ttbr0_disable, tmp1 + .endm + + .macro uaccess_ttbr0_enable, tmp1, tmp2 + .endm +#endif + +/* + * These macros are no-ops when UAO is present. + */ + .macro uaccess_disable_not_uao, tmp1 + uaccess_ttbr0_disable \tmp1 +alternative_if ARM64_ALT_PAN_NOT_UAO + SET_PSTATE_PAN(1) +alternative_else_nop_endif + .endm + + .macro uaccess_enable_not_uao, tmp1, tmp2 + uaccess_ttbr0_enable \tmp1, \tmp2 +alternative_if ARM64_ALT_PAN_NOT_UAO + SET_PSTATE_PAN(0) +alternative_else_nop_endif + .endm + +#endif diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h index d26750ca6e06..46da3ea638bb 100644 --- a/arch/arm64/include/asm/uaccess.h +++ b/arch/arm64/include/asm/uaccess.h @@ -22,8 +22,6 @@ #include #include -#ifndef __ASSEMBLY__ - /* * User space memory access functions */ @@ -424,66 +422,4 @@ extern long strncpy_from_user(char *dest, const char __user *src, long count); extern __must_check long strlen_user(const char __user *str); extern __must_check long strnlen_user(const char __user *str, long n); -#else /* __ASSEMBLY__ */ - -#include - -/* - * User access enabling/disabling macros. - */ -#ifdef CONFIG_ARM64_SW_TTBR0_PAN - .macro __uaccess_ttbr0_disable, tmp1 - mrs \tmp1, ttbr1_el1// swapper_pg_dir - add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir - msr ttbr0_el1, \tmp1// set reserved TTBR0_EL1 - isb - .endm - - .macro __uaccess_ttbr0_enable, tmp1 - get_thread_info \tmp1 - ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1 - msr ttbr0_el1, \tmp1// set the non-PAN TTBR0_EL1 - isb - .endm - - .macro uaccess_ttbr0_disable, tmp1 -alternative_if_not ARM64_HAS_PAN - __uaccess_ttbr0_disable \tmp1 -alternative_else_nop_endif - .endm - - .macro uaccess_ttbr0_enable, tmp1, tmp2 -alternative_if_not ARM64_HAS_PAN - save_and_disable_irq \tmp2 // avoid preemption - __uaccess_ttbr0_enable \tmp1 - restore_irq \tmp2 -alternative_else_nop_endif - .endm -#else - .macro uaccess_ttbr0_disable, tmp1 - .endm - - .macro uaccess_ttbr0_enable, tmp1, tmp2 - .endm -#endif - -/* - * These macros are no-ops when UAO is present. - */ - .macro uaccess_disable_not_uao, tmp1 - uaccess_ttbr0_disable \tmp1 -alternative_if ARM64_ALT_PAN_NOT_UAO - SET_PSTATE_PAN(1) -alternative_else_nop_endif - .endm - - .macro uaccess_enable_not_uao, tmp1, tmp2 - uaccess_ttbr0_enable \tmp1, \tmp2 -alternative_if ARM64_ALT_PAN_NOT_UAO - SET_PSTATE_PAN(0) -alternative_else_nop_endif - .endm - -#endif /* __ASSEMBLY__ */ -
Re: Linux 4.10-rc1
On 2016/12/26 16:38, Hanjun Guo wrote: > Hi Linus, > > On 2016/12/26 8:41, Linus Torvalds wrote: >> It's Christmas Day, and it's two weeks since the merge window opened. >> Thus, the merge window is now closed. >> >> I did a few final pulls today, but I also rejected a couple of pulls >> that came in late in the window and looked dodgy. You know who you >> are. >> >> On the whole, this wasn't all that big a release - nothing like 4.9. >> Although it wasn't tiny either. I think 4.7 was smaller. 4.8 might >> have been too. It's xmas day, and right now I can't be arsed to >> actually do the statistics I'd normally do. >> >> Everything looks pretty normal, although we had an unusual amount of >> tree-wide final cleanups in the last days of the merge window. But the >> general statistics look fairly common: a bit over half is drivers, >> maybe slightly less arch updates than normal, and a fair amount of >> documentation updates due to the sphinx conversion. And then the usual >> misc noise all over, although the perf tooling updates do stand out. >> >> The shortlog is much too big, as it always is during the merge window, >> so as usual you just get the merge-log. > > Kejian and I got massive compile error when cross-compile the kernel for > ARM64, such as > > ./include/asm-generic/atomic-long.h:23: Error: unknown mnemonic `typedef' -- > `typedef atomic64_t atomic_long_t' > ./include/asm-generic/atomic-long.h:44: Error: unknown mnemonic `static' -- > `static inline long atomic_long_read(const > atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:44: Error: unknown mnemonic `return' -- > `return (long)READ_ONCE((v)->counter)' > ./include/asm-generic/atomic-long.h:44: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:45: Error: unknown mnemonic `static' -- > `static inline long atomic_long_read_acquire(const > atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:45: Error: unknown mnemonic `return' -- > `return (long)smp_load_acquire(&(v)->counter)' > ./include/asm-generic/atomic-long.h:45: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:56: Error: unknown mnemonic `static' -- > `static inline void atomic_long_set(atomic_long_t*l,long > i){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:56: Error: unknown mnemonic `write_once' > -- `write_once(((v)->counter), (i))' > ./include/asm-generic/atomic-long.h:56: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:57: Error: unknown mnemonic `static' -- > `static inline void atomic_long_set_release(atomic_long_t*l,long > i){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:57: Error: unknown mnemonic > `smp_store_release' -- `smp_store_release(&(v)->counter, (i))' > ./include/asm-generic/atomic-long.h:57: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:69: Error: unknown mnemonic `static' -- > `static inline long atomic_long_add_return(long > i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:69: Error: unknown mnemonic `return' -- > `return (long)atomic64_add_return(i,v)' > ./include/asm-generic/atomic-long.h:69: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:70: Error: unknown mnemonic `static' -- > `static inline long atomic_long_add_return_relaxed(long > i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:70: Error: unknown mnemonic `return' -- > `return (long)atomic64_add_return_relaxed(i,v)' > ./include/asm-generic/atomic-long.h:70: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:71: Error: unknown mnemonic `static' -- > `static inline long atomic_long_add_return_acquire(long > i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:71: Error: unknown mnemonic `return' -- > `return (long)atomic64_add_return_acquire(i,v)' > ./include/asm-generic/atomic-long.h:71: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:72: Error: unknown mnemonic `static' -- > `static inline long atomic_long_add_return_release(long > i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:72: Error: unknown mnemonic `return' -- > `return (long)atomic64_add_return_release(i,v)' > ./include/asm-generic/atomic-long.h:72: Error: junk at end of line, first > unrecognized character is `}' > ./include/asm-generic/atomic-long.h:73: Error: unknown mnemonic `static' -- > `static inline long atomic_long_sub_return(long > i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' > ./include/asm-generic/atomic-long.h:73: Error: unknown mnemonic `return' -- > `return (l
Re: Linux 4.10-rc1
Hi Linus, On 2016/12/26 8:41, Linus Torvalds wrote: > It's Christmas Day, and it's two weeks since the merge window opened. > Thus, the merge window is now closed. > > I did a few final pulls today, but I also rejected a couple of pulls > that came in late in the window and looked dodgy. You know who you > are. > > On the whole, this wasn't all that big a release - nothing like 4.9. > Although it wasn't tiny either. I think 4.7 was smaller. 4.8 might > have been too. It's xmas day, and right now I can't be arsed to > actually do the statistics I'd normally do. > > Everything looks pretty normal, although we had an unusual amount of > tree-wide final cleanups in the last days of the merge window. But the > general statistics look fairly common: a bit over half is drivers, > maybe slightly less arch updates than normal, and a fair amount of > documentation updates due to the sphinx conversion. And then the usual > misc noise all over, although the perf tooling updates do stand out. > > The shortlog is much too big, as it always is during the merge window, > so as usual you just get the merge-log. Kejian and I got massive compile error when cross-compile the kernel for ARM64, such as ./include/asm-generic/atomic-long.h:23: Error: unknown mnemonic `typedef' -- `typedef atomic64_t atomic_long_t' ./include/asm-generic/atomic-long.h:44: Error: unknown mnemonic `static' -- `static inline long atomic_long_read(const atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:44: Error: unknown mnemonic `return' -- `return (long)READ_ONCE((v)->counter)' ./include/asm-generic/atomic-long.h:44: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:45: Error: unknown mnemonic `static' -- `static inline long atomic_long_read_acquire(const atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:45: Error: unknown mnemonic `return' -- `return (long)smp_load_acquire(&(v)->counter)' ./include/asm-generic/atomic-long.h:45: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:56: Error: unknown mnemonic `static' -- `static inline void atomic_long_set(atomic_long_t*l,long i){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:56: Error: unknown mnemonic `write_once' -- `write_once(((v)->counter), (i))' ./include/asm-generic/atomic-long.h:56: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:57: Error: unknown mnemonic `static' -- `static inline void atomic_long_set_release(atomic_long_t*l,long i){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:57: Error: unknown mnemonic `smp_store_release' -- `smp_store_release(&(v)->counter, (i))' ./include/asm-generic/atomic-long.h:57: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:69: Error: unknown mnemonic `static' -- `static inline long atomic_long_add_return(long i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:69: Error: unknown mnemonic `return' -- `return (long)atomic64_add_return(i,v)' ./include/asm-generic/atomic-long.h:69: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:70: Error: unknown mnemonic `static' -- `static inline long atomic_long_add_return_relaxed(long i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:70: Error: unknown mnemonic `return' -- `return (long)atomic64_add_return_relaxed(i,v)' ./include/asm-generic/atomic-long.h:70: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:71: Error: unknown mnemonic `static' -- `static inline long atomic_long_add_return_acquire(long i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:71: Error: unknown mnemonic `return' -- `return (long)atomic64_add_return_acquire(i,v)' ./include/asm-generic/atomic-long.h:71: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:72: Error: unknown mnemonic `static' -- `static inline long atomic_long_add_return_release(long i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:72: Error: unknown mnemonic `return' -- `return (long)atomic64_add_return_release(i,v)' ./include/asm-generic/atomic-long.h:72: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:73: Error: unknown mnemonic `static' -- `static inline long atomic_long_sub_return(long i,atomic_long_t*l){atomic64_t*v=(atomic64_t*)l' ./include/asm-generic/atomic-long.h:73: Error: unknown mnemonic `return' -- `return (long)atomic64_sub_return(i,v)' ./include/asm-generic/atomic-long.h:73: Error: junk at end of line, first unrecognized character is `}' ./include/asm-generic/atomic-long.h:74: Error: unknown mnemonic `st