seqbuf
static void seqbuf_init(struct seqbuf *seqbuf, void *buf, size_t size)
seqbuf->buf = buf;
seqbuf->size = size;
seqbuf->pos = 0;
static size_t seqbuf_avail(struct seqbuf *seqbuf)
return seqbuf->pos < seqbuf->size ? seqbuf->size - seqbuf->pos : 0;
static size_t seqbuf_status(struct seqbuf *seqbuf)
return seqbuf->pos <= seqbuf->size ? 0 : -EOVERFLOW;
static int seqbuf_eof(struct seqbuf *seqbuf)
return seqbuf->pos >= seqbuf->size;
struct seqbuf seqbuf;
static int seqbuf_read(struct seqbuf *seqbuf, void *buf, size_t nbyte)
seqbuf_init(&seqbuf, buf, dsize);
while (!seqbuf_eof(&seqbuf)) {
err = seqbuf_read_u32(&seqbuf, &attrs);
err = seqbuf_read_str(&seqbuf, &name);
nbyte = min(nbyte, seqbuf_avail(seqbuf));
memcpy(buf, seqbuf->buf + seqbuf->pos, nbyte);
seqbuf->pos += nbyte;
return seqbuf_status(seqbuf);
static int seqbuf_read_u32(struct seqbuf *seqbuf, u32 *v)
return seqbuf_read(seqbuf, v, 4);
static int seqbuf_read_str(struct seqbuf *seqbuf, const char **str)
*str = seqbuf->buf + seqbuf->pos;
seqbuf->pos += strnlen(*str, seqbuf_avail(seqbuf));
seqbuf->pos++;
return seqbuf_status(seqbuf);
static void seqbuf_seek(struct seqbuf *seqbuf, ssize_t offset)
seqbuf->pos += offset;
static int bpmp_populate_dir(struct tegra_bpmp *bpmp, struct seqbuf *seqbuf,
while (!seqbuf_eof(seqbuf)) {
err = seqbuf_read_u32(seqbuf, &d);
seqbuf_seek(seqbuf, -4);
err = seqbuf_read_u32(seqbuf, &t);
err = seqbuf_read_str(seqbuf, &name);
err = bpmp_populate_dir(bpmp, seqbuf, dentry, depth+1);
struct seqbuf seqbuf;
seqbuf_init(&seqbuf, virt, nbytes);
err = bpmp_populate_dir(bpmp, &seqbuf, bpmp->debugfs_mirror, 0);