[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <5731AE2E.2050403@huawei.com>
Date: Tue, 10 May 2016 17:47:26 +0800
From: "Zhangjian (Bamvor)" <bamvor.zhangjian@...wei.com>
To: Arnd Bergmann <arnd@...db.de>,
<linux-arm-kernel@...ts.infradead.org>
CC: Yury Norov <ynorov@...iumnetworks.com>,
<linux-doc@...r.kernel.org>,
Andrew Pinski <Andrew.Pinski@...iumnetworks.com>,
<catalin.marinas@....com>, <heiko.carstens@...ibm.com>,
Hanjun Guo <guohanjun@...wei.com>, <joseph@...esourcery.com>,
<linux-arch@...r.kernel.org>, <linux-s390@...r.kernel.org>,
"jijun (D)" <jijun2@...wei.com>,
<Prasun.Kapoor@...iumnetworks.com>, <schwab@...e.de>,
<agraf@...e.de>, <pinskia@...il.com>, <klimov.linux@...il.com>,
<broonie@...nel.org>, <Nathan_Lynch@...tor.com>,
<linux-kernel@...r.kernel.org>, Andrew Pinski <apinski@...ium.com>,
<schwidefsky@...ibm.com>,
<christoph.muellner@...obroma-systems.com>,
"bamvor >> Zhangjian (Bamvor)" <bamvor.zhangjian@...wei.com>
Subject: Re: [PATCH 20/25] arm64:ilp32: add sys_ilp32.c and a separate table
(in entry.S) to use it
Hi, Arnd
On 2016/5/10 16:36, Arnd Bergmann wrote:
> On Tuesday 10 May 2016 15:42:07 Zhangjian wrote:
>> On 2016/5/6 20:37, Yury Norov wrote:
>>> On Fri, May 06, 2016 at 08:16:48PM +0800, Zhangjian (Bamvor) wrote:
>>>
>>> AFAIR, here we don't shift offset, as it's 64-bit both in user-
>>> and kernel-space,
>> In your ilp32-2.22 branch, you wrapper mmap to mmap2 in which type of
>> offset is off_t. And off_t is 32bit in ilp32, correct?
>> "sysdeps/unix/sysv/linux/aarch64/ilp32/mmap64.c"
>> /* mmap is provided by mmap as they are the same. */
>> void *__mmap (void *__addr, size_t __len, int __prot,
>> int __flags, int __fd, __off_t __offset)
>> {
>> void *result;
>> result = (void *)
>> INLINE_SYSCALL (mmap2, 6, __addr,
>> __len, __prot, __flags, __fd, __offset);
>> return result;
>> }
>
> __off_t should be 'long long' on new architectures, and map
> to __kernel_loff_t.
>
> Can you see how it is defined?
For kernel part, in "include/uapi/asm-generic/posix_types.h":
#ifndef __kernel_long_t
typedef long __kernel_long_t;
typedef unsigned long __kernel_ulong_t;
#endif
typedef __kernel_long_t __kernel_off_t;
in "include/linux/types.h":
typedef __kernel_off_t off_t;
"include/uapi/asm-generic/posix_types.h" is uapi, we could not check
"ARCH_32BIT_OFF_T" here. Besides, the `__kernel_long_t` is long which
mean it is 32bit in ILP32. should we define something like x32?
```
diff --git a/arch/arm64/include/uapi/asm/posix_types.h b/arch/arm64/include/uapi/asm/posix_types.h
index 7985ff6..9baa8d3 100644
--- a/arch/arm64/include/uapi/asm/posix_types.h
+++ b/arch/arm64/include/uapi/asm/posix_types.h
@@ -5,6 +5,9 @@ typedef unsigned short __kernel_old_uid_t;
typedef unsigned short __kernel_old_gid_t;
#define __kernel_old_uid_t __kernel_old_uid_t
+typedef long long __kernel_long_t;
+typedef unsigned long long __kernel_ulong_t;
+
#include <asm-generic/posix_types.h>
#endif /* __ASM_POSIX_TYPES_H */u
```
After this definition, the following kernel types is 64bit in ILP32:
typedef __kernel_long_t __kernel_suseconds_t;
typedef __kernel_long_t __kernel_ssize_t;
typedef __kernel_long_t __kernel_ptrdiff_t;
typedef __kernel_long_t __kernel_off_t;
typedef __kernel_long_t __kernel_time_t;
typedef __kernel_long_t __kernel_clock_t;
typedef __kernel_ulong_t __kernel_ino_t;
typedef __kernel_ulong_t __kernel_size_t;
But it is not a generic way to define off_t to 64bit if
ARCH_32BIT_OFF_T is not defined. How about this one? We need to
define `__kernel_off_t` on all the old 32bit architecture like
arm:
```
diff --git a/arch/arm/include/uapi/asm/posix_types.h b/arch/arm/include/uapi/asm/posix_types.h
index d2de9cb..f9d065c 100644
--- a/arch/arm/include/uapi/asm/posix_types.h
+++ b/arch/arm/include/uapi/asm/posix_types.h
@@ -32,6 +32,9 @@ typedef unsigned short __kernel_gid_t;
typedef unsigned short __kernel_old_dev_t;
#define __kernel_old_dev_t __kernel_old_dev_t
+typedef __kernel_long_t __kernel_off_t;
+#define __kernel_off_t
+
#include <asm-generic/posix_types.h>
#endif
```
And We could change the generic posix_types.h a little bit:
```
diff --git a/include/uapi/asm-generic/posix_types.h b/include/uapi/asm-generic/posix_types.h
index fe74fcc..7bbaf04 100644
--- a/include/uapi/asm-generic/posix_types.h
+++ b/include/uapi/asm-generic/posix_types.h
@@ -80,10 +80,13 @@ typedef struct {
} __kernel_fsid_t;
#endif
+#ifndef __kernel_off_t
+typedef long long __kernel_off_t;
+#endif
+
/*
* anything below here should be completely generic
*/
-typedef __kernel_long_t __kernel_off_t;
typedef long long __kernel_loff_t;
typedef __kernel_long_t __kernel_time_t;
typedef __kernel_long_t __kernel_clock_t;
```
On the other hand, glibc define it own off_t in "bits/types.h":
__STD_TYPE __OFF_T_TYPE __off_t; /* Type of file sizes and offsets. */
__STD_TYPE __OFF64_T_TYPE __off64_t; /* Type of file sizes and offsets (LFS). */
in "sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h":
#define __OFF_T_TYPE __SLONGWORD_TYPE
#define __OFF64_T_TYPE __SQUAD_TYPE
If we define off_t as 64bit in glibc:
#define __OFF_T_TYPE __SQUAD_TYPE
Should We need to align all the off_t syscall to 64bit syscall in
kernel?
Regards
Bamvor
> Arnd
>
Powered by blists - more mailing lists