#include <sys/param.h>
#include "libsa.h"
#include <machine/cpu.h>
#include <sys/exec_elf.h>
static off_t rdoffs;
int
rd_iostrategy(void *f, int rw, daddr_t dblk, size_t size, void *buf,
size_t *rsize)
{
return ENXIO;
}
int
rd_ioopen(struct open_file *f, ...)
{
return 0;
}
int
rd_ioclose(struct open_file *f)
{
return 0;
}
int
rd_isvalid()
{
Elf64_Ehdr *elf64 = (Elf64_Ehdr *)INITRD_BASE;
if (memcmp(elf64->e_ident, ELFMAG, SELFMAG) != 0 ||
elf64->e_ident[EI_CLASS] != ELFCLASS64 ||
elf64->e_ident[EI_DATA] != ELFDATA2LSB ||
elf64->e_type != ET_EXEC || elf64->e_machine != EM_MIPS)
return 0;
return 1;
}
void
rd_invalidate()
{
bzero((void *)INITRD_BASE, sizeof(Elf64_Ehdr));
}
int
rdfs_open(char *path, struct open_file *f)
{
if (f->f_dev->dv_open == rd_ioopen) {
if (strcmp(path, kernelfile) == 0) {
rdoffs = 0;
return 0;
} else
return ENOENT;
}
return EINVAL;
}
int
rdfs_close(struct open_file *f)
{
return 0;
}
int
rdfs_read(struct open_file *f, void *buf, size_t size, size_t *resid)
{
if (size != 0) {
bcopy((void *)(INITRD_BASE + rdoffs), buf, size);
rdoffs += size;
}
*resid = 0;
return 0;
}
int
rdfs_write(struct open_file *f, void *buf, size_t size, size_t *resid)
{
return EROFS;
}
off_t
rdfs_seek(struct open_file *f, off_t offset, int whence)
{
switch (whence) {
case 0:
rdoffs = offset;
break;
case 1:
rdoffs += offset;
break;
default:
errno = EIO;
return -1;
}
return rdoffs;
}
int
rdfs_stat(struct open_file *f, struct stat *sb)
{
return EIO;
}
#ifndef NO_READDIR
int
rdfs_readdir(struct open_file *f, char *path)
{
return EIO;
}
#endif