aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-read.c78
1 files changed, 72 insertions, 6 deletions
diff --git a/trace-read.c b/trace-read.c
index d37636a..f65043b 100644
--- a/trace-read.c
+++ b/trace-read.c
@@ -18,6 +18,7 @@
18 * 18 *
19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 */ 20 */
21#define _LARGEFILE64_SOURCE
21#define _GNU_SOURCE 22#define _GNU_SOURCE
22#include <dirent.h> 23#include <dirent.h>
23#include <stdio.h> 24#include <stdio.h>
@@ -39,6 +40,8 @@
39 40
40static int input_fd; 41static int input_fd;
41 42
43static int read_page;
44
42static int file_bigendian; 45static int file_bigendian;
43static int host_bigendian; 46static int host_bigendian;
44static int long_size; 47static int long_size;
@@ -286,6 +289,27 @@ struct cpu_data {
286static int cpus; 289static int cpus;
287static struct cpu_data *cpu_data; 290static struct cpu_data *cpu_data;
288 291
292static void init_read(int cpu)
293{
294 off64_t ret;
295 off64_t save_seek;
296
297 cpu_data[cpu].page = malloc_or_die(PAGE_SIZE);
298
299 /* other parts of the code may expect the pointer to not move */
300 save_seek = lseek64(input_fd, 0, SEEK_CUR);
301
302 ret = lseek64(input_fd, (off64_t)cpu_data[cpu].offset, SEEK_SET);
303 if (ret < 0)
304 die("failed to lseek");
305 ret = read(input_fd, cpu_data[cpu].page, PAGE_SIZE);
306 if (ret < 0)
307 die("failed to read page");
308
309 /* reset the file pointer back */
310 lseek64(input_fd, save_seek, SEEK_SET);
311}
312
289static void init_cpu(int cpu) 313static void init_cpu(int cpu)
290{ 314{
291 if (!cpu_data[cpu].size) { 315 if (!cpu_data[cpu].size) {
@@ -293,27 +317,69 @@ static void init_cpu(int cpu)
293 return; 317 return;
294 } 318 }
295 319
320 if (read_page) {
321 init_read(cpu);
322 return;
323 }
324
296 cpu_data[cpu].page = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, 325 cpu_data[cpu].page = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE,
297 input_fd, cpu_data[cpu].offset); 326 input_fd, cpu_data[cpu].offset);
298 if (cpu_data[cpu].page == MAP_FAILED) 327 if (cpu_data[cpu].page == MAP_FAILED) {
299 die("failed to mmap cpu %d at offset 0x%llx", 328 /* fall back to just reading pages */
300 cpu, cpu_data[cpu].offset); 329 fprintf(stderr, "Can not mmap file, will read instead\n");
330 read_page = 1;
331
332 init_read(cpu);
333 }
334}
335
336static void update_cpu_data_index(int cpu)
337{
338 cpu_data[cpu].offset += PAGE_SIZE;
339 cpu_data[cpu].size -= PAGE_SIZE;
340 cpu_data[cpu].index = 0;
301} 341}
302 342
303static void get_next_page(int cpu) 343static void get_next_page(int cpu)
304{ 344{
345 off64_t save_seek;
346 off64_t ret;
347
305 if (!cpu_data[cpu].page) 348 if (!cpu_data[cpu].page)
306 return; 349 return;
307 350
351 if (read_page) {
352 if (cpu_data[cpu].size <= PAGE_SIZE) {
353 free(cpu_data[cpu].page);
354 cpu_data[cpu].page = NULL;
355 return;
356 }
357
358 update_cpu_data_index(cpu);
359
360 /* other parts of the code may expect the pointer to not move */
361 save_seek = lseek64(input_fd, 0, SEEK_CUR);
362
363 ret = lseek64(input_fd, cpu_data[cpu].offset, SEEK_SET);
364 if (ret < 0)
365 die("failed to lseek");
366 ret = read(input_fd, cpu_data[cpu].page, PAGE_SIZE);
367 if (ret < 0)
368 die("failed to read page");
369
370 /* reset the file pointer back */
371 lseek64(input_fd, save_seek, SEEK_SET);
372
373 return;
374 }
375
308 munmap(cpu_data[cpu].page, PAGE_SIZE); 376 munmap(cpu_data[cpu].page, PAGE_SIZE);
309 cpu_data[cpu].page = NULL; 377 cpu_data[cpu].page = NULL;
310 378
311 if (cpu_data[cpu].size <= PAGE_SIZE) 379 if (cpu_data[cpu].size <= PAGE_SIZE)
312 return; 380 return;
313 381
314 cpu_data[cpu].offset += PAGE_SIZE; 382 update_cpu_data_index(cpu);
315 cpu_data[cpu].size -= PAGE_SIZE;
316 cpu_data[cpu].index = 0;
317 383
318 cpu_data[cpu].page = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, 384 cpu_data[cpu].page = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE,
319 input_fd, cpu_data[cpu].offset); 385 input_fd, cpu_data[cpu].offset);