Lines Matching refs:r

15 void freader_init_from_file(struct freader *r, void *buf, u32 buf_sz,  in freader_init_from_file()  argument
18 memset(r, 0, sizeof(*r)); in freader_init_from_file()
19 r->buf = buf; in freader_init_from_file()
20 r->buf_sz = buf_sz; in freader_init_from_file()
21 r->file = file; in freader_init_from_file()
22 r->may_fault = may_fault; in freader_init_from_file()
25 void freader_init_from_mem(struct freader *r, const char *data, u64 data_sz) in freader_init_from_mem() argument
27 memset(r, 0, sizeof(*r)); in freader_init_from_mem()
28 r->data = data; in freader_init_from_mem()
29 r->data_sz = data_sz; in freader_init_from_mem()
32 static void freader_put_folio(struct freader *r) in freader_put_folio() argument
34 if (!r->folio) in freader_put_folio()
36 kunmap_local(r->addr); in freader_put_folio()
37 folio_put(r->folio); in freader_put_folio()
38 r->folio = NULL; in freader_put_folio()
41 static int freader_get_folio(struct freader *r, loff_t file_off) in freader_get_folio() argument
44 if (r->folio && file_off >= r->folio_off && in freader_get_folio()
45 file_off < r->folio_off + folio_size(r->folio)) in freader_get_folio()
48 freader_put_folio(r); in freader_get_folio()
51 r->folio = filemap_get_folio(r->file->f_mapping, file_off >> PAGE_SHIFT); in freader_get_folio()
53 if (IS_ERR(r->folio) || !folio_test_uptodate(r->folio)) { in freader_get_folio()
54 if (!IS_ERR(r->folio)) in freader_get_folio()
55 folio_put(r->folio); in freader_get_folio()
56 r->folio = NULL; in freader_get_folio()
60 r->folio_off = folio_pos(r->folio); in freader_get_folio()
61 r->addr = kmap_local_folio(r->folio, 0); in freader_get_folio()
66 const void *freader_fetch(struct freader *r, loff_t file_off, size_t sz) in freader_fetch() argument
71 if (WARN_ON(r->buf && sz > r->buf_sz)) { in freader_fetch()
72 r->err = -E2BIG; in freader_fetch()
77 r->err = -EOVERFLOW; in freader_fetch()
82 if (!r->buf) { in freader_fetch()
83 if (file_off + sz > r->data_sz) { in freader_fetch()
84 r->err = -ERANGE; in freader_fetch()
87 return r->data + file_off; in freader_fetch()
91 if (secretmem_mapping(r->file->f_mapping)) { in freader_fetch()
92 r->err = -EFAULT; in freader_fetch()
97 if (r->may_fault) { in freader_fetch()
100 ret = __kernel_read(r->file, r->buf, sz, &file_off); in freader_fetch()
102 r->err = (ret < 0) ? ret : -EIO; in freader_fetch()
105 return r->buf; in freader_fetch()
109 r->err = freader_get_folio(r, file_off); in freader_fetch()
110 if (r->err) in freader_fetch()
117 folio_sz = folio_size(r->folio); in freader_fetch()
118 if (file_off + sz > r->folio_off + folio_sz) { in freader_fetch()
119 u64 part_sz = r->folio_off + folio_sz - file_off, off; in freader_fetch()
121 memcpy(r->buf, r->addr + file_off - r->folio_off, part_sz); in freader_fetch()
126 r->err = freader_get_folio(r, r->folio_off + folio_sz); in freader_fetch()
127 if (r->err) in freader_fetch()
129 folio_sz = folio_size(r->folio); in freader_fetch()
131 memcpy(r->buf + off, r->addr, part_sz); in freader_fetch()
135 return r->buf; in freader_fetch()
139 return r->addr + (file_off - r->folio_off); in freader_fetch()
142 void freader_cleanup(struct freader *r) in freader_cleanup() argument
144 if (!r->buf) in freader_cleanup()
147 freader_put_folio(r); in freader_cleanup()
155 static int parse_build_id(struct freader *r, unsigned char *build_id, __u32 *size, in parse_build_id() argument
168 nhdr = freader_fetch(r, note_off, sizeof(Elf32_Nhdr) + note_name_sz); in parse_build_id()
170 return r->err; in parse_build_id()
188 data = freader_fetch(r, build_id_off, desc_sz); in parse_build_id()
190 return r->err; in parse_build_id()
206 static int get_build_id_32(struct freader *r, unsigned char *build_id, __u32 *size) in get_build_id_32() argument
212 ehdr = freader_fetch(r, 0, sizeof(Elf32_Ehdr)); in get_build_id_32()
214 return r->err; in get_build_id_32()
229 phdr = freader_fetch(r, phoff + i * sizeof(Elf32_Phdr), sizeof(Elf32_Phdr)); in get_build_id_32()
231 return r->err; in get_build_id_32()
234 !parse_build_id(r, build_id, size, READ_ONCE(phdr->p_offset), in get_build_id_32()
242 static int get_build_id_64(struct freader *r, unsigned char *build_id, __u32 *size) in get_build_id_64() argument
249 ehdr = freader_fetch(r, 0, sizeof(Elf64_Ehdr)); in get_build_id_64()
251 return r->err; in get_build_id_64()
266 phdr = freader_fetch(r, phoff + i * sizeof(Elf64_Phdr), sizeof(Elf64_Phdr)); in get_build_id_64()
268 return r->err; in get_build_id_64()
271 !parse_build_id(r, build_id, size, READ_ONCE(phdr->p_offset), in get_build_id_64()
286 struct freader r; in __build_id_parse() local
294 freader_init_from_file(&r, buf, sizeof(buf), vma->vm_file, may_fault); in __build_id_parse()
297 ehdr = freader_fetch(&r, 0, offsetofend(Elf32_Ehdr, e_type)); in __build_id_parse()
299 ret = r.err; in __build_id_parse()
314 ret = get_build_id_32(&r, build_id, size); in __build_id_parse()
316 ret = get_build_id_64(&r, build_id, size); in __build_id_parse()
318 freader_cleanup(&r); in __build_id_parse()
364 struct freader r; in build_id_parse_buf() local
367 freader_init_from_mem(&r, buf, buf_size); in build_id_parse_buf()
369 err = parse_build_id(&r, build_id, NULL, 0, buf_size); in build_id_parse_buf()
371 freader_cleanup(&r); in build_id_parse_buf()