userland: make build perfect

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2019-05-05 00:00:00 +00:00
parent 8618025682
commit 1d766fe3d7
16 changed files with 49 additions and 47 deletions

View File

@@ -1,13 +0,0 @@
#include <lkmc.h>
int main(void) {
int i, j, k;
i = 1;
/* test-gdb-op1 */
j = 2;
/* test-gdb-op2 */
k = i + j;
/* test-gdb-result */
if (k != 3)
lkmc_assert_fail();
}

1
baremetal/add.c Symbolic link
View File

@@ -0,0 +1 @@
../lkmc/add.c

View File

@@ -1,9 +0,0 @@
def test(self):
self.sendline('tbreak main')
self.sendline('continue')
self.continue_to('op1')
assert self.get_int('i') == 1
self.continue_to('op2')
assert self.get_int('j') == 2
self.continue_to('result')
assert self.get_int('k') == 3

1
baremetal/add.py Symbolic link
View File

@@ -0,0 +1 @@
../lkmc/add.py

View File

@@ -1,6 +0,0 @@
#include <lkmc.h>
int main(void) {
lkmc_assert_fail();
}

View File

@@ -0,0 +1 @@
../../lkmc/assert_fail.c

13
lkmc/add.c Normal file
View File

@@ -0,0 +1,13 @@
#include <lkmc.h>
int main(void) {
int i, j, k;
i = 1;
/* test-gdb-op1 */
j = 2;
/* test-gdb-op2 */
k = i + j;
/* test-gdb-result */
if (k != 3)
lkmc_assert_fail();
}

9
lkmc/add.py Normal file
View File

@@ -0,0 +1,9 @@
def test(self):
self.sendline('tbreak main')
self.sendline('continue')
self.continue_to('op1')
assert self.get_int('i') == 1
self.continue_to('op2')
assert self.get_int('j') == 2
self.continue_to('result')
assert self.get_int('k') == 3

5
lkmc/assert_fail.c Normal file
View File

@@ -0,0 +1,5 @@
#include <lkmc.h>
int main(void) {
lkmc_assert_fail();
}

View File

