lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Sun, 20 Nov 2016 11:13:35 +0100
From:   Boris Brezillon <boris.brezillon@...e-electrons.com>
To:     Daniel Walter <dwalter@...ma-star.at>
Cc:     linux-mtd@...ts.infradead.org, Richard Weinberger <richard@....at>,
        computersforpeace@...il.com, dwmw2@...radead.org,
        linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 19/46] mtd: nandsim: UAPI v1

Daniel, Richard,

On Wed, 21 Sep 2016 11:50:45 +0200
Daniel Walter <dwalter@...ma-star.at> wrote:

> From: Richard Weinberger <richard@....at>
> 
> Expose nandsim creation and delete functions
> to user-space

Did you consider using configfs for nandsim dev creation/removal. The
main benefit I see in using configfs is that you can extend the
parameters without breaking the ABI.

Here is an example of what I have in mind:

mtdsim subsystem:

 <configfs-mountpoint>/mtdsim

nand backend:

 <configfs-mountpoint>/mtdsim/nand

create and configure a new nandsim device:

 mkdir <configfs-mountpoint>/mtdsim/nand/<dev-name>
 echo xxx >  <configfs-mountpoint>/mtdsim/nand/<dev-name>/pagesize
 echo xxx >  <configfs-mountpoint>/mtdsim/nand/<dev-name>/oobsize
 ...

create and configure a partitition:

 mkdir <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>
 echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>/offset
 echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>/size

Once your done with the configuration of your nandsim device, you
can register it by doing:

 echo 1 >  <configfs-mountpoint>/mtdsim/nand/<dev-name>/enable

and unregister it with:

 echo 0 >  <configfs-mountpoint>/mtdsim/nand/<dev-name>/enable

This way, each time you need to add a new feature (bitflips emulation,
paired pages emulation, ...) or a new property, you can just add an
extra attribute to the configfs interface without breaking the previous
ABI.

I'd really prefer this solution over the nandsim_ctrl dev exposed in
/dev/.

What do you think.

> 
> Signed-off-by: Richard Weinberger <richard@....at>
> ---
>  include/uapi/mtd/nandsim-user.h | 102 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 102 insertions(+)
>  create mode 100644 include/uapi/mtd/nandsim-user.h
> 
> diff --git a/include/uapi/mtd/nandsim-user.h b/include/uapi/mtd/nandsim-user.h
> new file mode 100644
> index 0000000..b52d620
> --- /dev/null
> +++ b/include/uapi/mtd/nandsim-user.h
> @@ -0,0 +1,102 @@
> +#ifndef __NANDSIM_USER_H__
> +#define __NANDSIM_USER_H__
> +
> +#include <linux/types.h>
> +
> +#define NANDSIM_IOC_MAGIC 'n'
> +
> +#define NANDSIM_IOC_NEW_INSTANCE _IOW(NANDSIM_IOC_MAGIC, 0, struct ns_new_instance_req)
> +#define NANDSIM_IOC_DESTROY_INSTANCE _IOW(NANDSIM_IOC_MAGIC, 1, struct ns_destroy_instance_req)
> +
> +#define NANDSIM_MAX_DEVICES 32
> +#define NANDSIM_MAX_PARTS 32
> +
> +enum ns_backend_type {
> +	NANDSIM_BACKEND_RAM = 0,
> +	NANDSIM_BACKEND_CACHEFILE = 1,
> +	NANDSIM_BACKEND_FILE = 2,
> +	NANDSIM_BACKEND_MAX,
> +};
> +
> +/**
> + * struct ns_new_instance_req - Create a new nandsim instance.
> + *
> + * @id_bytes: NAND ID of the simulated NAND chip
> + * @bus_width: bus width to emulate, either 8 or 16
> + * @bbt_mode: bad block table mode, 0 OOB, 1 BBT with marker in OOB,
> + *            2 BBT with marker in data area
> + * @no_oob: backing file contains no OOB data
> + * @bch_strength: instead of hamming ECC use BCH with given strength
> + * @parts_num: number of MTD partitions to create
> + * @parts: partition sizes in physical erase blocks, used then @parts_num > 0
> + * @backend: backend type, see @ns_backend_type
> + * @file_fd: file describtor of backend, only for @NANDSIM_BACKEND_CACHEFILE
> + *           and @NANDSIM_BACKEND_FILE.
> + * @bitflips: maximum number of random bit flips per page
> + * @overridesize: specifies the NAND size overriding the ID bytes
> + * @access_delay: initial page access delay (microseconds)
> + * @program_delay: page program delay (microseconds)
> + * @erase_delay: sector erase delay (milliseconds)
> + * @output_cycle: word output, from flash, time (nanoseconds)
> + * @input_cycle: word input, to flash, time (nanoseconds)
> + * @simelem_num: number of simulation elements appened to this
> + *               data structure. see @ns_simelement_prop
> + *
> + * This struct is used with the @NANDSIM_IOC_NEW_INSTANCE ioctl command.
> + * It creates a new nandsim instance from the given parameter.
> + * The ioctl command returns in case of success the nandsim id of the new
> + * instance, in case of error a negative value.
> + *
> + * Not all fields in the struct have to be filled, if nandsim should
> + * use a default ignore the value, fill with 0.
> + * The only mandatory fields are @id_bytes and @bus_width.
> + * When @no_oob is non-zero @bch_strength cannot be used since
> + * @no_oob implies that no ECC is used.
> + */
> +struct ns_new_instance_req {
> +	__s8 id_bytes[8];
> +
> +	__s8 bus_width;
> +	__s8 bbt_mode;
> +	__s8 no_oob;
> +	__s32 bch_strength;
> +
> +	__s8 parts_num;
> +	__s32 parts[NANDSIM_MAX_PARTS];
> +
> +	__s8 backend;
> +	__s32 file_fd;
> +
> +	__s32 bitflips;
> +	__s32 overridesize;
> +	__s32 access_delay;
> +	__s32 program_delay;
> +	__s32 erase_delay;
> +	__s32 output_cycle;
> +	__s32 input_cycle;
> +
> +	__s32 padding[4];
> +
> +	__s32 simelem_num;
> +} __packed;
> +
> +enum {
> +	NANDSIM_SIMELEM_BADBLOCK = 0,
> +	NANDSIM_SIMELEM_WEAKBLOCK,
> +	NANDSIM_SIMELEM_WEAKPAGE,
> +	NANDSIM_SIMELEM_GRAVEPAGE,
> +};
> +
> +struct ns_simelement_prop {
> +	__s8 elem_type;
> +	__s32 elem_id;
> +	__s32 elem_attr;
> +	__s8 padding[7];
> +} __packed;
> +
> +struct ns_destroy_instance_req {
> +	__s8 id;
> +	__s8 padding[7];
> +} __packed;
> +
> +#endif /* __NANDSIM_USER_H__ */

Powered by blists - more mailing lists