103 lines
1.9 KiB
C
103 lines
1.9 KiB
C
|
|
||
|
#include "util.h"
|
||
|
|
||
|
/* Measure the time it takes to access a block with virtual address addr. */
|
||
|
CYCLES measure_one_block_access_time(ADDR_PTR addr)
|
||
|
{
|
||
|
CYCLES cycles;
|
||
|
|
||
|
asm volatile("mov %1, %%r8\n\t"
|
||
|
"lfence\n\t"
|
||
|
"rdtsc\n\t"
|
||
|
"mov %%eax, %%edi\n\t"
|
||
|
"mov (%%r8), %%r8\n\t"
|
||
|
"lfence\n\t"
|
||
|
"rdtsc\n\t"
|
||
|
"sub %%edi, %%eax\n\t"
|
||
|
: "=a"(cycles) /*output*/
|
||
|
: "r"(addr)
|
||
|
: "r8", "edi");
|
||
|
|
||
|
return cycles;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* CLFlushes the given address.
|
||
|
*
|
||
|
* Note: clflush is provided to help you debug and should not be used in your
|
||
|
* final submission
|
||
|
*/
|
||
|
void clflush(ADDR_PTR addr)
|
||
|
{
|
||
|
asm volatile ("clflush (%0)"::"r"(addr));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Converts a string to its binary representation.
|
||
|
*/
|
||
|
char *string_to_binary(char *s)
|
||
|
{
|
||
|
if (s == NULL)
|
||
|
return 0; /* no input string */
|
||
|
|
||
|
size_t len = strlen(s);
|
||
|
|
||
|
// Each char is one byte (8 bits) and + 1 at the end for null terminator
|
||
|
char *binary = malloc(len * 8 + 1);
|
||
|
binary[len] = '\0';
|
||
|
|
||
|
for (size_t i = 0; i < len; ++i)
|
||
|
{
|
||
|
char ch = s[i];
|
||
|
for (int j = 7; j >= 0; --j)
|
||
|
{
|
||
|
if (ch & (1 << j))
|
||
|
{
|
||
|
strcat(binary, "1");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcat(binary, "0");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return binary;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Converts a binary string to its ASCII representation.
|
||
|
*/
|
||
|
char *binary_to_string(char *data)
|
||
|
{
|
||
|
// Each char is 8 bits
|
||
|
size_t msg_len = strlen(data) / 8;
|
||
|
|
||
|
// Add one for null terminator at the end
|
||
|
char *msg = malloc(msg_len + 1);
|
||
|
msg[msg_len] = '\0';
|
||
|
|
||
|
for (int i = 0; i < msg_len; i++)
|
||
|
{
|
||
|
char tmp[8];
|
||
|
int k = 0;
|
||
|
|
||
|
for (int j = i * 8; j < ((i + 1) * 8); j++)
|
||
|
{
|
||
|
tmp[k++] = data[j];
|
||
|
}
|
||
|
|
||
|
msg[i] = strtol(tmp, 0, 2);
|
||
|
}
|
||
|
|
||
|
return msg;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Converts a string to integer
|
||
|
*/
|
||
|
int string_to_int(char* s)
|
||
|
{
|
||
|
return atoi(s);
|
||
|
}
|