@@ -1,5 +1,5 @@
#ifndef COMMON_H
#define COMMON_H
#ifndef LKMC_PAGEMAP_H
#define LKMC_PAGEMAP_H
#define _XOPEN_SOURCE 700
#include <fcntl.h> /* open */
@@ -17,7 +17,7 @@ typedef struct {
unsigned int file_page : 1;
unsigned int swapped : 1;
unsigned int present : 1;
} PagemapEntry;
} LkmcPagemapEntry;
/* Parse the pagemap entry for the given virtual address.
*
@@ -26,7 +26,7 @@ typedef struct {
* @param[in] vaddr virtual address to get entry for
* @return 0 for success, 1 for failure
*/
int pagemap_get_entry(PagemapEntry *entry, int pagemap_fd, uintptr_t vaddr) {
int lkmc_pagemap_get_entry(LkmcPagemapEntry *entry, int pagemap_fd, uintptr_t vaddr) {
size_t nread;
ssize_t ret;
uint64_t data;
@@ -61,7 +61,7 @@ int pagemap_get_entry(PagemapEntry *entry, int pagemap_fd, uintptr_t vaddr) {
* @param[in] vaddr virtual address to get entry for
* @return 0 for success, 1 for failure
*/
int virt_to_phys_user(uintptr_t *paddr, pid_t pid, uintptr_t vaddr) {
int lkmc_pagemap_virt_to_phys_user(uintptr_t *paddr, pid_t pid, uintptr_t vaddr) {
char pagemap_file[BUFSIZ];
int pagemap_fd;
@@ -70,8 +70,8 @@ int virt_to_phys_user(uintptr_t *paddr, pid_t pid, uintptr_t vaddr) {
if (pagemap_fd < 0) {
return 1;
}
PagemapEntry entry;
if (pagemap_get_entry(&entry, pagemap_fd, vaddr)) {
LkmcPagemapEntry entry;
if (lkmc_pagemap_get_entry(&entry, pagemap_fd, vaddr)) {
return 1;
}
close(pagemap_fd);

View File

@@ -1 +0,0 @@
../baremetal/add.c

View File

@@ -1 +0,0 @@
../baremetal/add.py

View File

@@ -1 +0,0 @@
../baremetal/interactive/assert_fail.c

1
userland/c/add.c Symbolic link
View File

@@ -0,0 +1 @@
../../lkmc/add.c

1
userland/c/add.py Symbolic link
View File

@@ -0,0 +1 @@
../../lkmc/add.py

1
userland/c/assert_fail.c Symbolic link
View File

@@ -0,0 +1 @@
../../lkmc/assert_fail.c

View File

@@ -10,7 +10,7 @@
#include <sys/mman.h>
#include <unistd.h> /* sysconf */
#include <userland/common.h> /* virt_to_phys_user */
#include <lkmc/pagemap.h> /* lkmc_pagemap_virt_to_phys_user */
enum { BUFFER_SIZE = 4 };
@@ -62,9 +62,9 @@ int main(int argc, char **argv) {
/* Check that the physical addresses are the same.
* They are, but TODO why virt_to_phys on kernel gives a different value? */
assert(!virt_to_phys_user(&paddr, getpid(), (uintptr_t)address1));
assert(!lkmc_pagemap_virt_to_phys_user(&paddr, getpid(), (uintptr_t)address1));
printf("paddr1 = 0x%jx\n", (uintmax_t)paddr);
assert(!virt_to_phys_user(&paddr, getpid(), (uintptr_t)address2));
assert(!lkmc_pagemap_virt_to_phys_user(&paddr, getpid(), (uintptr_t)address2));
printf("paddr2 = 0x%jx\n", (uintmax_t)paddr);
/* Check that modifications made from userland are also visible from the kernel. */

View File

@@ -9,7 +9,7 @@
#include <sys/types.h>
#include <unistd.h>
#include <userland/common.h> /* virt_to_phys_user */
#include <lkmc/pagemap.h> /* lkmc_pagemap_virt_to_phys_user */
int main(int argc, char **argv) {
char buffer[BUFSIZ];
@@ -89,10 +89,10 @@ int main(int argc, char **argv) {
}
/* Get info about all pages in this page range with pagemap. */
{
PagemapEntry entry;
LkmcPagemapEntry entry;
for (uintptr_t vaddr = low; vaddr < high; vaddr += sysconf(_SC_PAGE_SIZE)) {
/* TODO always fails for the last page (vsyscall), why? pread returns 0. */
if (!pagemap_get_entry(&entry, pagemap_fd, vaddr)) {
if (!lkmc_pagemap_get_entry(&entry, pagemap_fd, vaddr)) {
printf(
"%jx %jx %u %u %u %u %s\n",
(uintmax_t)vaddr,

View File

@@ -4,7 +4,7 @@
#include <stdio.h> /* printf */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE, strtoull */
#include <userland/common.h> /* virt_to_phys_user */
#include <lkmc/pagemap.h> /* lkmc_pagemap_virt_to_phys_user */
int main(int argc, char **argv) {
pid_t pid;
@@ -16,8 +16,8 @@ int main(int argc, char **argv) {
}
pid = strtoull(argv[1], NULL, 0);
vaddr = strtoull(argv[2], NULL, 0);
if (virt_to_phys_user(&paddr, pid, vaddr)) {
fprintf(stderr, "error: virt_to_phys_user\n");
if (lkmc_pagemap_virt_to_phys_user(&paddr, pid, vaddr)) {
fprintf(stderr, "error: lkmc_pagemap_virt_to_phys_user\n");
return EXIT_FAILURE;
};
printf("0x%jx\n", (uintmax_t)paddr);