kboot: Convert from getdents to getdents64

Linux 2.4 introduced getdents64. Switch to using it because aarch64
doesn't have getdents as that syscall was obsoleted before that port was
created.

Sponsored by:		Netflix
This commit is contained in:
Warner Losh 2022-07-27 22:24:50 -06:00
parent 065cbc7707
commit 3a1b966ae0
5 changed files with 29 additions and 18 deletions

View File

@ -1,6 +1,6 @@
#define SYS_close 3
#define SYS_dup 32
#define SYS_getdents 78
#define SYS_getdents64 217
#define SYS_getpid 39
#define SYS_gettimeofday 96
#define SYS_kexec_load 246

View File

@ -1,7 +1,7 @@
#define SYS_close 6
#define SYS_dup 41
#define SYS_fstat 108
#define SYS_getdents 141
#define SYS_getdents64 202
#define SYS_getpid 20
#define SYS_gettimeofday 78
#define SYS_kexec_load 268

View File

@ -131,13 +131,32 @@ struct host_kexec_segment {
int memsz;
};
struct host_dirent64 {
uint64_t d_ino; /* 64-bit inode number */
int64_t d_off; /* 64-bit offset to next structure */
unsigned short d_reclen; /* Size of this dirent */
unsigned char d_type; /* File type */
char d_name[]; /* Filename (null-terminated) */
};
/* d_type values */
#define HOST_DT_UNKNOWN 0
#define HOST_DT_FIFO 1
#define HOST_DT_CHR 2
#define HOST_DT_DIR 4
#define HOST_DT_BLK 6
#define HOST_DT_REG 8
#define HOST_DT_LNK 10
#define HOST_DT_SOCK 12
#define HOST_DT_WHT 14
/*
* System Calls
*/
int host_close(int fd);
int host_dup(int fd);
int host_fstat(int fd, struct host_kstat *sb);
int host_getdents(int fd, void *dirp, int count);
int host_getdents64(int fd, void *dirp, int count);
int host_getpid(void);
int host_gettimeofday(struct host_timeval *a, void *b);
int host_kexec_load(unsigned long entry, unsigned long nsegs, struct host_kexec_segment *segs, unsigned long flags);

View File

@ -26,9 +26,9 @@ host_fstat(int fd, struct host_kstat *sb)
}
int
host_getdents(int fd, void *dirp, int count)
host_getdents64(int fd, void *dirp, int count)
{
return host_syscall(SYS_getdents, fd, (uintptr_t)dirp, count);
return host_syscall(SYS_getdents64, fd, (uintptr_t)dirp, count);
}
int

View File

@ -40,30 +40,23 @@ add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
void *propbuf;
ssize_t proplen;
struct host_dent {
unsigned long d_fileno;
unsigned long d_off;
unsigned short d_reclen;
char d_name[];
/* uint8_t d_type; */
};
char dents[2048];
struct host_dent *dent;
struct host_dirent64 *dent;
int d_type;
fd = host_open(path, O_RDONLY, 0);
while (1) {
dentsize = host_getdents(fd, dents, sizeof(dents));
dentsize = host_getdents64(fd, dents, sizeof(dents));
if (dentsize <= 0)
break;
for (dent = (struct host_dent *)dents;
for (dent = (struct host_dirent64 *)dents;
(char *)dent < dents + dentsize;
dent = (struct host_dent *)((void *)dent + dent->d_reclen)) {
dent = (struct host_dirent64 *)((void *)dent + dent->d_reclen)) {
sprintf(subpath, "%s/%s", path, dent->d_name);
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0)
continue;
d_type = *((char *)(dent) + dent->d_reclen - 1);
d_type = dent->d_type;
if (d_type == 4 /* DT_DIR */) {
child_offset = fdt_add_subnode(buffer, fdt_offset,
dent->d_name);
@ -72,7 +65,6 @@ add_node_to_fdt(void *buffer, const char *path, int fdt_offset)
child_offset, path, dent->d_name);
continue;
}
add_node_to_fdt(buffer, subpath, child_offset);
} else {
propbuf = malloc(1024);