cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

print_binary.c (1486B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include "print_binary.h"
      3#include <linux/log2.h>
      4#include <linux/ctype.h>
      5
      6int binary__fprintf(unsigned char *data, size_t len,
      7		    size_t bytes_per_line, binary__fprintf_t printer,
      8		    void *extra, FILE *fp)
      9{
     10	size_t i, j, mask;
     11	int printed = 0;
     12
     13	if (!printer)
     14		return 0;
     15
     16	bytes_per_line = roundup_pow_of_two(bytes_per_line);
     17	mask = bytes_per_line - 1;
     18
     19	printed += printer(BINARY_PRINT_DATA_BEGIN, 0, extra, fp);
     20	for (i = 0; i < len; i++) {
     21		if ((i & mask) == 0) {
     22			printed += printer(BINARY_PRINT_LINE_BEGIN, -1, extra, fp);
     23			printed += printer(BINARY_PRINT_ADDR, i, extra, fp);
     24		}
     25
     26		printed += printer(BINARY_PRINT_NUM_DATA, data[i], extra, fp);
     27
     28		if (((i & mask) == mask) || i == len - 1) {
     29			for (j = 0; j < mask-(i & mask); j++)
     30				printed += printer(BINARY_PRINT_NUM_PAD, -1, extra, fp);
     31
     32			printer(BINARY_PRINT_SEP, i, extra, fp);
     33			for (j = i & ~mask; j <= i; j++)
     34				printed += printer(BINARY_PRINT_CHAR_DATA, data[j], extra, fp);
     35			for (j = 0; j < mask-(i & mask); j++)
     36				printed += printer(BINARY_PRINT_CHAR_PAD, i, extra, fp);
     37			printed += printer(BINARY_PRINT_LINE_END, -1, extra, fp);
     38		}
     39	}
     40	printed += printer(BINARY_PRINT_DATA_END, -1, extra, fp);
     41	return printed;
     42}
     43
     44int is_printable_array(char *p, unsigned int len)
     45{
     46	unsigned int i;
     47
     48	if (!p || !len || p[len - 1] != 0)
     49		return 0;
     50
     51	len--;
     52
     53	for (i = 0; i < len && p[i]; i++) {
     54		if (!isprint(p[i]) && !isspace(p[i]))
     55			return 0;
     56	}
     57	return 1;
     58}