Skip to content

Instantly share code, notes, and snippets.

@iemelyanov
Created May 15, 2022 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iemelyanov/39be3a1b455c7ca6cb22588eb047fdd3 to your computer and use it in GitHub Desktop.
Save iemelyanov/39be3a1b455c7ca6cb22588eb047fdd3 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
struct paddr_val {
uint64_t paddr;
uint64_t val;
};
int paddr_val_cmp(const void *a, const void *b)
{
const struct paddr_val *q = a, *w = b;
return q->paddr - w->paddr;
}
struct paddr_val *memory_find(struct paddr_val *mem, size_t memlen, uint64_t paddr)
{
return bsearch(&(struct paddr_val){ .paddr = paddr }, mem, memlen, sizeof(*mem),
&paddr_val_cmp);
}
uint64_t tbl_rec_paddr(uint64_t tbl_rec)
{
return tbl_rec & (0x7fffffffff << 12);
}
uint64_t laddr_to_paddr(struct paddr_val *memory, size_t memlen, uint64_t laddr,
uint64_t paddr_start)
{
uint64_t l[5] = {
(((laddr >> 39) & 0x1ff) * 8),
(((laddr >> 30) & 0x1ff) * 8),
(((laddr >> 21) & 0x1ff) * 8),
(((laddr >> 12) & 0x1ff) * 8),
laddr & 0xfff,
};
uint64_t paddr = paddr_start + l[0];
for (int i = 1; i <= 4; i++) {
struct paddr_val *res = memory_find(memory, memlen, paddr);
uint64_t val = res == NULL ? 0 : res->val;
if (!(val & 1))
return -1;
paddr = tbl_rec_paddr(val);
paddr += l[i];
}
return paddr;
}
int main(int argc, char **argv)
{
int m = 0, q = 0, r = 0;
scanf("%d %d %d\n", &m, &q, &r);
struct paddr_val *memory = malloc(sizeof(*memory) * m);
for (int i = 0; i < m; i++)
scanf("%lu %lu", &memory[i].paddr, &memory[i].val);
qsort(memory, m, sizeof(*memory), &paddr_val_cmp);
uint64_t laddr = 0;
for (int i = 0; i < q; i++) {
scanf("%lu", &laddr);
int64_t paddr = laddr_to_paddr(memory, m, laddr, r);
if (paddr < 0) {
printf("fault\n");
continue;
}
printf("%ld\n", paddr);
}
free(memory);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment