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(struct blk_desc
*block_dev
,
26 unsigned long start
, lbaint_t blkcnt
,
29 int dev
= block_dev
->dev
;
30 struct host_block_dev
*host_dev
= find_host_device(dev
);
34 if (os_lseek(host_dev
->fd
,
35 start
* host_dev
->blk_dev
.blksz
,
37 printf("ERROR: Invalid position\n");
40 ssize_t len
= os_read(host_dev
->fd
, buffer
,
41 blkcnt
* host_dev
->blk_dev
.blksz
);
43 return len
/ host_dev
->blk_dev
.blksz
;
47 static unsigned long host_block_write(struct blk_desc
*block_dev
,
48 unsigned long start
, lbaint_t blkcnt
,
51 int dev
= block_dev
->dev
;
52 struct host_block_dev
*host_dev
= find_host_device(dev
);
53 if (os_lseek(host_dev
->fd
,
54 start
* host_dev
->blk_dev
.blksz
,
56 printf("ERROR: Invalid position\n");
59 ssize_t len
= os_write(host_dev
->fd
, buffer
, blkcnt
*
60 host_dev
->blk_dev
.blksz
);
62 return len
/ host_dev
->blk_dev
.blksz
;
66 int host_dev_bind(int dev
, char *filename
)
68 struct host_block_dev
*host_dev
= find_host_device(dev
);
72 if (host_dev
->blk_dev
.priv
) {
73 os_close(host_dev
->fd
);
74 host_dev
->blk_dev
.priv
= NULL
;
76 if (host_dev
->filename
)
77 free(host_dev
->filename
);
78 if (filename
&& *filename
) {
79 host_dev
->filename
= strdup(filename
);
81 host_dev
->filename
= NULL
;
85 host_dev
->fd
= os_open(host_dev
->filename
, OS_O_RDWR
);
86 if (host_dev
->fd
== -1) {
87 printf("Failed to access host backing file '%s'\n",
92 struct blk_desc
*blk_dev
= &host_dev
->blk_dev
;
93 blk_dev
->if_type
= IF_TYPE_HOST
;
94 blk_dev
->priv
= host_dev
;
96 blk_dev
->lba
= os_lseek(host_dev
->fd
, 0, OS_SEEK_END
) / blk_dev
->blksz
;
97 blk_dev
->block_read
= host_block_read
;
98 blk_dev
->block_write
= host_block_write
;
100 blk_dev
->part_type
= PART_TYPE_UNKNOWN
;
106 int host_get_dev_err(int dev
, struct blk_desc
**blk_devp
)
108 struct host_block_dev
*host_dev
= find_host_device(dev
);
113 if (!host_dev
->blk_dev
.priv
)
116 *blk_devp
= &host_dev
->blk_dev
;
120 struct blk_desc
*host_get_dev(int dev
)
122 struct blk_desc
*blk_dev
;
124 if (host_get_dev_err(dev
, &blk_dev
))