From 51885a7d7321c3e6395c36bc4fe8dde7e78cf562 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 28 Jun 2012 09:56:23 +0200 Subject: [PATCH 01/16] Change byte order detection mechanism to kernel style The Linux Kernel defines only one of __LITTLE_ENDIAN and __BIG_ENDIAN. Endianess can then be tested with #ifdef __xx_ENDIAN. Userspace always defined both __LITTLE_ENDIAN and __BIG_ENDIAN and byteorder can then be tested with #if __BYTE_ORDER == __xx_ENDIAN. As we tend to use a lot of Kernel code in barebox we switch to use the kernel way of determing the byte order. As this always causes a lot of confusion add a check to include/common.h to make sure only one of __LITTLE_ENDIAN and __BIG_ENDIAN is defined. Signed-off-by: Sascha Hauer --- drivers/ata/disk_ata_drive.c | 2 +- drivers/nor/cfi_flash.c | 10 ++++++---- include/common.h | 18 ++++++++++++++++++ include/cramfs/cramfs_fs.h | 8 ++------ include/envfs.h | 22 ++++++++++++++++++---- include/linux/byteorder/generic.h | 7 ------- include/usb/usb.h | 6 ++++-- 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/drivers/ata/disk_ata_drive.c b/drivers/ata/disk_ata_drive.c index 4602af3c0..d5c583790 100644 --- a/drivers/ata/disk_ata_drive.c +++ b/drivers/ata/disk_ata_drive.c @@ -231,7 +231,7 @@ static void __maybe_unused ata_dump_id(uint16_t *id) */ static void ata_fix_endianess(uint16_t *buf, unsigned wds) { -#if __BYTE_ORDER == __BIG_ENDIAN +#ifdef __BIG_ENDIAN unsigned u; for (u = 0; u < wds; u++) diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c index 654e6470c..82c1caed5 100644 --- a/drivers/nor/cfi_flash.c +++ b/drivers/nor/cfi_flash.c @@ -82,9 +82,9 @@ static void flash_add_byte (struct flash_info *info, cfiword_t * cword, uchar c) return; } -#if __BYTE_ORDER == __BIG_ENDIAN +#ifdef __BIG_ENDIAN *cword = (*cword << 8) | c; -#else +#elif defined __LITTLE_ENDIAN if (bankwidth_is_2(info)) *cword = (*cword >> 8) | (u16)c << 8; @@ -92,6 +92,8 @@ static void flash_add_byte (struct flash_info *info, cfiword_t * cword, uchar c) *cword = (*cword >> 8) | (u32)c << 24; else if (bankwidth_is_8(info)) *cword = (*cword >> 8) | (u64)c << 56; +#else +#error "could not determine byte order" #endif } @@ -167,7 +169,7 @@ static void flash_printqry (struct cfi_qry *qry) uchar flash_read_uchar (struct flash_info *info, uint offset) { uchar *cp = flash_make_addr(info, 0, offset); -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if defined __LITTLE_ENDIAN return flash_read8(cp); #else return flash_read8(cp + info->portwidth - 1); @@ -195,7 +197,7 @@ static ulong flash_read_long (struct flash_info *info, flash_sect_t sect, uint o debug ("addr[%x] = 0x%x\n", x, flash_read8(addr + x)); } #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if defined __LITTLE_ENDIAN retval = ((flash_read8(addr) << 16) | (flash_read8(addr + info->portwidth) << 24) | (flash_read8(addr + 2 * info->portwidth)) | diff --git a/include/common.h b/include/common.h index d2347f862..9287a7dd2 100644 --- a/include/common.h +++ b/include/common.h @@ -34,6 +34,24 @@ #include #include +/* + * sanity check. The Linux Kernel defines only one of __LITTLE_ENDIAN and + * __BIG_ENDIAN. Endianess can then be tested with #ifdef __xx_ENDIAN. Userspace + * always defined both __LITTLE_ENDIAN and __BIG_ENDIAN and byteorder can then + * be tested with #if __BYTE_ORDER == __xx_ENDIAN. + * + * As we tend to use a lot of Kernel code in barebox we use the kernel way of + * determing the byte order. Make sure here that architecture code properly + * defines it. + */ +#include +#if defined __LITTLE_ENDIAN && defined __BIG_ENDIAN +#error "both __LITTLE_ENDIAN and __BIG_ENDIAN are defined" +#endif +#if !defined __LITTLE_ENDIAN && !defined __BIG_ENDIAN +#error "None of __LITTLE_ENDIAN and __BIG_ENDIAN are defined" +#endif + #define pr_info(fmt, arg...) printf(fmt, ##arg) #define pr_notice(fmt, arg...) printf(fmt, ##arg) #define pr_err(fmt, arg...) printf(fmt, ##arg) diff --git a/include/cramfs/cramfs_fs.h b/include/cramfs/cramfs_fs.h index af2940be0..8c53fc737 100644 --- a/include/cramfs/cramfs_fs.h +++ b/include/cramfs/cramfs_fs.h @@ -84,11 +84,7 @@ struct cramfs_super { | CRAMFS_FLAG_WRONG_SIGNATURE \ | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET ) -#ifndef __BYTE_ORDER -#error "No byte order defined in __BYTE_ORDER" -#endif - -#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifdef __LITTLE_ENDIAN #define CRAMFS_16(x) (x) #define CRAMFS_24(x) (x) #define CRAMFS_32(x) (x) @@ -96,7 +92,7 @@ struct cramfs_super { #define CRAMFS_GET_OFFSET(x) ((x)->offset) #define CRAMFS_SET_OFFSET(x,y) ((x)->offset = (y)) #define CRAMFS_SET_NAMELEN(x,y) ((x)->namelen = (y)) -#elif __BYTE_ORDER ==__BIG_ENDIAN +#elif defined __BIG_ENDIAN #ifdef __KERNEL__ #define CRAMFS_16(x) swab16(x) #define CRAMFS_24(x) ((swab32(x)) >> 8) diff --git a/include/envfs.h b/include/envfs.h index 67b890222..ba976d6d1 100644 --- a/include/envfs.h +++ b/include/envfs.h @@ -34,11 +34,25 @@ struct envfs_super { uint32_t sb_crc; /* crc for the superblock */ }; -#ifndef __BYTE_ORDER -#error "No byte order defined in __BYTE_ORDER" +#ifdef __BAREBOX__ +# ifdef __LITTLE_ENDIAN +# define ENVFS_ORDER_LITTLE +# elif defined __BIG_ENDIAN +# define ENVFS_ORDER_BIG +# else +# error "could not determine byte order" +# endif +#else +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define ENVFS_ORDER_LITTLE +# elif __BYTE_ORDER == __BIG_ENDIAN +# define ENVFS_ORDER_BIG +# else +# error "could not determine byte order" +# endif #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifdef ENVFS_ORDER_LITTLE #define ENVFS_16(x) (x) #define ENVFS_24(x) (x) #define ENVFS_32(x) (x) @@ -46,7 +60,7 @@ struct envfs_super { #define ENVFS_GET_OFFSET(x) ((x)->offset) #define ENVFS_SET_OFFSET(x,y) ((x)->offset = (y)) #define ENVFS_SET_NAMELEN(x,y) ((x)->namelen = (y)) -#elif __BYTE_ORDER == __BIG_ENDIAN +#elif defined ENVFS_ORDER_BIG #ifdef __KERNEL__ #define ENVFS_16(x) swab16(x) #define ENVFS_24(x) ((swab32(x)) >> 8) diff --git a/include/linux/byteorder/generic.h b/include/linux/byteorder/generic.h index aab8f4b6b..2d68d99fa 100644 --- a/include/linux/byteorder/generic.h +++ b/include/linux/byteorder/generic.h @@ -78,13 +78,6 @@ * */ -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif -#ifndef __BIG_ENDIAN -#define __BIG_ENDIAN 4321 -#endif - #if defined(__KERNEL__) /* * inside the kernel, we can use nicknames; diff --git a/include/usb/usb.h b/include/usb/usb.h index 296e4e8ea..869140001 100644 --- a/include/usb/usb.h +++ b/include/usb/usb.h @@ -270,12 +270,14 @@ void usb_rescan(void); ((x_ & 0xFF000000UL) >> 24)); \ }) -#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifdef __LITTLE_ENDIAN # define swap_16(x) (x) # define swap_32(x) (x) -#else +#elif defined BIG_ENDIAN # define swap_16(x) __swap_16(x) # define swap_32(x) __swap_32(x) +#else +#error "could not determine byte order" #endif /* From e2e494bc02bb0023931500d2bb16c844f07012ac Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 25 Jun 2012 09:58:11 +0200 Subject: [PATCH 02/16] blackfin: add __ashrdi3 Signed-off-by: Sascha Hauer --- arch/blackfin/lib/Makefile | 1 + arch/blackfin/lib/ashrdi3.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 arch/blackfin/lib/ashrdi3.c diff --git a/arch/blackfin/lib/Makefile b/arch/blackfin/lib/Makefile index 2f7731824..cefb4dc89 100644 --- a/arch/blackfin/lib/Makefile +++ b/arch/blackfin/lib/Makefile @@ -8,6 +8,7 @@ obj-y += smulsi3_highpart.o obj-y += umodsi3.o obj-y += lshrdi3.o obj-y += ashldi3.o +obj-y += ashrdi3.o obj-y += divsi3.o obj-y += modsi3.o obj-y += cpu.o diff --git a/arch/blackfin/lib/ashrdi3.c b/arch/blackfin/lib/ashrdi3.c new file mode 100644 index 000000000..b5b351e82 --- /dev/null +++ b/arch/blackfin/lib/ashrdi3.c @@ -0,0 +1,36 @@ +/* + * Copyright 2004-2009 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include "gcclib.h" + +#ifdef CONFIG_ARITHMETIC_OPS_L1 +DItype __ashrdi3(DItype u, word_type b)__attribute__((l1_text)); +#endif + +DItype __ashrdi3(DItype u, word_type b) +{ + DIunion w; + word_type bm; + DIunion uu; + + if (b == 0) + return u; + + uu.ll = u; + + bm = (sizeof(SItype) * BITS_PER_UNIT) - b; + if (bm <= 0) { + /* w.s.high = 1..1 or 0..0 */ + w.s.high = uu.s.high >> (sizeof(SItype) * BITS_PER_UNIT - 1); + w.s.low = uu.s.high >> -bm; + } else { + USItype carries = (USItype) uu.s.high << bm; + w.s.high = uu.s.high >> b; + w.s.low = ((USItype) uu.s.low >> b) | carries; + } + + return w.ll; +} From 271bdffbcd8a8579e221a068c7b0b194238f5832 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 25 Jun 2012 11:22:32 +0200 Subject: [PATCH 03/16] openrisc: link to libgcc To get symbols like __ashrdi3. Franck started generating these symbols from gcc assembly, which seems to be the cleaner approach. The simpler approach for now to get additional symbols is to link in libgcc, which is the same as the kernel does. Signed-off-by: Sascha Hauer Cc: Franck Jullien --- arch/openrisc/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/openrisc/Makefile b/arch/openrisc/Makefile index fd8bbbf4d..1f4b1755d 100644 --- a/arch/openrisc/Makefile +++ b/arch/openrisc/Makefile @@ -1,5 +1,7 @@ CPPFLAGS += -D__OR1K__ -ffixed-r10 -mhard-mul -mhard-div +LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) + board-$(CONFIG_GENERIC) := generic KALLSYMS += --symbol-prefix=_ @@ -18,4 +20,6 @@ common-y += $(BOARD) common-y += arch/openrisc/lib/ common-y += arch/openrisc/cpu/ +common-y += $(LIBGCC) + lds-y += arch/openrisc/cpu/barebox.lds From 21895e19f88d70e066155db5a5ba009d1affe9cf Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 25 Jun 2012 11:27:40 +0200 Subject: [PATCH 04/16] mips: Add missing ffs and fls include Signed-off-by: Sascha Hauer --- arch/mips/include/asm/bitops.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index 001ebf2e7..bf1ac6e58 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h @@ -28,5 +28,8 @@ #define _ASM_MIPS_BITOPS_H_ #include +#include +#include +#include #endif /* _ASM_MIPS_BITOPS_H_ */ From abbbe22b4878a31da7af590440c7d0e8c195e6bb Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 25 Jun 2012 11:28:06 +0200 Subject: [PATCH 05/16] nios2: Add missing ffs and fls include Signed-off-by: Sascha Hauer --- arch/nios2/include/asm/bitops.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/nios2/include/asm/bitops.h b/arch/nios2/include/asm/bitops.h index ab0e3d5ff..07128451c 100644 --- a/arch/nios2/include/asm/bitops.h +++ b/arch/nios2/include/asm/bitops.h @@ -1,4 +1,9 @@ #ifndef _ASM_BITOPS_H #define _ASM_BITOPS_H +#include +#include +#include +#include + #endif /* _ASM_BITOPS_H */ From a13829742b70e5af77593cf50bd64f2bff633808 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 25 Jun 2012 11:29:46 +0200 Subject: [PATCH 06/16] x86: Add missing ffs and fls include Signed-off-by: Sascha Hauer --- arch/x86/include/asm/bitops.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index b43afa3f9..830b1a551 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h @@ -27,6 +27,11 @@ #ifndef _ASM_X86_BITOPS_H_ #define _ASM_X86_BITOPS_H_ -/* nothing special yet */ +#define BITS_PER_LONG 32 + +#include +#include +#include +#include #endif /* _ASM_X86_BITOPS_H_ */ From 1a5503118a95a0080ed93b07a996282cc54ce595 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 28 Jun 2012 10:23:42 +0200 Subject: [PATCH 07/16] blackfin: Add missing fls include Signed-off-by: Sascha Hauer --- arch/blackfin/include/asm/bitops.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h index cdcb2f8e5..623ddfb39 100644 --- a/arch/blackfin/include/asm/bitops.h +++ b/arch/blackfin/include/asm/bitops.h @@ -268,7 +268,10 @@ static __inline__ int find_next_zero_bit(void *addr, int size, int offset) return result + ffz(tmp); } +#include +#include #include +#include #include static __inline__ int ext2_set_bit(int nr, volatile void *addr) From e71c34366808bbe3ce0b166d8710749513af6d81 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 14 Oct 2011 11:57:55 +0200 Subject: [PATCH 08/16] mtd: fix arguments to bad block ioctls In the Kernel the mtd ioctls expect a pointer to the offset, whereas barebox interprets the pointer itself as an offset. Since we want to add 64bit support for file sizes a pointer may not be sufficient, so align with the kernel and convert it to a pointer to the offset. Signed-off-by: Sascha Hauer --- drivers/mtd/core.c | 5 +++-- drivers/mtd/nand/nand-bb.c | 20 ++++++++++---------- fs/devfs-core.c | 6 +++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 87dcba680..2ce08a693 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -123,16 +123,17 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) struct mtd_ecc_stats *ecc = buf; #endif struct region_info_user *reg = buf; + off_t *offset = buf; switch (request) { case MEMGETBADBLOCK: dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf); - ret = mtd->block_isbad(mtd, (off_t)buf); + ret = mtd->block_isbad(mtd, *offset); break; #ifdef CONFIG_MTD_WRITE case MEMSETBADBLOCK: dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf); - ret = mtd->block_markbad(mtd, (off_t)buf); + ret = mtd->block_markbad(mtd, *offset); break; #endif case MEMGETINFO: diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index bd3043895..0377f1e78 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -42,9 +42,9 @@ struct nand_bb { struct mtd_info_user info; - size_t raw_size; - size_t size; - off_t offset; + loff_t raw_size; + loff_t size; + loff_t offset; unsigned long flags; void *writebuf; @@ -63,18 +63,18 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count, debug("%s %d %d\n", __func__, offset, count); while(count) { - ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)bb->offset); + ret = cdev_ioctl(parent, MEMGETBADBLOCK, &bb->offset); if (ret < 0) return ret; if (ret) { - printf("skipping bad block at 0x%08lx\n", bb->offset); + printf("skipping bad block at 0x%08llx\n", bb->offset); bb->offset += bb->info.erasesize; continue; } now = min(count, (size_t)(bb->info.erasesize - - (bb->offset % bb->info.erasesize))); + ((size_t)bb->offset % bb->info.erasesize))); ret = cdev_read(parent, buf, now, bb->offset, 0); if (ret < 0) return ret; @@ -96,10 +96,10 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count) int ret, now; struct cdev *parent = bb->cdev_parent; void *buf = bb->writebuf; - int cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1); + off_t cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1); while (count) { - ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)cur_ofs); + ret = cdev_ioctl(parent, MEMGETBADBLOCK, &cur_ofs); if (ret < 0) return ret; @@ -197,11 +197,11 @@ static int nand_bb_close(struct cdev *cdev) static int nand_bb_calc_size(struct nand_bb *bb) { - ulong pos = 0; + loff_t pos = 0; int ret; while (pos < bb->raw_size) { - ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, (void *)pos); + ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &pos); if (ret < 0) return ret; if (!ret) diff --git a/fs/devfs-core.c b/fs/devfs-core.c index ff6a97627..6a56d34f2 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -123,15 +123,15 @@ int cdev_flush(struct cdev *cdev) static int partition_ioctl(struct cdev *cdev, int request, void *buf) { int ret = 0; - size_t offset; + loff_t offset, *_buf = buf; struct mtd_info_user *user = buf; switch (request) { case MEMSETBADBLOCK: case MEMGETBADBLOCK: - offset = (off_t)buf; + offset = *_buf; offset += cdev->offset; - ret = cdev->ops->ioctl(cdev, request, (void *)offset); + ret = cdev->ops->ioctl(cdev, request, &offset); break; case MEMGETINFO: if (cdev->mtd) { From 3e503822c7379ffc1a1c60aed57eb81954451faa Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 14 Oct 2011 13:46:09 +0200 Subject: [PATCH 09/16] use loff_t for file offsets This is a first step for 64bit file support: Make the file sizes/offsets 64bit. Signed-off-by: Sascha Hauer --- arch/arm/mach-imx/iim.c | 8 ++++---- arch/arm/mach-mxs/ocotp.c | 4 ++-- arch/sandbox/board/hostfile.c | 4 ++-- commands/mem.c | 2 +- common/block.c | 4 ++-- drivers/eeprom/at25.c | 8 ++++---- drivers/mfd/lp3972.c | 2 +- drivers/mfd/mc13xxx.c | 4 ++-- drivers/mfd/mc34704.c | 4 ++-- drivers/mfd/mc34708.c | 6 ++++-- drivers/mfd/mc9sdz60.c | 4 ++-- drivers/mfd/twl-core.c | 4 ++-- drivers/mtd/core.c | 17 ++++++++++------- drivers/mtd/mtdoob.c | 3 ++- drivers/mtd/mtdraw.c | 9 ++++++--- drivers/mtd/nand/nand-bb.c | 10 +++++----- drivers/mtd/ubi/cdev.c | 8 ++++---- drivers/net/miidev.c | 4 ++-- drivers/nor/cfi_flash.c | 8 ++++---- drivers/nor/m25p80.c | 16 ++++++++++------ fs/cramfs/cramfs.c | 2 +- fs/devfs.c | 6 +++--- fs/fat/fat.c | 6 +++--- fs/fs.c | 10 +++++----- fs/nfs.c | 2 +- fs/ramfs.c | 2 +- fs/tftp.c | 2 +- include/driver.h | 16 ++++++++-------- include/fs.h | 12 ++++++------ 29 files changed, 100 insertions(+), 87 deletions(-) diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c index f2ace8aa0..0da8ea062 100644 --- a/arch/arm/mach-imx/iim.c +++ b/arch/arm/mach-imx/iim.c @@ -84,7 +84,7 @@ static int do_fuse_sense(void __iomem *reg_base, unsigned int bank, } static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { ulong size, i; struct iim_priv *priv = cdev->priv; @@ -94,7 +94,7 @@ static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count, if ((sense_param = dev_get_param(cdev->dev, "explicit_sense_enable"))) explicit_sense = simple_strtoul(sense_param, NULL, 0); - size = min((ulong)count, priv->banksize - offset); + size = min((loff_t)count, priv->banksize - offset); if (explicit_sense) { for (i = 0; i < size; i++) { int row_val; @@ -176,7 +176,7 @@ out: #endif /* CONFIG_IMX_IIM_FUSE_BLOW */ static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { ulong size, i; struct iim_priv *priv = cdev->priv; @@ -186,7 +186,7 @@ static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t cou if ((write_param = dev_get_param(cdev->dev, "permanent_write_enable"))) blow_enable = simple_strtoul(write_param, NULL, 0); - size = min((ulong)count, priv->banksize - offset); + size = min((loff_t)count, priv->banksize - offset); #ifdef CONFIG_IMX_IIM_FUSE_BLOW if (blow_enable) { for (i = 0; i < size; i++) { diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c index 38f9ffde1..86e63dc7d 100644 --- a/arch/arm/mach-mxs/ocotp.c +++ b/arch/arm/mach-mxs/ocotp.c @@ -40,11 +40,11 @@ struct ocotp_priv { }; static ssize_t mxs_ocotp_cdev_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct ocotp_priv *priv = cdev->priv; void __iomem *base = priv->base; - size_t size = min((ulong)count, cdev->size - offset); + size_t size = min((loff_t)count, cdev->size - offset); uint64_t start; int i; diff --git a/arch/sandbox/board/hostfile.c b/arch/sandbox/board/hostfile.c index 90a97413b..96fa10001 100644 --- a/arch/sandbox/board/hostfile.c +++ b/arch/sandbox/board/hostfile.c @@ -34,7 +34,7 @@ struct hf_priv { struct hf_platform_data *pdata; }; -static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { struct hf_platform_data *hf = cdev->priv; int fd = hf->fd; @@ -45,7 +45,7 @@ static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, return linux_read(fd, buf, count); } -static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { struct hf_platform_data *hf = cdev->priv; int fd = hf->fd; diff --git a/commands/mem.c b/commands/mem.c index 080bfdef3..649d5bf45 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -624,7 +624,7 @@ static int mem_init(void) device_initcall(mem_init); -static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { memset(buf, 0, count); return count; diff --git a/common/block.c b/common/block.c index 71ecfd5ab..1db06cc98 100644 --- a/common/block.c +++ b/common/block.c @@ -179,7 +179,7 @@ static void *block_get(struct block_device *blk, int block) } static ssize_t block_read(struct cdev *cdev, void *buf, size_t count, - unsigned long offset, unsigned long flags) + loff_t offset, unsigned long flags) { struct block_device *blk = cdev->priv; unsigned long mask = BLOCKSIZE(blk) - 1; @@ -256,7 +256,7 @@ static int block_put(struct block_device *blk, const void *buf, int block) } static ssize_t block_write(struct cdev *cdev, const void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct block_device *blk = cdev->priv; unsigned long mask = BLOCKSIZE(blk) - 1; diff --git a/drivers/eeprom/at25.c b/drivers/eeprom/at25.c index 8a979d53a..03d191eb9 100644 --- a/drivers/eeprom/at25.c +++ b/drivers/eeprom/at25.c @@ -67,7 +67,7 @@ struct at25_data { static ssize_t at25_ee_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, + loff_t offset, ulong flags) { u8 command[EE_MAXADDRLEN + 1]; @@ -117,7 +117,7 @@ static ssize_t at25_ee_read(struct cdev *cdev, */ status = spi_sync(at25->spi, &m); dev_dbg(at25->cdev.dev, - "read %d bytes at %lu --> %d\n", + "read %d bytes at %llu --> %d\n", count, offset, (int) status); return status ? status : count; @@ -126,7 +126,7 @@ static ssize_t at25_ee_read(struct cdev *cdev, static ssize_t at25_ee_write(struct cdev *cdev, const void *buf, size_t count, - ulong off, + loff_t off, ulong flags) { ssize_t status = 0; @@ -232,7 +232,7 @@ static ssize_t at25_ee_write(struct cdev *cdev, return written ? written : status; } -static off_t at25_ee_lseek(struct cdev *cdev, off_t off) +static loff_t at25_ee_lseek(struct cdev *cdev, loff_t off) { return off; } diff --git a/drivers/mfd/lp3972.c b/drivers/mfd/lp3972.c index 98266990d..0f3093bd1 100644 --- a/drivers/mfd/lp3972.c +++ b/drivers/mfd/lp3972.c @@ -58,7 +58,7 @@ static u32 lp_read_reg(struct lp_priv *lp, int reg) return buf; } -static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct lp_priv *priv = to_lp_priv(cdev); int i = count; diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c index f9477a354..2934e9d9b 100644 --- a/drivers/mfd/mc13xxx.c +++ b/drivers/mfd/mc13xxx.c @@ -160,7 +160,7 @@ int mc13xxx_set_bits(struct mc13xxx *mc13xxx, u8 reg, u32 mask, u32 val) } EXPORT_SYMBOL(mc13xxx_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct mc13xxx *priv = to_mc13xxx(cdev); u32 *buf = _buf; @@ -181,7 +181,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { struct mc13xxx *mc13xxx = to_mc13xxx(cdev); const u32 *buf = _buf; diff --git a/drivers/mfd/mc34704.c b/drivers/mfd/mc34704.c index a2171b35d..20c01e2be 100644 --- a/drivers/mfd/mc34704.c +++ b/drivers/mfd/mc34704.c @@ -65,7 +65,7 @@ int mc34704_reg_write(struct mc34704 *mc34704, u8 reg, u8 val) EXPORT_SYMBOL(mc34704_reg_write) static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct mc34704 *priv = to_mc34704(cdev); u8 *buf = _buf; @@ -85,7 +85,7 @@ static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count, } static ssize_t mc34704_write(struct cdev *cdev, const void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct mc34704 *mc34704 = to_mc34704(cdev); const u8 *buf = _buf; diff --git a/drivers/mfd/mc34708.c b/drivers/mfd/mc34708.c index e7f40c02b..02c58a997 100644 --- a/drivers/mfd/mc34708.c +++ b/drivers/mfd/mc34708.c @@ -163,7 +163,8 @@ int mc34708_set_bits(struct mc34708 *mc34708, enum mc34708_reg reg, u32 mask, u3 } EXPORT_SYMBOL(mc34708_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, + loff_t offset, ulong flags) { struct mc34708 *priv = to_mc34708(cdev); u32 *buf = _buf; @@ -184,7 +185,8 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, + loff_t offset, ulong flags) { struct mc34708 *mc34708 = to_mc34708(cdev); const u32 *buf = _buf; diff --git a/drivers/mfd/mc9sdz60.c b/drivers/mfd/mc9sdz60.c index db208ec2d..0cd5007e1 100644 --- a/drivers/mfd/mc9sdz60.c +++ b/drivers/mfd/mc9sdz60.c @@ -78,7 +78,7 @@ int mc9sdz60_set_bits(struct mc9sdz60 *mc9sdz60, enum mc9sdz60_reg reg, u8 mask, } EXPORT_SYMBOL(mc9sdz60_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev); u8 *buf = _buf; @@ -97,7 +97,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset return count; } -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev); const u8 *buf = _buf; diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index cb2c03dfc..20bde2cf8 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -112,7 +112,7 @@ int twlcore_set_bits(struct twlcore *twlcore, u16 reg, u8 mask, u8 val) EXPORT_SYMBOL(twlcore_set_bits); static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct twlcore *priv = to_twlcore(cdev); u8 *buf = _buf; @@ -131,7 +131,7 @@ static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, } static ssize_t twl_write(struct cdev *cdev, const void *_buf, size_t count, - ulong offset, ulong flags) + loff_t offset, ulong flags) { struct twlcore *twlcore = to_twlcore(cdev); const u8 *buf = _buf; diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 2ce08a693..5510439a8 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -31,11 +31,12 @@ static LIST_HEAD(mtd_register_hooks); static ssize_t mtd_read(struct cdev *cdev, void* buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = cdev->priv; size_t retlen; int ret; + unsigned long offset = _offset; debug("mtd_read: 0x%08lx 0x%08x\n", offset, count); @@ -64,13 +65,14 @@ static int all_ff(const void *buf, int len) } static ssize_t mtd_write(struct cdev* cdev, const void *buf, size_t _count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = cdev->priv; size_t retlen, now; int ret = 0; void *wrbuf = NULL; size_t count = _count; + unsigned long offset = _offset; if (NOTALIGNED(offset)) { printf("offset 0x%0lx not page aligned\n", offset); @@ -123,16 +125,16 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) struct mtd_ecc_stats *ecc = buf; #endif struct region_info_user *reg = buf; - off_t *offset = buf; + loff_t *offset = buf; switch (request) { case MEMGETBADBLOCK: - dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf); + dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08llx\n", *offset); ret = mtd->block_isbad(mtd, *offset); break; #ifdef CONFIG_MTD_WRITE case MEMSETBADBLOCK: - dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf); + dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08llx\n", *offset); ret = mtd->block_markbad(mtd, *offset); break; #endif @@ -157,9 +159,10 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) #endif case MEMGETREGIONINFO: if (cdev->mtd) { + unsigned long size = cdev->size; reg->offset = cdev->offset; reg->erasesize = cdev->mtd->erasesize; - reg->numblocks = cdev->size/reg->erasesize; + reg->numblocks = size / reg->erasesize; reg->regionindex = cdev->mtd->index; } break; @@ -171,7 +174,7 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf) } #ifdef CONFIG_MTD_WRITE -static ssize_t mtd_erase(struct cdev *cdev, size_t count, unsigned long offset) +static ssize_t mtd_erase(struct cdev *cdev, size_t count, loff_t offset) { struct mtd_info *mtd = cdev->priv; struct erase_info erase; diff --git a/drivers/mtd/mtdoob.c b/drivers/mtd/mtdoob.c index be656a4d3..e4dd1a00c 100644 --- a/drivers/mtd/mtdoob.c +++ b/drivers/mtd/mtdoob.c @@ -38,11 +38,12 @@ static struct mtd_info *to_mtd(struct cdev *cdev) } static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = to_mtd(cdev); struct mtd_oob_ops ops; int ret; + unsigned long offset = _offset; if (count < mtd->oobsize) return -EINVAL; diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c index 7abe2351a..24f735809 100644 --- a/drivers/mtd/mtdraw.c +++ b/drivers/mtd/mtdraw.c @@ -116,12 +116,13 @@ err: } static ssize_t mtdraw_read(struct cdev *cdev, void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtd_info *mtd = to_mtd(cdev); ssize_t retlen = 0, ret = 1, toread; ulong numpage; int skip; + unsigned long offset = _offset; numpage = offset / (mtd->writesize + mtd->oobsize); skip = offset % (mtd->writesize + mtd->oobsize); @@ -167,13 +168,14 @@ static void mtdraw_fillbuf(struct mtdraw *mtdraw, const void *src, int nbbytes) } static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count, - ulong offset, ulong flags) + loff_t _offset, ulong flags) { struct mtdraw *mtdraw = to_mtdraw(cdev); struct mtd_info *mtd = to_mtd(cdev); int bsz = mtd->writesize + mtd->oobsize; ulong numpage; size_t retlen = 0, tofill; + unsigned long offset = _offset; int ret = 0; if (mtdraw->write_fill && @@ -220,10 +222,11 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count, } } -static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, ulong offset) +static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, loff_t _offset) { struct mtd_info *mtd = to_mtd(cdev); struct erase_info erase; + unsigned long offset = _offset; int ret; offset = offset / (mtd->writesize + mtd->oobsize) * mtd->writesize; diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index 0377f1e78..d27274924 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -54,7 +54,7 @@ struct nand_bb { }; static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct nand_bb *bb = cdev->priv; struct cdev *parent = bb->cdev_parent; @@ -123,12 +123,12 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count) } static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count, - unsigned long offset, ulong flags) + loff_t offset, ulong flags) { struct nand_bb *bb = cdev->priv; int bytes = count, now, wroffs, ret; - debug("%s offset: 0x%08x count: 0x%08x\n", __func__, offset, count); + debug("%s offset: 0x%08llx count: 0x%08x\n", __func__, offset, count); while (count) { wroffs = bb->offset % BB_WRITEBUF_SIZE; @@ -152,7 +152,7 @@ static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count, return bytes; } -static int nand_bb_erase(struct cdev *cdev, size_t count, unsigned long offset) +static int nand_bb_erase(struct cdev *cdev, size_t count, loff_t offset) { struct nand_bb *bb = cdev->priv; @@ -213,7 +213,7 @@ static int nand_bb_calc_size(struct nand_bb *bb) return 0; } -static off_t nand_bb_lseek(struct cdev *cdev, off_t __offset) +static loff_t nand_bb_lseek(struct cdev *cdev, loff_t __offset) { struct nand_bb *bb = cdev->priv; unsigned long raw_pos = 0; diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index 95bef1f9e..c99b64db2 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c @@ -12,7 +12,7 @@ struct ubi_volume_cdev_priv { }; static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, - unsigned long offset, unsigned long flags) + loff_t offset, unsigned long flags) { struct ubi_volume_cdev_priv *priv = cdev->priv; struct ubi_volume *vol = priv->vol; @@ -23,7 +23,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, loff_t offp = offset; int usable_leb_size = vol->usable_leb_size; - printf("%s: %d @ 0x%08lx\n", __func__, size, offset); + printf("%s: %d @ 0x%08llx\n", __func__, size, offset); len = size > usable_leb_size ? usable_leb_size : size; @@ -56,7 +56,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size, } static ssize_t ubi_volume_cdev_write(struct cdev* cdev, const void *buf, - size_t size, unsigned long offset, unsigned long flags) + size_t size, loff_t offset, unsigned long flags) { struct ubi_volume_cdev_priv *priv = cdev->priv; struct ubi_volume *vol = priv->vol; @@ -121,7 +121,7 @@ static int ubi_volume_cdev_close(struct cdev *cdev) return 0; } -static off_t ubi_volume_cdev_lseek(struct cdev *cdev, off_t ofs) +static loff_t ubi_volume_cdev_lseek(struct cdev *cdev, loff_t ofs) { struct ubi_volume_cdev_priv *priv = cdev->priv; diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c index f47fc9e65..d23775b5a 100644 --- a/drivers/net/miidev.c +++ b/drivers/net/miidev.c @@ -180,7 +180,7 @@ int miidev_print_status(struct mii_device *mdev) return 0; } -static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) { int i = count; uint16_t *buf = _buf; @@ -196,7 +196,7 @@ static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong of return count; } -static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags) +static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) { int i = count; const uint16_t *buf = _buf; diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c index 82c1caed5..16885c0af 100644 --- a/drivers/nor/cfi_flash.c +++ b/drivers/nor/cfi_flash.c @@ -458,7 +458,7 @@ flash_sect_t find_sector (struct flash_info *info, ulong addr) return sector; } -static int __cfi_erase(struct cdev *cdev, size_t count, unsigned long offset, +static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset, int verbose) { struct flash_info *finfo = (struct flash_info *)cdev->priv; @@ -493,7 +493,7 @@ out: return ret; } -static int cfi_erase(struct cdev *cdev, size_t count, unsigned long offset) +static int cfi_erase(struct cdev *cdev, size_t count, loff_t offset) { return __cfi_erase(cdev, count, offset, 1); } @@ -630,7 +630,7 @@ static int flash_real_protect (struct flash_info *info, long sector, int prot) return retcode; } -static int cfi_protect(struct cdev *cdev, size_t count, unsigned long offset, int prot) +static int cfi_protect(struct cdev *cdev, size_t count, loff_t offset, int prot) { struct flash_info *finfo = (struct flash_info *)cdev->priv; unsigned long start, end; @@ -653,7 +653,7 @@ out: return ret; } -static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, unsigned long offset, ulong flags) +static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { struct flash_info *finfo = (struct flash_info *)cdev->priv; int ret; diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c index 77669c280..14402270b 100644 --- a/drivers/nor/m25p80.c +++ b/drivers/nor/m25p80.c @@ -194,13 +194,14 @@ static int erase_sector(struct m25p *flash, u32 offset) * Erase an address range on the flash chip. The address range may extend * one or more erase sectors. Return an error is there is a problem erasing. */ -static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offset) +static ssize_t m25p80_erase(struct cdev *cdev, size_t count, loff_t offset) { struct m25p *flash = cdev->priv; u32 addr, len; u32 start_sector; u32 end_sector; u32 progress = 0; + int eraseshift = ffs(flash->erasesize) - 1; dev_dbg(&flash->spi->dev, "%s %s 0x%llx, len %lld\n", __func__, "at", (long long)offset, (long long)count); @@ -212,8 +213,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse addr = offset; len = count; - start_sector = offset / flash->erasesize; - end_sector = (offset + count - 1) / flash->erasesize; + start_sector = offset >> eraseshift; + end_sector = (offset + count - 1) >> eraseshift; init_progression_bar(end_sector - start_sector + 1); /* whole-chip erase? */ @@ -250,7 +251,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse return 0; } -ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, + ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; @@ -302,7 +304,8 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ul return retlen; } -ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, + loff_t offset, ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; @@ -381,7 +384,8 @@ ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong off return retlen; } #ifdef CONFIG_MTD_SST25L -ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, + ulong flags) { struct m25p *flash = cdev->priv; struct spi_transfer t[2]; diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c index c7c798b23..99f6d49c2 100644 --- a/fs/cramfs/cramfs.c +++ b/fs/cramfs/cramfs.c @@ -358,7 +358,7 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size) return outsize; } -static off_t cramfs_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t cramfs_lseek(struct device_d *dev, FILE *f, loff_t pos) { f->pos = pos; return f->pos; diff --git a/fs/devfs.c b/fs/devfs.c index ae48451b6..863f4ec33 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -52,7 +52,7 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s return cdev_write(cdev, buf, size, f->pos, f->flags); } -static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) +static loff_t devfs_lseek(struct device_d *_dev, FILE *f, loff_t pos) { struct cdev *cdev = f->inode; off_t ret = -1; @@ -66,7 +66,7 @@ static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) return ret - cdev->offset; } -static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset) +static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, loff_t offset) { struct cdev *cdev = f->inode; @@ -79,7 +79,7 @@ static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned lo return cdev->ops->erase(cdev, count, offset + cdev->offset); } -static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot) +static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, loff_t offset, int prot) { struct cdev *cdev = f->inode; diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 21464bde9..5e6c81c35 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -49,7 +49,7 @@ DRESULT disk_read(FATFS *fat, BYTE *buf, DWORD sector, BYTE count) debug("%s: sector: %ld count: %d\n", __func__, sector, count); - ret = cdev_read(priv->cdev, buf, count << 9, sector * 512, 0); + ret = cdev_read(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0); if (ret != count << 9) return ret; @@ -64,7 +64,7 @@ DRESULT disk_write(FATFS *fat, const BYTE *buf, DWORD sector, BYTE count) debug("%s: buf: %p sector: %ld count: %d\n", __func__, buf, sector, count); - ret = cdev_write(priv->cdev, buf, count << 9, sector * 512, 0); + ret = cdev_write(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0); if (ret != count << 9) return ret; @@ -271,7 +271,7 @@ static int fat_read(struct device_d *_dev, FILE *f, void *buf, size_t insize) return outsize; } -static off_t fat_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t fat_lseek(struct device_d *dev, FILE *f, loff_t pos) { FIL *f_file = f->inode; int ret; diff --git a/fs/fs.c b/fs/fs.c index af73c8c8a..6d1d70390 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -692,7 +692,7 @@ int flush(int fd) return ret; } -off_t lseek(int fildes, off_t offset, int whence) +loff_t lseek(int fildes, loff_t offset, int whence) { struct device_d *dev; struct fs_driver_d *fsdrv; @@ -1243,7 +1243,7 @@ static void memcpy_sz(void *_dst, const void *_src, ulong count, ulong rwsize) } } -ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { ulong size; struct device_d *dev; @@ -1252,13 +1252,13 @@ ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((loff_t)count, dev->resource[0].size - offset); memcpy_sz(buf, dev_get_mem_region(dev, 0) + offset, size, flags & O_RWSIZE_MASK); return size; } EXPORT_SYMBOL(mem_read); -ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { ulong size; struct device_d *dev; @@ -1267,7 +1267,7 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset return -1; dev = cdev->dev; - size = min((ulong)count, dev->resource[0].size - offset); + size = min((loff_t)count, dev->resource[0].size - offset); memcpy_sz(dev_get_mem_region(dev, 0) + offset, buf, size, flags & O_RWSIZE_MASK); return size; } diff --git a/fs/nfs.c b/fs/nfs.c index 75a8f2506..79e667f48 100644 --- a/fs/nfs.c +++ b/fs/nfs.c @@ -805,7 +805,7 @@ static int nfs_read(struct device_d *dev, FILE *file, void *buf, size_t insize) return outsize; } -static off_t nfs_lseek(struct device_d *dev, FILE *file, off_t pos) +static loff_t nfs_lseek(struct device_d *dev, FILE *file, loff_t pos) { struct file_priv *priv = file->inode; diff --git a/fs/ramfs.c b/fs/ramfs.c index cec5e769b..91d06b8d3 100644 --- a/fs/ramfs.c +++ b/fs/ramfs.c @@ -428,7 +428,7 @@ static int ramfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t i return insize; } -static off_t ramfs_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t ramfs_lseek(struct device_d *dev, FILE *f, loff_t pos) { f->pos = pos; return f->pos; diff --git a/fs/tftp.c b/fs/tftp.c index 6586270e3..b58d6fcf5 100644 --- a/fs/tftp.c +++ b/fs/tftp.c @@ -569,7 +569,7 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize) return outsize; } -static off_t tftp_lseek(struct device_d *dev, FILE *f, off_t pos) +static loff_t tftp_lseek(struct device_d *dev, FILE *f, loff_t pos) { /* not implemented in tftp protocol */ return -ENOSYS; diff --git a/include/driver.h b/include/driver.h index 09dd1e45c..4a8d48a87 100644 --- a/include/driver.h +++ b/include/driver.h @@ -301,8 +301,8 @@ struct cdev; int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot); /* These are used by drivers which work with direct memory accesses */ -ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags); -ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags); +ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags); +ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags); int mem_memmap(struct cdev *cdev, void **map, int flags); /* Use this if you have nothing to do in your drivers probe function */ @@ -316,7 +316,7 @@ void devices_shutdown(void); int generic_memmap_ro(struct cdev *dev, void **map, int flags); int generic_memmap_rw(struct cdev *dev, void **map, int flags); -static inline off_t dev_lseek_default(struct cdev *cdev, off_t ofs) +static inline loff_t dev_lseek_default(struct cdev *cdev, loff_t ofs) { return ofs; } @@ -373,18 +373,18 @@ extern struct bus_type platform_bus; struct file_operations { /*! Called in response of reading from this device. Required */ - ssize_t (*read)(struct cdev*, void* buf, size_t count, ulong offset, ulong flags); + ssize_t (*read)(struct cdev*, void* buf, size_t count, loff_t offset, ulong flags); /*! Called in response of write to this device. Required */ - ssize_t (*write)(struct cdev*, const void* buf, size_t count, ulong offset, ulong flags); + ssize_t (*write)(struct cdev*, const void* buf, size_t count, loff_t offset, ulong flags); int (*ioctl)(struct cdev*, int, void *); - off_t (*lseek)(struct cdev*, off_t); + loff_t (*lseek)(struct cdev*, loff_t); int (*open)(struct cdev*, unsigned long flags); int (*close)(struct cdev*); int (*flush)(struct cdev*); - int (*erase)(struct cdev*, size_t count, unsigned long offset); - int (*protect)(struct cdev*, size_t count, unsigned long offset, int prot); + int (*erase)(struct cdev*, size_t count, loff_t offset); + int (*protect)(struct cdev*, size_t count, loff_t offset, int prot); int (*memmap)(struct cdev*, void **map, int flags); }; diff --git a/include/fs.h b/include/fs.h index d82f02626..2b1023e45 100644 --- a/include/fs.h +++ b/include/fs.h @@ -23,8 +23,8 @@ typedef struct dir { typedef struct filep { struct device_d *dev; /* The device this FILE belongs to */ - ulong pos; /* current position in stream */ - ulong size; /* The size of this inode */ + loff_t pos; /* current position in stream */ + loff_t size; /* The size of this inode */ ulong flags; /* the O_* flags from open */ void *inode; /* private to the filesystem driver */ @@ -54,7 +54,7 @@ struct fs_driver_d { int (*read)(struct device_d *dev, FILE *f, void *buf, size_t size); int (*write)(struct device_d *dev, FILE *f, const void *buf, size_t size); int (*flush)(struct device_d *dev, FILE *f); - off_t (*lseek)(struct device_d *dev, FILE *f, off_t pos); + loff_t (*lseek)(struct device_d *dev, FILE *f, loff_t pos); struct dir* (*opendir)(struct device_d *dev, const char *pathname); struct dirent* (*readdir)(struct device_d *dev, struct dir *dir); @@ -63,9 +63,9 @@ struct fs_driver_d { int (*ioctl)(struct device_d *dev, FILE *f, int request, void *buf); int (*erase)(struct device_d *dev, FILE *f, size_t count, - unsigned long offset); + loff_t offset); int (*protect)(struct device_d *dev, FILE *f, size_t count, - unsigned long offset, int prot); + loff_t offset, int prot); int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags); @@ -109,7 +109,7 @@ ssize_t write(int fd, const void *buf, size_t count); #define SEEK_CUR 2 #define SEEK_END 3 -off_t lseek(int fildes, off_t offset, int whence); +loff_t lseek(int fildes, loff_t offset, int whence); int mkdir (const char *pathname, mode_t mode); /* Create a directory and its parents */ From 76281a16fbd01adaf823849a9e5ab30b3024ec5c Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 14 Oct 2011 12:05:09 +0200 Subject: [PATCH 10/16] introduce strtoull_suffix function Signed-off-by: Sascha Hauer --- include/common.h | 1 + lib/misc.c | 14 ++++++++++---- lib/vsprintf.c | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/common.h b/include/common.h index 9287a7dd2..41b99f22c 100644 --- a/include/common.h +++ b/include/common.h @@ -160,6 +160,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size); /* Just like simple_strtoul(), but this one honors a K/M/G suffix */ unsigned long strtoul_suffix(const char *str, char **endp, int base); +unsigned long long strtoull_suffix(const char *str, char **endp, int base); void start_barebox(void); void shutdown_barebox(void); diff --git a/lib/misc.c b/lib/misc.c index 549b9601c..cdf01857a 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -27,15 +27,15 @@ #include /* - * Like simple_strtoul() but handles an optional G, M, K or k + * Like simple_strtoull() but handles an optional G, M, K or k * suffix for Gigabyte, Megabyte or Kilobyte */ -unsigned long strtoul_suffix(const char *str, char **endp, int base) +unsigned long long strtoull_suffix(const char *str, char **endp, int base) { - unsigned long val; + unsigned long long val; char *end; - val = simple_strtoul(str, &end, base); + val = simple_strtoull(str, &end, base); switch (*end) { case 'G': @@ -55,6 +55,12 @@ unsigned long strtoul_suffix(const char *str, char **endp, int base) return val; } +EXPORT_SYMBOL(strtoull_suffix); + +unsigned long strtoul_suffix(const char *str, char **endp, int base) +{ + return strtoull_suffix(str, endp, base); +} EXPORT_SYMBOL(strtoul_suffix); /* diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 976351513..17c197334 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -83,6 +83,7 @@ unsigned long long simple_strtoull (const char *cp, char **endp, unsigned int ba *endp = (char *) cp; return result; } +EXPORT_SYMBOL(simple_strtoll); /* we use this so that we can do without the ctype library */ #define is_digit(c) ((c) >= '0' && (c) <= '9') From efa379f2244ae5abaad1b6ce139920e7919130b1 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 18 Oct 2011 17:21:18 +0200 Subject: [PATCH 11/16] make parse_area_spec arguments loff_t Signed-off-by: Sascha Hauer --- commands/crc.c | 4 ++-- commands/digest.c | 4 ++-- commands/flash.c | 4 ++-- commands/mem.c | 4 ++-- include/common.h | 2 +- lib/misc.c | 10 +++++----- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/commands/crc.c b/commands/crc.c index df229410f..09af6aa3f 100644 --- a/commands/crc.c +++ b/commands/crc.c @@ -84,8 +84,8 @@ out: static int do_crc(int argc, char *argv[]) { - ulong start = 0, size = ~0, total = 0; - ulong crc = 0, vcrc = 0; + loff_t start = 0, size = ~0; + ulong crc = 0, vcrc = 0, total = 0; char *filename = "/dev/mem"; #ifdef CONFIG_CMD_CRC_CMP char *vfilename = NULL; diff --git a/commands/digest.c b/commands/digest.c index 84329144c..07cbec990 100644 --- a/commands/digest.c +++ b/commands/digest.c @@ -51,7 +51,7 @@ static int do_digest(char *algorithm, int argc, char *argv[]) argv++; while (*argv) { char *filename = "/dev/mem"; - ulong start = 0, size = ~0; + loff_t start = 0, size = ~0; /* arguments are either file, file+area or area */ if (parse_area_spec(*argv, &start, &size)) { @@ -66,7 +66,7 @@ static int do_digest(char *algorithm, int argc, char *argv[]) for (i = 0; i < d->length; i++) printf("%02x", hash[i]); - printf(" %s\t0x%08lx ... 0x%08lx\n", filename, start, start + size); + printf(" %s\t0x%08llx ... 0x%08llx\n", filename, start, start + size); argv++; } diff --git a/commands/flash.c b/commands/flash.c index 1fcb1cff0..d71349a19 100644 --- a/commands/flash.c +++ b/commands/flash.c @@ -41,7 +41,7 @@ static int do_flerase(int argc, char *argv[]) int fd; char *filename = NULL; struct stat s; - unsigned long start = 0, size = ~0; + loff_t start = 0, size = ~0; int ret = 0; if (argc == 1) @@ -109,7 +109,7 @@ static int do_protect(int argc, char *argv[]) char *filename = NULL; struct stat s; int prot = 1; - unsigned long start = 0, size = ~0; + loff_t start = 0, size = ~0; int ret = 0, err; if (argc == 1) diff --git a/commands/mem.c b/commands/mem.c index 649d5bf45..0719700b6 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -163,7 +163,7 @@ static int mem_parse_options(int argc, char *argv[], char *optstr, int *mode, static int do_mem_md(int argc, char *argv[]) { - ulong start = 0, size = 0x100; + loff_t start = 0, size = 0x100; int r, now; int ret = 0; int fd; @@ -187,7 +187,7 @@ static int do_mem_md(int argc, char *argv[]) return 1; do { - now = min(size, RW_BUF_SIZE); + now = min(size, (loff_t)RW_BUF_SIZE); r = read(fd, rw_buf, now); if (r < 0) { perror("read"); diff --git a/include/common.h b/include/common.h index 41b99f22c..6b02c9640 100644 --- a/include/common.h +++ b/include/common.h @@ -156,7 +156,7 @@ struct memarea_info { unsigned long flags; }; -int parse_area_spec(const char *str, ulong *start, ulong *size); +int parse_area_spec(const char *str, loff_t *start, loff_t *size); /* Just like simple_strtoul(), but this one honors a K/M/G suffix */ unsigned long strtoul_suffix(const char *str, char **endp, int base); diff --git a/lib/misc.c b/lib/misc.c index cdf01857a..8a95396ed 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -75,15 +75,15 @@ EXPORT_SYMBOL(strtoul_suffix); * 0x1000 -> start = 0x1000, size = ~0 * 1M+1k -> start = 0x100000, size = 0x400 */ -int parse_area_spec(const char *str, ulong *start, ulong *size) +int parse_area_spec(const char *str, loff_t *start, loff_t *size) { char *endp; - ulong end; + loff_t end; if (!isdigit(*str)) return -1; - *start = strtoul_suffix(str, &endp, 0); + *start = strtoull_suffix(str, &endp, 0); str = endp; @@ -95,7 +95,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size) if (*str == '-') { /* beginning and end given */ - end = strtoul_suffix(str + 1, NULL, 0); + end = strtoull_suffix(str + 1, NULL, 0); if (end < *start) { printf("end < start\n"); return -1; @@ -106,7 +106,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size) if (*str == '+') { /* beginning and size given */ - *size = strtoul_suffix(str + 1, NULL, 0); + *size = strtoull_suffix(str + 1, NULL, 0); return 0; } From 7b65cb7567280b391a752646c8f37f4385b2f29e Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 18 Oct 2011 17:26:17 +0200 Subject: [PATCH 12/16] make memory display 64bit capable Signed-off-by: Sascha Hauer --- commands/mem.c | 4 ++-- include/common.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/mem.c b/commands/mem.c index 0719700b6..2b85f8248 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -55,7 +55,7 @@ static char *DEVMEM = "/dev/mem"; */ #define DISP_LINE_LEN 16 -int memory_display(char *addr, ulong offs, ulong nbytes, int size) +int memory_display(char *addr, loff_t offs, ulong nbytes, int size) { ulong linebytes, i; u_char *cp; @@ -72,7 +72,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size) u_char *ucp = (u_char *)linebuf; uint count = 52; - printf("%08lx:", offs); + printf("%08llx:", offs); linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; for (i = 0; i < linebytes; i += size) { diff --git a/include/common.h b/include/common.h index 6b02c9640..c7707bae5 100644 --- a/include/common.h +++ b/include/common.h @@ -229,7 +229,7 @@ int run_shell(void); #define PAGE_SIZE 4096 #define PAGE_SHIFT 12 -int memory_display(char *addr, ulong offs, ulong nbytes, int size); +int memory_display(char *addr, loff_t offs, ulong nbytes, int size); extern const char version_string[]; #ifdef CONFIG_BANNER From 849ce2df7ab7ea1dabbdf04f1944f378075314cf Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 18 Oct 2011 19:09:57 +0200 Subject: [PATCH 13/16] make st_size in struct stat 64 bit Signed-off-by: Sascha Hauer --- commands/ls.c | 2 +- include/linux/stat.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/ls.c b/commands/ls.c index ad609f313..fbcbadcd0 100644 --- a/commands/ls.c +++ b/commands/ls.c @@ -35,7 +35,7 @@ static void ls_one(const char *path, struct stat *s) unsigned int namelen = strlen(path); mkmodestr(s->st_mode, modestr); - printf("%s %10lu %*.*s\n", modestr, s->st_size, namelen, namelen, path); + printf("%s %10llu %*.*s\n", modestr, s->st_size, namelen, namelen, path); } int ls(const char *path, ulong flags) diff --git a/include/linux/stat.h b/include/linux/stat.h index bc7dce450..af022c5c7 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -52,7 +52,7 @@ struct stat { unsigned short st_gid; unsigned short st_rdev; unsigned short __pad2; - unsigned long st_size; + loff_t st_size; unsigned long st_blksize; unsigned long st_blocks; unsigned long st_atime; From be573120fe20e2735e8ec8db26c2f3feeec11bf4 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 19 Oct 2011 09:27:47 +0200 Subject: [PATCH 14/16] make cdev 64bit capable Next step to 64bit support: Make cdev size a 64bit type. Signed-off-by: Sascha Hauer --- common/block.c | 2 +- drivers/base/driver.c | 2 +- fs/devfs-core.c | 9 +++++---- fs/devfs.c | 4 ++-- fs/fs.c | 2 +- include/driver.h | 10 +++++----- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/common/block.c b/common/block.c index 1db06cc98..e40374f79 100644 --- a/common/block.c +++ b/common/block.c @@ -338,7 +338,7 @@ static struct file_operations block_ops = { int blockdevice_register(struct block_device *blk) { - size_t size = blk->num_blocks * BLOCKSIZE(blk); + loff_t size = (loff_t)blk->num_blocks * BLOCKSIZE(blk); int ret; int i; diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 81cedca1d..a5c6fb929 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -339,7 +339,7 @@ static int do_devinfo_subtree(struct device_d *dev, int depth) list_for_each_entry(cdev, &dev->cdevs, devices_list) { for (i = 0; i < depth + 1; i++) printf(" "); - printf("`---- 0x%08lx-0x%08lx: /dev/%s\n", + printf("`---- 0x%08llx-0x%08llx: /dev/%s\n", cdev->offset, cdev->offset + cdev->size - 1, cdev->name); diff --git a/fs/devfs-core.c b/fs/devfs-core.c index 6a56d34f2..b66965e39 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -96,7 +96,7 @@ void cdev_close(struct cdev *cdev) cdev->ops->close(cdev); } -ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) +ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags) { if (!cdev->ops->read) return -ENOSYS; @@ -104,7 +104,7 @@ ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulon return cdev->ops->read(cdev, buf, count, cdev->offset +offset, flags); } -ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) +ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { if (!cdev->ops->write) return -ENOSYS; @@ -165,10 +165,11 @@ static int partition_ioctl(struct cdev *cdev, int request, void *buf) case MEMGETREGIONINFO: if (cdev->mtd) { struct region_info_user *reg = buf; + int erasesize_shift = ffs(cdev->mtd->erasesize) - 1; reg->offset = cdev->offset; reg->erasesize = cdev->mtd->erasesize; - reg->numblocks = cdev->size/reg->erasesize; + reg->numblocks = cdev->size >> erasesize_shift; reg->regionindex = cdev->mtd->index; } break; @@ -191,7 +192,7 @@ int cdev_ioctl(struct cdev *cdev, int request, void *buf) return cdev->ops->ioctl(cdev, request, buf); } -int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset) +int cdev_erase(struct cdev *cdev, size_t count, loff_t offset) { if (!cdev->ops->erase) return -ENOSYS; diff --git a/fs/devfs.c b/fs/devfs.c index 863f4ec33..5aace362e 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -55,7 +55,7 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s static loff_t devfs_lseek(struct device_d *_dev, FILE *f, loff_t pos) { struct cdev *cdev = f->inode; - off_t ret = -1; + loff_t ret = -1; if (cdev->ops->lseek) ret = cdev->ops->lseek(cdev, pos + cdev->offset); @@ -100,7 +100,7 @@ static int devfs_memmap(struct device_d *_dev, FILE *f, void **map, int flags) ret = cdev->ops->memmap(cdev, map, flags); if (!ret) - *map = (void *)((unsigned long)*map + cdev->offset); + *map = (void *)((unsigned long)*map + (unsigned long)cdev->offset); return ret; } diff --git a/fs/fs.c b/fs/fs.c index 6d1d70390..7dd6c0381 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -697,7 +697,7 @@ loff_t lseek(int fildes, loff_t offset, int whence) struct device_d *dev; struct fs_driver_d *fsdrv; FILE *f = &files[fildes]; - off_t pos; + loff_t pos; int ret; if (check_fd(fildes)) diff --git a/include/driver.h b/include/driver.h index 4a8d48a87..0b6d1b30c 100644 --- a/include/driver.h +++ b/include/driver.h @@ -395,8 +395,8 @@ struct cdev { struct list_head list; struct list_head devices_list; char *name; - unsigned long offset; - size_t size; + loff_t offset; + loff_t size; unsigned int flags; int open; struct mtd_info *mtd; @@ -409,10 +409,10 @@ struct cdev *cdev_by_name(const char *filename); struct cdev *cdev_open(const char *name, unsigned long flags); void cdev_close(struct cdev *cdev); int cdev_flush(struct cdev *cdev); -ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags); -ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags); +ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags); +ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags); int cdev_ioctl(struct cdev *cdev, int cmd, void *buf); -int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset); +int cdev_erase(struct cdev *cdev, size_t count, loff_t offset); #define DEVFS_PARTITION_FIXED (1 << 0) #define DEVFS_PARTITION_READONLY (1 << 1) From aece3fb42c16ad826804fa65675890611709c11d Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 13 Apr 2012 16:20:35 +0200 Subject: [PATCH 15/16] memory commands: Make 64bit capable Signed-off-by: Sascha Hauer --- commands/mem.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/commands/mem.c b/commands/mem.c index 2b85f8248..b8e3bc43b 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -43,7 +43,7 @@ #define PRINTF(fmt,args...) #endif -#define RW_BUF_SIZE (ulong)4096 +#define RW_BUF_SIZE 4096 static char *rw_buf; static char *DEVMEM = "/dev/mem"; @@ -108,7 +108,7 @@ int memory_display(char *addr, loff_t offs, ulong nbytes, int size) return 0; } -static int open_and_lseek(const char *filename, int mode, off_t pos) +static int open_and_lseek(const char *filename, int mode, loff_t pos) { int fd, ret; @@ -240,7 +240,7 @@ static int do_mem_mw(int argc, char *argv[]) int fd; char *filename = DEVMEM; int mode = O_RWSIZE_4; - ulong adr; + loff_t adr; if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &filename) < 0) return 1; @@ -248,7 +248,7 @@ static int do_mem_mw(int argc, char *argv[]) if (optind + 1 >= argc) return COMMAND_ERROR_USAGE; - adr = strtoul_suffix(argv[optind++], NULL, 0); + adr = strtoull_suffix(argv[optind++], NULL, 0); fd = open_and_lseek(filename, mode | O_WRONLY, adr); if (fd < 0) @@ -300,7 +300,7 @@ BAREBOX_CMD_END static int do_mem_cmp(int argc, char *argv[]) { - ulong addr1, addr2, count = ~0; + loff_t addr1, addr2, count = ~0; int mode = O_RWSIZE_1; char *sourcefile = DEVMEM; char *destfile = DEVMEM; @@ -316,8 +316,8 @@ static int do_mem_cmp(int argc, char *argv[]) if (optind + 2 > argc) return COMMAND_ERROR_USAGE; - addr1 = strtoul_suffix(argv[optind], NULL, 0); - addr2 = strtoul_suffix(argv[optind + 1], NULL, 0); + addr1 = strtoull_suffix(argv[optind], NULL, 0); + addr2 = strtoull_suffix(argv[optind + 1], NULL, 0); if (optind + 2 == argc) { if (sourcefile == DEVMEM) { @@ -330,7 +330,7 @@ static int do_mem_cmp(int argc, char *argv[]) } count = statbuf.st_size - addr1; } else { - count = strtoul_suffix(argv[optind + 2], NULL, 0); + count = strtoull_suffix(argv[optind + 2], NULL, 0); } sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, addr1); @@ -348,7 +348,7 @@ static int do_mem_cmp(int argc, char *argv[]) while (count > 0) { int now, r1, r2, i; - now = min(RW_BUF_SIZE, count); + now = min((loff_t)RW_BUF_SIZE, count); r1 = read(sourcefd, rw_buf, now); if (r1 < 0) { @@ -409,8 +409,7 @@ BAREBOX_CMD_END static int do_mem_cp(int argc, char *argv[]) { - ulong count; - ulong dest, src; + loff_t count, dest, src; char *sourcefile = DEVMEM; char *destfile = DEVMEM; int sourcefd, destfd; @@ -424,8 +423,8 @@ static int do_mem_cp(int argc, char *argv[]) if (optind + 2 > argc) return COMMAND_ERROR_USAGE; - src = strtoul_suffix(argv[optind], NULL, 0); - dest = strtoul_suffix(argv[optind + 1], NULL, 0); + src = strtoull_suffix(argv[optind], NULL, 0); + dest = strtoull_suffix(argv[optind + 1], NULL, 0); if (optind + 2 == argc) { if (sourcefile == DEVMEM) { @@ -438,7 +437,7 @@ static int do_mem_cp(int argc, char *argv[]) } count = statbuf.st_size - src; } else { - count = strtoul_suffix(argv[optind + 2], NULL, 0); + count = strtoull_suffix(argv[optind + 2], NULL, 0); } sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, src); @@ -454,7 +453,7 @@ static int do_mem_cp(int argc, char *argv[]) while (count > 0) { int now, r, w, tmp; - now = min(RW_BUF_SIZE, count); + now = min((loff_t)RW_BUF_SIZE, count); r = read(sourcefd, rw_buf, now); if (r < 0) { @@ -516,7 +515,7 @@ BAREBOX_CMD_END static int do_memset(int argc, char *argv[]) { - ulong s, c, n; + loff_t s, c, n; int fd; char *buf; int mode = O_RWSIZE_1; @@ -529,9 +528,9 @@ static int do_memset(int argc, char *argv[]) if (optind + 3 > argc) return COMMAND_ERROR_USAGE; - s = strtoul_suffix(argv[optind], NULL, 0); - c = strtoul_suffix(argv[optind + 1], NULL, 0); - n = strtoul_suffix(argv[optind + 2], NULL, 0); + s = strtoull_suffix(argv[optind], NULL, 0); + c = strtoull_suffix(argv[optind + 1], NULL, 0); + n = strtoull_suffix(argv[optind + 2], NULL, 0); fd = open_and_lseek(file, mode | O_WRONLY, s); if (fd < 0) @@ -543,7 +542,7 @@ static int do_memset(int argc, char *argv[]) while (n > 0) { int now; - now = min(RW_BUF_SIZE, n); + now = min((loff_t)RW_BUF_SIZE, n); ret = write(fd, buf, now); if (ret < 0) { From cfcfc66d5486c2061316ebcdf32ef2f1ecbda433 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 22 Jun 2012 14:33:46 +0200 Subject: [PATCH 16/16] partitions: Make 64bit capable Signed-off-by: Sascha Hauer --- common/partitions.c | 29 ----------------------------- fs/devfs-core.c | 2 +- include/driver.h | 2 +- include/partition.h | 2 +- 4 files changed, 3 insertions(+), 32 deletions(-) diff --git a/common/partitions.c b/common/partitions.c index 74b4f1201..a8c9625db 100644 --- a/common/partitions.c +++ b/common/partitions.c @@ -42,23 +42,6 @@ struct partition_desc { struct partition parts[8]; }; -/** - * Reject values which cannot be used in Barebox - * @param val Value to be check - * @return 0 if value can be used in Barebox, -EINVAL if not - * - * @note this routine can be removed when Barebox uses file offsets larger - * than 32 bit - */ -static int check_offset_value(uint64_t val) -{ -#if 1 /* until Barebox can handle 64 bit offsets */ - if (val > (__INT_MAX__ / SECTOR_SIZE)) - return -EINVAL; -#endif - return 0; -} - /** * Guess the size of the disk, based on the partition table entries * @param dev device to create partitions for @@ -76,12 +59,6 @@ static int disk_guess_size(struct device_d *dev, struct partition_entry *table) size += get_unaligned(&table[i].partition_size); } } - /* limit disk sector counts we can't handle due to 32 bit limits */ - if (check_offset_value(size) != 0) { - dev_warn(dev, "Warning: Sector count limited due to 31 bit" - "contraints\n"); - size = __INT_MAX__ / SECTOR_SIZE; - } return (int)size; } @@ -126,12 +103,6 @@ static void __maybe_unused try_dos_partition(struct block_device *blk, pentry.first_sec = get_unaligned(&table[i].partition_start); pentry.size = get_unaligned(&table[i].partition_size); - /* do we have to ignore this partition due to limitations? */ - if (check_offset_value(pentry.first_sec) != 0) - continue; - if (check_offset_value(pentry.size) != 0) - continue; - if (pentry.first_sec != 0) { pd->parts[pd->used_entries].first_sec = pentry.first_sec; pd->parts[pd->used_entries].size = pentry.size; diff --git a/fs/devfs-core.c b/fs/devfs-core.c index b66965e39..cdb8f7933 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -227,7 +227,7 @@ int devfs_remove(struct cdev *cdev) return 0; } -int devfs_add_partition(const char *devname, unsigned long offset, size_t size, +int devfs_add_partition(const char *devname, loff_t offset, loff_t size, int flags, const char *name) { struct cdev *cdev, *new; diff --git a/include/driver.h b/include/driver.h index 0b6d1b30c..eacd8e681 100644 --- a/include/driver.h +++ b/include/driver.h @@ -418,7 +418,7 @@ int cdev_erase(struct cdev *cdev, size_t count, loff_t offset); #define DEVFS_PARTITION_READONLY (1 << 1) #define DEVFS_IS_PARTITION (1 << 2) -int devfs_add_partition(const char *devname, unsigned long offset, size_t size, +int devfs_add_partition(const char *devname, loff_t offset, loff_t size, int flags, const char *name); int devfs_del_partition(const char *name); diff --git a/include/partition.h b/include/partition.h index 0827bb40c..8ad7490d8 100644 --- a/include/partition.h +++ b/include/partition.h @@ -8,7 +8,7 @@ struct partition { int flags; - unsigned long offset; + loff_t offset; struct device_d *physdev; struct device_d device;