2 * Copyright (C) 2013 Henrik Nordstrom <henrik@henriknordstrom.net>
4 * SPDX-License-Identifier: GPL-2.0+
12 #include <sandboxblockdev.h>
13 #include <asm/errno.h>
15 static struct host_block_dev host_devices
[CONFIG_HOST_MAX_DEVICES
];
17 static struct host_block_dev
*find_host_device(int dev
)
19 if (dev
>= 0 && dev
< CONFIG_HOST_MAX_DEVICES
)
20 return &host_devices
[dev
];
25 static unsigned long host_block_read(int dev
, unsigned long start
,
26 lbaint_t blkcnt
, void *buffer
)
28 struct host_block_dev
*host_dev
= find_host_device(dev
);
32 if (os_lseek(host_dev
->fd
,
33 start
* host_dev
->blk_dev
.blksz
,
35 printf("ERROR: Invalid position\n");
38 ssize_t len
= os_read(host_dev
->fd
, buffer
,
39 blkcnt
* host_dev
->blk_dev
.blksz
);
41 return len
/ host_dev
->blk_dev
.blksz
;
45 static unsigned long host_block_write(int dev
, unsigned long start
,
46 lbaint_t blkcnt
, const void *buffer
)
48 struct host_block_dev
*host_dev
= find_host_device(dev
);
49 if (os_lseek(host_dev
->fd
,
50 start
* host_dev
->blk_dev
.blksz
,
52 printf("ERROR: Invalid position\n");
55 ssize_t len
= os_write(host_dev
->fd
, buffer
, blkcnt
*
56 host_dev
->blk_dev
.blksz
);
58 return len
/ host_dev
->blk_dev
.blksz
;
62 int host_dev_bind(int dev
, char *filename
)
64 struct host_block_dev
*host_dev
= find_host_device(dev
);
68 if (host_dev
->blk_dev
.priv
) {
69 os_close(host_dev
->fd
);
70 host_dev
->blk_dev
.priv
= NULL
;
72 if (host_dev
->filename
)
73 free(host_dev
->filename
);
74 if (filename
&& *filename
) {
75 host_dev
->filename
= strdup(filename
);
77 host_dev
->filename
= NULL
;
81 host_dev
->fd
= os_open(host_dev
->filename
, OS_O_RDWR
);
82 if (host_dev
->fd
== -1) {
83 printf("Failed to access host backing file '%s'\n",
88 block_dev_desc_t
*blk_dev
= &host_dev
->blk_dev
;
89 blk_dev
->if_type
= IF_TYPE_HOST
;
90 blk_dev
->priv
= host_dev
;
92 blk_dev
->lba
= os_lseek(host_dev
->fd
, 0, OS_SEEK_END
) / blk_dev
->blksz
;
93 blk_dev
->block_read
= host_block_read
;
94 blk_dev
->block_write
= host_block_write
;
96 blk_dev
->part_type
= PART_TYPE_UNKNOWN
;
102 int host_get_dev_err(int dev
, block_dev_desc_t
**blk_devp
)
104 struct host_block_dev
*host_dev
= find_host_device(dev
);
109 if (!host_dev
->blk_dev
.priv
)
112 *blk_devp
= &host_dev
->blk_dev
;
116 block_dev_desc_t
*host_get_dev(int dev
)
118 block_dev_desc_t
*blk_dev
;
120 if (host_get_dev_err(dev
, &blk_dev
))