Changeset View
Changeset View
Standalone View
Standalone View
stand/userboot/test/test.c
Show First 20 Lines • Show All 255 Lines • ▼ Show 20 Lines | test_diskread(void *arg, int unit, uint64_t offset, void *dst, size_t size, | ||||
n = pread(disk_fd[unit], dst, size, offset); | n = pread(disk_fd[unit], dst, size, offset); | ||||
if (n < 0) | if (n < 0) | ||||
return (errno); | return (errno); | ||||
*resid_return = size - n; | *resid_return = size - n; | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
test_diskwrite(void *arg, int unit, uint64_t offset, void *src, size_t size, | |||||
size_t *resid_return) | |||||
{ | |||||
ssize_t n; | |||||
if (unit > disk_index || disk_fd[unit] == -1) | |||||
return (EIO); | |||||
n = pwrite(disk_fd[unit], src, size, offset); | |||||
if (n < 0) | |||||
return (errno); | |||||
*resid_return = size - n; | |||||
return (0); | |||||
} | |||||
int | |||||
test_diskioctl(void *arg, int unit, u_long cmd, void *data) | test_diskioctl(void *arg, int unit, u_long cmd, void *data) | ||||
{ | { | ||||
struct stat sb; | struct stat sb; | ||||
if (unit > disk_index || disk_fd[unit] == -1) | if (unit > disk_index || disk_fd[unit] == -1) | ||||
return (EBADF); | return (EBADF); | ||||
switch (cmd) { | switch (cmd) { | ||||
case DIOCGSECTORSIZE: | case DIOCGSECTORSIZE: | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | struct loader_callbacks cb = { | ||||
.close = test_close, | .close = test_close, | ||||
.isdir = test_isdir, | .isdir = test_isdir, | ||||
.read = test_read, | .read = test_read, | ||||
.readdir = test_readdir, | .readdir = test_readdir, | ||||
.seek = test_seek, | .seek = test_seek, | ||||
.stat = test_stat, | .stat = test_stat, | ||||
.diskread = test_diskread, | .diskread = test_diskread, | ||||
.diskwrite = test_diskwrite, | |||||
.diskioctl = test_diskioctl, | .diskioctl = test_diskioctl, | ||||
.copyin = test_copyin, | .copyin = test_copyin, | ||||
.copyout = test_copyout, | .copyout = test_copyout, | ||||
.setreg = test_setreg, | .setreg = test_setreg, | ||||
.setmsr = test_setmsr, | .setmsr = test_setmsr, | ||||
.setcr = test_setcr, | .setcr = test_setcr, | ||||
.setgdt = test_setgdt, | .setgdt = test_setgdt, | ||||
Show All 16 Lines | |||||
int | int | ||||
main(int argc, char** argv) | main(int argc, char** argv) | ||||
{ | { | ||||
void *h; | void *h; | ||||
void (*func)(struct loader_callbacks *, void *, int, int) __dead2; | void (*func)(struct loader_callbacks *, void *, int, int) __dead2; | ||||
int opt; | int opt; | ||||
const char *userboot_obj = "/boot/userboot.so"; | const char *userboot_obj = "/boot/userboot.so"; | ||||
int oflag = O_RDONLY; | |||||
while ((opt = getopt(argc, argv, "b:d:h:")) != -1) { | while ((opt = getopt(argc, argv, "wb:d:h:")) != -1) { | ||||
switch (opt) { | switch (opt) { | ||||
case 'b': | case 'b': | ||||
userboot_obj = optarg; | userboot_obj = optarg; | ||||
break; | break; | ||||
case 'd': | case 'd': | ||||
disk_index++; | disk_index++; | ||||
disk_fd = reallocarray(disk_fd, disk_index + 1, | disk_fd = reallocarray(disk_fd, disk_index + 1, | ||||
sizeof (int)); | sizeof (int)); | ||||
disk_fd[disk_index] = open(optarg, O_RDONLY); | disk_fd[disk_index] = open(optarg, oflag); | ||||
if (disk_fd[disk_index] < 0) | if (disk_fd[disk_index] < 0) | ||||
err(1, "Can't open disk image '%s'", optarg); | err(1, "Can't open disk image '%s'", optarg); | ||||
break; | break; | ||||
case 'h': | case 'h': | ||||
host_base = optarg; | host_base = optarg; | ||||
break; | |||||
case 'w': | |||||
oflag = O_RDWR; | |||||
break; | break; | ||||
case '?': | case '?': | ||||
usage(); | usage(); | ||||
} | } | ||||
} | } | ||||
h = dlopen(userboot_obj, RTLD_LOCAL); | h = dlopen(userboot_obj, RTLD_LOCAL); | ||||
Show All 21 Lines |