mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-26 11:41:35 +01:00
userland: make build perfect
This commit is contained in:
@@ -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
1
baremetal/add.c
Symbolic link
@@ -0,0 +1 @@
|
||||
../lkmc/add.c
|
||||
@@ -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
1
baremetal/add.py
Symbolic link
@@ -0,0 +1 @@
|
||||
../lkmc/add.py
|
||||
@@ -1,6 +0,0 @@
|
||||
#include <lkmc.h>
|
||||
|
||||
int main(void) {
|
||||
lkmc_assert_fail();
|
||||
}
|
||||
|
||||
1
baremetal/interactive/assert_fail.c
Symbolic link
1
baremetal/interactive/assert_fail.c
Symbolic link
@@ -0,0 +1 @@
|
||||
../../lkmc/assert_fail.c
|
||||
13
lkmc/add.c
Normal file
13
lkmc/add.c
Normal 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
9
lkmc/add.py
Normal 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
5
lkmc/assert_fail.c
Normal file
@@ -0,0 +1,5 @@
|
||||
#include <lkmc.h>
|
||||
|
||||
int main(void) {
|
||||
lkmc_assert_fail();
|
||||
}
|
||||
@@ -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);
|
||||
@@ -1 +0,0 @@
|
||||
../baremetal/add.c
|
||||
@@ -1 +0,0 @@
|
||||
../baremetal/add.py
|
||||
@@ -1 +0,0 @@
|
||||
../baremetal/interactive/assert_fail.c
|
||||
1
userland/c/add.c
Symbolic link
1
userland/c/add.c
Symbolic link
@@ -0,0 +1 @@
|
||||
../../lkmc/add.c
|
||||
1
userland/c/add.py
Symbolic link
1
userland/c/add.py
Symbolic link
@@ -0,0 +1 @@
|
||||
../../lkmc/add.py
|
||||
1
userland/c/assert_fail.c
Symbolic link
1
userland/c/assert_fail.c
Symbolic link
@@ -0,0 +1 @@
|
||||
../../lkmc/assert_fail.c
|
||||
@@ -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. */
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user