From 219a197fce0819b0441fdbe23918f037d0049dd3 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 24 Apr 2024 21:58:39 +0800 Subject: [PATCH 01/24] Create readme.md --- lab4/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab4/readme.md diff --git a/lab4/readme.md b/lab4/readme.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab4/readme.md @@ -0,0 +1 @@ + From f393a9ec9d9cdaae923b41e4c10d90044f76d858 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 24 Apr 2024 21:59:47 +0800 Subject: [PATCH 02/24] Add files via upload --- lab4/shell/Makefile | 22 ++ lab4/shell/allocator.c | 406 ++++++++++++++++++++++++++++ lab4/shell/allocator.o | Bin 0 -> 12184 bytes lab4/shell/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32753 bytes lab4/shell/cpio.c | 96 +++++++ lab4/shell/cpio.o | Bin 0 -> 4768 bytes lab4/shell/dtb.c | 162 +++++++++++ lab4/shell/dtb.o | Bin 0 -> 4880 bytes lab4/shell/except.c | 227 ++++++++++++++++ lab4/shell/except.o | Bin 0 -> 5056 bytes lab4/shell/header/allocator.h | 39 +++ lab4/shell/header/cpio.h | 39 +++ lab4/shell/header/dtb.h | 28 ++ lab4/shell/header/gpio.h | 38 +++ lab4/shell/header/irq.h | 22 ++ lab4/shell/header/mailbox.h | 38 +++ lab4/shell/header/reboot.h | 8 + lab4/shell/header/shell.h | 2 + lab4/shell/header/tasklist.h | 33 +++ lab4/shell/header/timer.h | 33 +++ lab4/shell/header/uart.h | 41 +++ lab4/shell/header/utils.h | 26 ++ lab4/shell/initramfs.cpio | Bin 0 -> 1024 bytes lab4/shell/kernel8.elf | Bin 0 -> 87800 bytes lab4/shell/kernel8.img | Bin 0 -> 16448 bytes lab4/shell/linker.ld | 44 +++ lab4/shell/mailbox.c | 51 ++++ lab4/shell/mailbox.o | Bin 0 -> 2064 bytes lab4/shell/main.c | 116 ++++++++ lab4/shell/main.o | Bin 0 -> 3872 bytes lab4/shell/reboot.c | 16 ++ lab4/shell/reboot.o | Bin 0 -> 1496 bytes lab4/shell/rootfs/file1.txt | 1 + lab4/shell/rootfs/one.img | Bin 0 -> 16 bytes lab4/shell/rootfs/pack.sh | 2 + lab4/shell/rootfs/thisisfile2.txt | 1 + lab4/shell/shell.c | 146 ++++++++++ lab4/shell/shell.o | Bin 0 -> 7040 bytes lab4/shell/start.S | 163 +++++++++++ lab4/shell/start.o | Bin 0 -> 7616 bytes lab4/shell/tasklist.c | 66 +++++ lab4/shell/tasklist.o | Bin 0 -> 2144 bytes lab4/shell/timer.c | 102 +++++++ lab4/shell/timer.o | Bin 0 -> 3064 bytes lab4/shell/uart.c | 209 ++++++++++++++ lab4/shell/uart.o | Bin 0 -> 4048 bytes lab4/shell/userprogram/Makefile | 11 + lab4/shell/userprogram/linker.ld | 19 ++ lab4/shell/userprogram/one.S | 7 + lab4/shell/userprogram/one.elf | Bin 0 -> 66352 bytes lab4/shell/userprogram/one.img | Bin 0 -> 16 bytes lab4/shell/userprogram/one.o | Bin 0 -> 728 bytes lab4/shell/utils.c | 68 +++++ lab4/shell/utils.o | Bin 0 -> 2440 bytes 54 files changed, 2282 insertions(+) create mode 100644 lab4/shell/Makefile create mode 100644 lab4/shell/allocator.c create mode 100644 lab4/shell/allocator.o create mode 100644 lab4/shell/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab4/shell/cpio.c create mode 100644 lab4/shell/cpio.o create mode 100644 lab4/shell/dtb.c create mode 100644 lab4/shell/dtb.o create mode 100644 lab4/shell/except.c create mode 100644 lab4/shell/except.o create mode 100644 lab4/shell/header/allocator.h create mode 100644 lab4/shell/header/cpio.h create mode 100644 lab4/shell/header/dtb.h create mode 100644 lab4/shell/header/gpio.h create mode 100644 lab4/shell/header/irq.h create mode 100644 lab4/shell/header/mailbox.h create mode 100644 lab4/shell/header/reboot.h create mode 100644 lab4/shell/header/shell.h create mode 100644 lab4/shell/header/tasklist.h create mode 100644 lab4/shell/header/timer.h create mode 100644 lab4/shell/header/uart.h create mode 100644 lab4/shell/header/utils.h create mode 100644 lab4/shell/initramfs.cpio create mode 100644 lab4/shell/kernel8.elf create mode 100644 lab4/shell/kernel8.img create mode 100644 lab4/shell/linker.ld create mode 100644 lab4/shell/mailbox.c create mode 100644 lab4/shell/mailbox.o create mode 100644 lab4/shell/main.c create mode 100644 lab4/shell/main.o create mode 100644 lab4/shell/reboot.c create mode 100644 lab4/shell/reboot.o create mode 100644 lab4/shell/rootfs/file1.txt create mode 100644 lab4/shell/rootfs/one.img create mode 100644 lab4/shell/rootfs/pack.sh create mode 100644 lab4/shell/rootfs/thisisfile2.txt create mode 100644 lab4/shell/shell.c create mode 100644 lab4/shell/shell.o create mode 100644 lab4/shell/start.S create mode 100644 lab4/shell/start.o create mode 100644 lab4/shell/tasklist.c create mode 100644 lab4/shell/tasklist.o create mode 100644 lab4/shell/timer.c create mode 100644 lab4/shell/timer.o create mode 100644 lab4/shell/uart.c create mode 100644 lab4/shell/uart.o create mode 100644 lab4/shell/userprogram/Makefile create mode 100644 lab4/shell/userprogram/linker.ld create mode 100644 lab4/shell/userprogram/one.S create mode 100644 lab4/shell/userprogram/one.elf create mode 100644 lab4/shell/userprogram/one.img create mode 100644 lab4/shell/userprogram/one.o create mode 100644 lab4/shell/utils.c create mode 100644 lab4/shell/utils.o diff --git a/lab4/shell/Makefile b/lab4/shell/Makefile new file mode 100644 index 000000000..beea4a7b2 --- /dev/null +++ b/lab4/shell/Makefile @@ -0,0 +1,22 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include +CFLAGS += -I /usr/aarch64-linux-gnu/include +all: kernel8.img + +start.o: start.S + aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o + +%.o: %.c + aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf + aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab4/shell/allocator.c b/lab4/shell/allocator.c new file mode 100644 index 000000000..9faebde17 --- /dev/null +++ b/lab4/shell/allocator.c @@ -0,0 +1,406 @@ +#include "header/allocator.h" +#include "header/utils.h" +#include "header/uart.h" +#include "header/dtb.h" + +#define SIMPLE_MALLOC_BUFFER_SIZE 8192 +static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; +static unsigned long simple_malloc_offset = 0; +struct buddy_alloc *_global_allocator = 0; +void *(*balloc_nalloc)(uint64_t); + +void* simple_malloc(unsigned long size){ + //align to 8 bytes + utils_align(&size,8); + + if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { + //Not enough space left + return (void*) 0; + } + void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; + simple_malloc_offset += size; + + return allocated; +} + +void buddy_alloc_reserve(void *start, void *end) +{ + uart_send_string("\nreserve start address: "); + uart_hexll((uint64_t)start);ENDL; + uart_send_string("reserve end address: "); + uart_hexll((uint64_t)end);ENDL; + uart_send_string("\nRESERVED =============================\n"); + + for (uint64_t i = (uint64_t)start >> 12; + i < ((uint64_t) utils_ret_align(end, (1<<12))) >> 12; + i++) { + _global_allocator->entries[i] = -1; + } +} + + + +void buddy_alloc_preinit(struct buddy_alloc *header) +{ + uint64_t page_count = header->size / header->page_size; + uint64_t header_size = sizeof(struct buddy_alloc); + + uint64_t entries_size = page_count * sizeof(buddy_alloc_entry); + uart_send_string("Entries size: "); + uart_hex(entries_size);ENDL; + uint64_t freelist_size = (header->order + 1) * sizeof(uint64_t); + header->entries = (buddy_alloc_entry *) ((uint64_t) header + header_size); + header->freelist = (struct buddy_alloc_node **) (((uint64_t) header->entries) + entries_size); + header->mem = 0; + _global_allocator = header; + for (int i = 0; i <= header->order; i++) + header->freelist[i] = 0; + for (uint64_t i = 0; i < page_count; i++) + header->entries[i] = 0; + buddy_alloc_reserve(header, header + header_size + entries_size + freelist_size); +} + +void node_alloc_init(void *p, uint64_t size, uint32_t unit_size) +{ + struct node_alloc_node *cur = (struct node_alloc_node *) p; // get the nn address + cur->next = 0; + cur->size = unit_size; + + uint64_t full_size = sizeof(struct node_alloc_node) + unit_size; + for (uint64_t i = full_size; i < size; i += full_size) // nn1+bn1 -- nn2+bn2 -- nn3+bn3 -- ... + { // nn1+mmsp1 -- nn2+mmsp2 -- nn3+mmsp3 + struct node_alloc_node *h = (struct node_alloc_node *)(p + i); + h->size = unit_size; + h->next = 0; + cur->next = h; + cur = h; + } +} + +void *node_alloc(struct node_alloc_node *head) +{ + struct node_alloc_node *cur = head->next; + if (cur) { + head->next = cur->next; + //current start address of node + header_sz so it will be storage addr + return (void *) (((uint64_t) cur) + sizeof(struct node_alloc_node)); + } +} + +void *internal_node_alloc(uint64_t dontcare) { + return node_alloc(_global_allocator->nhead); +} + +void nfree(struct node_alloc_node *head, void *p) // p-->bn +{ + struct node_alloc_node *n = (struct node_alloc_node *)(p - sizeof(struct node_alloc_node)); + n->next = head->next; + head->next = n; +} + + +void buddy_alloc_mem_init() +{ + uart_send_string("in buddy_alloc_mem_init\n"); + struct buddy_alloc *h = _global_allocator; + uint64_t page_count = h->size / h->page_size, frame = 0; + uart_send_string("total frame: \n"); + uart_hex(page_count); + h->order = MIN(63 - __builtin_clzll(page_count), h->order); + + // initialize a node-specialized allocator at the first page available + // the nallacator will be hooked up with generic malloc after it is available + struct node_alloc_node *nhead; + { + // find the first available page + for (; h->entries[frame] < 0; frame++); // find avaiable frame + nhead = (struct node_alloc_node *) (frame << 12); // get the frame address + node_alloc_init((void *) nhead, 1 << 12, sizeof(struct buddy_alloc_node)); + balloc_nalloc = internal_node_alloc; + h->entries[frame++] = -1; // reserve this frame + h->nhead = nhead; + } + for (; frame < page_count;) { + // find next available page + uart_send_string("\nframe occupy: "); + uart_hex(frame);ENDL; + + for (; h->entries[frame] < 0; frame++); // find avaiable frame + + uart_send_string("\nStart of available frame: "); + uart_hex(frame);ENDL;ENDL; + + + // find next unavailable page + uint64_t e = frame + 1; + for (; h->entries[e] >= 0; e++){ + if(e==page_count)break; + } + uart_send_string("End of available frame: "); + uart_hex(e);ENDL;ENDL; + + // divide the avaiable frame with order + for (uint64_t cur_order = h->order; frame < e;) { + uint64_t fcount = (1 << cur_order); + if (frame + fcount > e) + { + cur_order--; + continue; + } + h->entries[frame] = (buddy_alloc_entry) cur_order; + + // TODO: linked list + struct buddy_alloc_node **cur = &h->freelist[cur_order]; + while (*cur) // find the last freelist[cur_order] address + cur = &(*cur)->next; + // balloc_nalloc = internal_node_alloc; + struct buddy_alloc_node *n = balloc_nalloc(sizeof(struct buddy_alloc_node)); + n->idx = frame; + n->next = 0; + *cur = n; + + for (uint64_t j = frame + 1; j < frame + fcount; j++) + h->entries[j] = BRANCH; + frame += fcount; + } + uart_send_string("current frame: "); + uart_hex(frame); + uart_send_string("\r\n"); + uart_send_string("free! ==============================\n"); + } +} + + + +void buddy_alloc_state(struct buddy_alloc *b) +{ + void *_p_args[2] = {0, 0}; + uint64_t size = 0; + for (int32_t i = 0; i <= b->order; i++) { + struct buddy_alloc_node *cur = b->freelist[i]; + uint32_t cnt = 0; + while (cur) // how many block can use in freelist[i] + { + cnt++; + cur = cur->next; + } + size += (1 << i) * cnt; // how many pages can use in freelist[i] + _p_args[0] = (void *) i; _p_args[1] = (void *) cnt; + uart_send_string("ORDER "); + uart_hex(_p_args[0]); + uart_send_string(" has "); + uart_hex(_p_args[1]); + uart_send_string(" blocks available.");ENDL; + //utils_printf("ORDER %u has %u blocks available.\r\n", _p_args); + } + uart_send_string("AVAILABLE PAGES: "); + uart_hex(size);ENDL;ENDL; +} + +uint32_t mpool[4] = {sizeof(struct buddy_alloc_node), 64, 128, 256}; +struct node_alloc_node *bins[4]; + +// allocate buddy memory (page base) +void *buddy_alloc(uint64_t size) +{ + uint64_t pc = size / _global_allocator->page_size + ((size % _global_allocator->page_size) > 0); // get page index + uint64_t h = 63 - __builtin_clzll(pc); + uint64_t order = MIN(h + ((pc - (1 << h)) > 0), _global_allocator->order); // find 2^?order + int32_t lowest_avail_order = -1; + for (uint32_t c = order; c <= _global_allocator->order; c++) + if (_global_allocator->freelist[c]) // get from freelist(if have free m) from ordr base + { + lowest_avail_order = (int32_t) c; + break; + } + if (lowest_avail_order < 0) // no avalable free space in freelist + return NULL; + + for (uint32_t c = lowest_avail_order; c > order; c--) // divid the block if c > order(ori need) + { + struct buddy_alloc_node *n = _global_allocator->freelist[c]; + if (!n) break; + + _global_allocator->freelist[c] = n->next; // free this order block in freelist + struct buddy_alloc_node *n1 = balloc_nalloc(sizeof(struct buddy_alloc_node)); + struct buddy_alloc_node *n2 = balloc_nalloc(sizeof(struct buddy_alloc_node)); + n1->idx = n->idx; + n1->next = n2; + n2->idx = n1->idx + (1 << (c - 1)); + n2->next = _global_allocator->freelist[c - 1]; // from now get two new block(order-1) + _global_allocator->freelist[c - 1] = n1; + _global_allocator->entries[n1->idx] = (buddy_alloc_entry) (c - 1); + _global_allocator->entries[n2->idx] = (buddy_alloc_entry) (c - 1); + nfree(_global_allocator->nhead, n); + } + struct buddy_alloc_node *n = _global_allocator->freelist[order]; // clear freelist[order=order] it has been used + if (!n) + return NULL; + _global_allocator->freelist[order] = n->next; + _global_allocator->entries[n->idx] = (buddy_alloc_entry) (((int32_t) _global_allocator->entries[n->idx] * -1) - 1); // let entries be -a + void *ret = (void *) (n->idx * (_global_allocator->page_size)); // get mapped address + nfree(_global_allocator->nhead, n); + return ret; +} + + +void *buddy_malloc(uint64_t x) +{ + //i will be in [balloc_node, 64, 96, 128] + for (int i = 0; i < sizeof(mpool)/sizeof(mpool[0]); i++) { + //if current size of malloc is bigger than required size then use that malloc + if (mpool[i] > x) { + void *ret = node_alloc(bins[i]); + if (ret) + return ret; + if (rejuv_node_alloc(i) < 0) { + uart_send_string("!!!BUG!!!: CANT REJUV BINS\r\n"); + while(1); + } + ret = node_alloc(bins[i]); + if (!ret) { + uart_send_string("!!!BUG!!!: CANT REJUV BINS\r\n"); + while(1); + } + return ret; + } + } + // small allocator can't provide, propagate to balloc + return buddy_alloc(x); +} + + +int rejuv_node_alloc(int order) +{ + // assumption: bins[order]->next = NULL; bins[order] != NULL; + //because current page is full occupied, so next of nalloc node will be in new page + //new page will be allocated by balloc and init it with size captured by bins[order] + struct node_alloc_node *next = buddy_alloc(4096); + if (!next) + return -1; + node_alloc_init(next, 4096, bins[order]->size); + bins[order]->next = next; + uart_send_string("you are here for rejuv_nalloc\n"); + return 0; +} + +void buddy_malloc_init() +{ + // merge balloc_nallocator together with bins[0] + bins[0] = _global_allocator->nhead; + for (int i = 1; i < sizeof(mpool)/sizeof(mpool[0]); i++) { + void *m = buddy_alloc(4096); // allocate one page + // m is location, 4096 is page_sz and binsize[i] is size for that allocator + node_alloc_init(m, 4096, mpool[i]); + bins[i] = m; + } + //after finish malloc_init balloc_nalloc become y_malloc + balloc_nalloc = buddy_malloc; +} + +void buddy_free(void *ptr) { + + uint32_t idx =((uint64_t)ptr) / _global_allocator->page_size; + int32_t order = ((int32_t) _global_allocator->entries[idx] + 1) * -1; + + struct buddy_alloc_node *n = balloc_nalloc(sizeof(struct buddy_alloc_node)); + n->idx = idx; + uint32_t neighbor_idx = n->idx ^ (1<entries[neighbor_idx] == order) // neighbor block nor use -> merge + { + // find it from freelist + struct buddy_alloc_node *c = _global_allocator->freelist[order], **prev_slot = &_global_allocator->freelist[order]; + while(c){ + if(c->idx == neighbor_idx) { + struct buddy_alloc_node *merged = balloc_nalloc(sizeof(struct buddy_alloc_node)); + _global_allocator->entries[neighbor_idx] = BRANCH; + merged->idx = MIN(n->idx,neighbor_idx); + *prev_slot = c->next; + nfree(_global_allocator->nhead,n); + nfree(_global_allocator->nhead,c); + n = merged; + goto next_order; + } + prev_slot = &c->next; + c = c->next; + } + while(1); + next_order: + order++; + neighbor_idx = n->idx ^ (1<next = _global_allocator->freelist[order]; + _global_allocator->entries[n->idx] = (buddy_alloc_entry) order; + _global_allocator->freelist[order] = n; +} + + + +void node_free(void *ptr) +{ + if (__builtin_ctzll((uint64_t) ptr) >= 12) // if size bigger than one page -> use buddy_free + { + uart_send_string("Use buddy_free");ENDL; + buddy_free(ptr); + return; + } + struct node_alloc_node *header = ptr - sizeof(struct node_alloc_node); + for (int i = 0; i < sizeof(mpool)/sizeof(mpool[0]); i++) { + if (mpool[i] == header->size) { + nfree(bins[i], ptr); + return; + } + } + uart_send_string("!!BUG!!\n"); + ENDL; + +} + + +void buddy_system_init(void * _dtb) { + + char *dtb_addr = (char *)_dtb; + + //allocator location + void *mem = (void *)0x10000000; + //locate at 0x10000000 + struct buddy_alloc *bhead = mem; + bhead->order = 11; + bhead->page_size = 4096; + bhead->size = 0x3C000000; + buddy_alloc_preinit(bhead); + + uart_send_string("After buddy alloc preinit\n"); + + + buddy_alloc_reserve(0, (void *) 0x1000); + buddy_alloc_reserve((void *) 0x1000, (void *) 0x80000); + buddy_alloc_reserve((void *) 0x80000, (void *) 0x80000 + 30000); + buddy_alloc_reserve(cpio_addr, cpio_addr + 30000); + buddy_alloc_reserve(dtb_addr, dtb_addr + 60000); + + buddy_alloc_mem_init(); // divide avaliable memmory in free-list + uart_send_string("\nAfter buddy alloc init\n"); + buddy_malloc_init(); + + buddy_alloc_state(bhead); + + uart_send_string("\nallocate 4000bytes:\n"); + void* test1_malloc = buddy_alloc(4000); // return m address // nn--(sp) + buddy_alloc_state(bhead); + + uart_send_string("\nfree 5000 bytes\n"); + node_free(test1_malloc); + buddy_alloc_state(bhead); + + uart_send_string("\nallocate 10000bytes:\n"); + void* test2_malloc = buddy_alloc(10000); + buddy_alloc_state(bhead); + + uart_send_string("\nfree 10000 bytes\n"); + node_free(test2_malloc); + buddy_alloc_state(bhead); + +} + diff --git a/lab4/shell/allocator.o b/lab4/shell/allocator.o new file mode 100644 index 0000000000000000000000000000000000000000..a058f22d5da14eeeba76bade9f5c1d3875f3cfe0 GIT binary patch literal 12184 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
    ^SI{o%E^r!gutvjwx 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 OPqI~*e!TdI|Nj8Si!WyY literal 0 HcmV?d00001 diff --git a/lab4/shell/cpio.c b/lab4/shell/cpio.c new file mode 100644 index 000000000..a38879c9c --- /dev/null +++ b/lab4/shell/cpio.c @@ -0,0 +1,96 @@ +#include "header/cpio.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/allocator.h" + +int file_num = 0; +struct file *f = NULL; + +void allocate_file_array() { + if (f == NULL) { + f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); + if (f == NULL) { + uart_send_string("Memory allocation error\n"); + // Handle memory allocation error + } + } +} + +void traverse_file() +{ + allocate_file_array(); + char* addr = (char *)cpio_addr; + + + while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ + + struct cpio_header *header = (struct cpio_header *)addr; + unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); + unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; + unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); + + utils_align(&headerPathname_size, 4); + utils_align(&file_size, 4); + + f[file_num].file_header = header; + f[file_num].filename_size = filename_size; + f[file_num].headerPathname_size = headerPathname_size; + f[file_num].file_size = file_size; + f[file_num].file_content_head = (char*) header + headerPathname_size; + + addr += (headerPathname_size + file_size); + file_num += 1; + } +} + +int findfile(char* filename) { + for(int n=0;n<=file_num;n++) { + if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ + return n; + } + } + return -1; +} + +void cpio_ls() +{ + for(int n=0;n<=file_num;n++) { + uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); + uart_send_string("\n"); + } +} + + +void cpio_cat(char *filename) +{ + int targetfile_num = findfile(filename); + + if(targetfile_num != -1) { + for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) + { + uart_send_char(f[targetfile_num].file_content_head[i]); + } + uart_send_string("\n"); + + } else { + uart_send_string("Can not Find the file\n"); + } + +} + +void cpio_exec_program(char* filename) { + int targetfile_num = findfile(filename); + + char* target = (char*) 0x20000; + for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J literal 0 HcmV?d00001 diff --git a/lab4/shell/dtb.c b/lab4/shell/dtb.c new file mode 100644 index 000000000..130f41501 --- /dev/null +++ b/lab4/shell/dtb.c @@ -0,0 +1,162 @@ +#include "header/dtb.h" +#include "header/uart.h" +#include "header/utils.h" +#define UNUSED(x) (void)(x) + + +char* cpio_addr; +int space = 0; +//1. Define the callback function type(fdt_callback) +//2. Create a structure for holding the FDT header information(fdt_header) +//3. Implement helper functions to extract the FDT header information + +uint32_t fdt_u32_le2be (const void *addr) { + const uint8_t *bytes = (const uint8_t *) addr; + uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; + return ret; +} + +void send_space(int n) { + while(n--) uart_send_string(" "); +} + +int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { + uintptr_t end_ptr = cur_ptr + totalsize; + + while(cur_ptr < end_ptr) { + + uint32_t token = fdt_u32_le2be((char *)cur_ptr); + cur_ptr += 4; + + switch(token){ + case FDT_BEGIN_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. + Node name (variable length, NULL-terminated): Specifies the name of the node being opened. + */ + //uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char*)cur_ptr,NULL,0); + cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); + break; + case FDT_END_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_END_NODE token. + */ + //uart_send_string("In FDT_END_NODE;\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_PROP: { + + /* + Token type (4 bytes): Indicates that it's an FDT_PROP token. + Data length (4 bytes): Specifies the length of the property data (len). + Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). + Property data (variable length): Contains the property data itself, the size of which is determined by len. + */ + //uart_send_string("In FDT_PROP \n"); + uint32_t len = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + //second parameter name here is property name not node name + cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); + cur_ptr += utils_align_up(len,4); + break; + + } + case FDT_NOP: + //uart_send_string("In FDT_NOP\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_END: + //uart_send_string("In FDT_END\n"); + cb(token,NULL,NULL,0); + return 0; + default:; + return -1; + } + } + return -1; + +} +//4. Implement the fdt_traverse function: + +int fdt_traverse(fdt_callback cb,void * _dtb){ + uintptr_t dtb_ptr = (uintptr_t) _dtb; + uart_send_string("\ndtb loading at: "); + uart_hex(dtb_ptr); + uart_send_string("\r\n"); + + struct fdt_header* header = (struct fdt_header*) dtb_ptr; + + uint32_t magic = fdt_u32_le2be(&(header->magic)); + + if (magic != 0xd00dfeed){ + + uart_send_string("The header magic is wrong\n"); + return -1; + } + + /* + +-----------------+ + | fdt_header | <- dtb_ptr + +-----------------+ + | reserved memory | + +-----------------+ + | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) + +-----------------+ + | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) + +-----------------+ + */ + + uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); + uint32_t totalsize = fdt_u32_le2be(&header->totalsize); + parse_struct(cb, struct_ptr,strings_ptr,totalsize); + return 1; + +} + +//5. Implement the initramfs_callback function: +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ + UNUSED(size); + if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ + cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); + uart_send_string("cpio address is at: "); + uart_hex((uintptr_t)fdt_u32_le2be(data)); + uart_send_string("\r\n"); + } +} + +//6. Implement print_dtb callback function: + +void print_dtb(int token, const char* name, const void* data, uint32_t size) { + UNUSED(data); + UNUSED(size); + + switch(token){ + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_space(space); + uart_send_string((char*)name); + uart_send_string("{\n "); + space++; + break; + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if(space >0) send_space(space); + uart_send_string("}\n"); + break; + case FDT_NOP: + break; + case FDT_PROP: + send_space(space); + uart_send_string((char*)name); + break; + case FDT_END: + break; + } +} diff --git a/lab4/shell/dtb.o b/lab4/shell/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9 GIT binary patch literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h literal 0 HcmV?d00001 diff --git a/lab4/shell/except.c b/lab4/shell/except.c new file mode 100644 index 000000000..0387973d7 --- /dev/null +++ b/lab4/shell/except.c @@ -0,0 +1,227 @@ + +#include "header/uart.h" +#include "header/irq.h" +#include "header/shell.h" +#include "header/timer.h" +#include "header/tasklist.h" + +#define CNTPSIRQ_BIT_POSITION 0x02 +#define AUXINIT_BIT_POSTION 1<<29 + + +void except_handler_c() { + uart_send_string("In Exception handle\n"); + + //read spsr_el1 + unsigned long long spsr_el1 = 0; + asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); + uart_send_string("spsr_el1: "); + uart_hex(spsr_el1); + uart_send_string("\n"); + + //read elr_el1 + unsigned long long elr_el1 = 0; + asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); + uart_send_string("elr_el1: "); + uart_hex(elr_el1); + uart_send_string("\n"); + + //esr_el1 + unsigned long long esr_el1 = 0; + asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); + uart_hex(esr_el1); + uart_send_string("\n"); + + //ec + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + uart_send_string("ec: "); + uart_hex(ec); + uart_send_string("\n"); + + while(1){ + + } +} + +void timer_irq_handler() { + //enable core_0_timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + // Disable interrupts to protect critical section + asm volatile("msr DAIFSet, 0xf"); + + uint64_t current_time; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + + while(timer_head && timer_head->expiry <= current_time) { + timer_t *timer = timer_head; + + //Execute the callback + timer->callback(timer->data); + + // Remove timer from the list + timer_head = timer->next; + if (timer_head) { + timer_head->prev = NULL; + } + + //free timer + + // Reprogram the hardware timer if there are still timers left + if(timer_head) { + asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } else { + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + } + + + //enable interrupt + asm volatile("msr DAIFClr,0xf"); + } + +} + +void uart_transmit_handler() { + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); + + if (uart_write_buffer[uart_write_index-1] == '\r'){ + uart_write_buffer[uart_write_index++] = '\n'; + uart_write_buffer[uart_write_index] = '\0'; + } + + // Send data from the write buffer + while (uart_write_head != uart_write_index) { + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + + if (uart_write_head == uart_write_index) { + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + if(uart_read_buffer[uart_read_index-1] == '\r'){ + uart_read_buffer[uart_read_index-1] = '\0'; + parse_command(uart_read_buffer); + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + } + } + } + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x1); +} + +void uart_receive_handler() { + + // Read data(8 bytes) and store it in the read buffer + char data = mmio_read(AUX_MU_IO) & 0xff; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + create_task(uart_transmit_handler,2); +} + +void irq_except_handler_c() { + + + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + + uint32_t irq_pending1 = mmio_read(IRQ_PENDING_1); + uint32_t core0_interrupt_source = mmio_read(CORE0_INTERRUPT_SOURCE); + uint32_t iir = mmio_read(AUX_MU_IIR); + + if (core0_interrupt_source & CNTPSIRQ_BIT_POSITION) { + + //djsable core 0 timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 0; + + create_task(timer_irq_handler,3); + } + + // Handle UART interrupt + if (irq_pending1 & AUXINIT_BIT_POSTION) { + if ((iir & 0x06) == 0x04) { + //Disable receive interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); + create_task(uart_receive_handler,1); + } + + if ((iir & 0x06) == 0x02) { + //Disable transmit interrupt + //mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x02)); + //create_task(uart_transmit_handler,2); + } + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + + execute_tasks(); + //asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + +} + +/* +void uart_irq_handler(){ + uint32_t iir = mmio_read(AUX_MU_IIR); + + // Check if it is a receive interrupt + if ((iir & 0x06) == 0x04) { + // Read data(8 bytes) and store it in the read buffer + char data = mmio_read(AUX_MU_IO) & 0xff; + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + // Enable tx interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); + } + + // Check if it is a transmit interrupt + if ((iir & 0x06) == 0x02) { + // Send data from the write buffer + if (uart_write_head != uart_write_index) { + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + } else { + // Disable tx interrupt when there is no data left to send + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + + if(uart_read_buffer[uart_read_index-1] == '\r'){ + uart_read_buffer[uart_read_index-1] = '\0'; + parse_command(uart_read_buffer); + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + } + } + } +} + +*/ diff --git a/lab4/shell/except.o b/lab4/shell/except.o new file mode 100644 index 0000000000000000000000000000000000000000..fac20f6a29a719b81d5b4c227c573faca5d2847e GIT binary patch literal 5056 zcmbVPU2GKB6+Sa#%tD-mn59sRvSS-XX$31xUD%|Rn6*tHmDRdtqqa)b^>{th7WM+W z^%<)KoDiqoheZCY7X9wG-r`jFI(ct9!-O$b6O;ke(K zx!0VGy;YTC&E9*z`{oSr~uk!euLabz%IEm1D6NW}C0S62#1Leg$#a zoZIpW5nU>VY z7Ja=0?!=6p+6dn`#(5D>JI0!a_G2gwXjtgOG@iHxY?PcT;i-fEU(nt|=Ak}|G8}&k zw2#fWseY5DkKyTuZ}#qkM@KNOi8-6VSgz?zv(L+)FJ_u8XS#Xp;l^f*re6l$j96Qq zb*2nx>_NO_Qie6OkFl_r(R0D`#B;!Nh1igPXQkTe1i3Ga|23Gq#9&JbedP(nav8C5 z3+;)(NIUSEBD^HylNtc7)mYQ2j*SK>vr7RLX?x%1jg>ivv*dA*aG(>S;1 zt@XcKAM(mYlP0;%c>6M5Jiv8-yf-yBZ+#Jyx~1nfAJF<-;)!!iIu<@h$DLEN)POU$ z=7m{v{*_M&XOH)ChUXa1H}Kd-Y?+nL8Ydd*=y{wOK1;mD3*&#jz`7>REy@!n z{83K2nA0rg5cTpWSjS)T83EP`ZRRnD_fE%HqOo7`qMA?U?Y(0;?}$HiIByTS`GH|? zE&Ql>q*%y$!)=e-+#(7y2xev0q1P&-0JU4)t6VDtUG1xJ8k~p zTIWX}&Ru=~$^%5avG*%}A2ty9J!jXRThn#2{?w``refvQr|ZsG9WR<@dhJIa{^QyQ zpsELyb;ygxve;|yE0x&}W+@nt>CkF9_* zUcU_Ib!Zg%2I~$C-=U>FBAvD?zUBq%4y>~VKT`ugSOb5i2L7uW_~{z>Z-H}OalAO$ z^d5Tyb-nk44)t>#CG+1?{IbIThH@qTwHo+5aMl@6TP4`1z;4&zlNX%+WRA9u(bfU- zheo_YcBpVP8@>z*3K{g=0UC7+e%3Fz`QpfszeEVopB09DFFTYU@Ww(~2=tF0Jm?i9 za!;rLN$C-^mBSIYQ1r67!y_YjC57$3ym*=E~~BNLv5u-zUO#2+Y$&nTSv52`vB@2NWTB|fik z=F9cGDfklK0v;Rl9}26%?>2?AzQnoB#{9;x8vK4+;Q0P6nWONiPM5%?&VGSQoo<24 z_x!lQY;tMF)ESA>rII(#5>Bz|4tynpmvfhXW*L`V1iC!(YA&uZx0jp#fY zPA`AF0^@PNsxg#x3g>(|PR(x+d_5++@#U9|=Z*P0f);X#=xBUP4V|q5m+@>9xEwbn zaLIQBF8N&w*Ks;3&ixA4`D(noh7Moi*`o9IV}Z+YFDab&NmJ+={9aZ#$I~G28HIB^ z62Bt!^!S(y@r3kL? z1^OPL_4Rk2lEt5o_-;Q+zYvy#x>oRp-K6i0`IH=ReV3B`#UdpOhq=M@wq%Nu{H^u! zpyUtxUUJ`epW0sZ-P|GY*xMV-9xS*co{H+r7dBimHOp>-4luTLk*lnH=Wsvo38pxB zr2TMB*xIjN7JUEZabk+3_t+x}SIeq;iFzXA>JHYBwhax|{IdRS@MX=Nc%4=)I(`lR2ol*8l(j literal 0 HcmV?d00001 diff --git a/lab4/shell/header/allocator.h b/lab4/shell/header/allocator.h new file mode 100644 index 000000000..d117fa8f9 --- /dev/null +++ b/lab4/shell/header/allocator.h @@ -0,0 +1,39 @@ +#ifndef ALLOCATOR_H +#define ALLOCATOR_H + +#include + +void* simple_malloc(unsigned long size); +void buddy_system_init(); + +struct node_alloc_node +{ + struct node_alloc_node *next; + uint32_t size; +}; + +struct buddy_alloc_node { + uint32_t idx; + struct buddy_alloc_node *next; +}; + +typedef enum +{ + BRANCH = -9999, +} buddy_alloc_val; + +typedef buddy_alloc_val buddy_alloc_entry; + +struct buddy_alloc +{ + unsigned order; + unsigned long long size; + unsigned page_size; + struct node_alloc_node *nhead; + buddy_alloc_entry *entries; + struct buddy_alloc_node **freelist; + void *mem; +}; + +extern struct buddy_alloc *_global_allocator; +#endif diff --git a/lab4/shell/header/cpio.h b/lab4/shell/header/cpio.h new file mode 100644 index 000000000..be0e36b9f --- /dev/null +++ b/lab4/shell/header/cpio.h @@ -0,0 +1,39 @@ +//#define QEMU_CPIO_ADDR (char *)0x8000000; //qemu +//#define RASP_CPIO_ADDR (char *)0x20000000;//rasperrypi + +#define MAX_FILE_NUM 10 + +extern char* cpio_addr; + +void traverse_file(); +void cpio_ls(); +void cpio_cat(char* filename); +void cpio_exec_program(char* filename); + +struct cpio_header { + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; //determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; //determine when two entries refer to the same file. + char c_mode[8]; //specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +}; + + +struct file { + struct cpio_header* file_header; + unsigned long filename_size; + unsigned long headerPathname_size; + unsigned long file_size; + char* file_content_head; +}; + diff --git a/lab4/shell/header/dtb.h b/lab4/shell/header/dtb.h new file mode 100644 index 000000000..85e813ddf --- /dev/null +++ b/lab4/shell/header/dtb.h @@ -0,0 +1,28 @@ +#include +// #include +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); + +struct __attribute__((packed)) fdt_header { + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +}; + +int fdt_traverse(fdt_callback cb,void *dtb_ptr); +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); +void print_dtb(int token, const char* name, const void* data, uint32_t size); + +extern char* cpio_addr; diff --git a/lab4/shell/header/gpio.h b/lab4/shell/header/gpio.h new file mode 100644 index 000000000..38ca70635 --- /dev/null +++ b/lab4/shell/header/gpio.h @@ -0,0 +1,38 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +//Page 90, Physical/bus addr diff +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + + +// Helper function to write data to a memory-mapped I/O address +static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { + *reg = data; +} + +// Helper function to read data from a memory-mapped I/O address +static inline uint32_t mmio_read(volatile uint32_t* reg) { + return *reg; +} + +#endif diff --git a/lab4/shell/header/irq.h b/lab4/shell/header/irq.h new file mode 100644 index 000000000..9085cb30c --- /dev/null +++ b/lab4/shell/header/irq.h @@ -0,0 +1,22 @@ +#ifndef IRQ_H +#define IRQ_H + +#include "gpio.h" + + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) + + +#endif + diff --git a/lab4/shell/header/mailbox.h b/lab4/shell/header/mailbox.h new file mode 100644 index 000000000..d13ac3ce9 --- /dev/null +++ b/lab4/shell/header/mailbox.h @@ -0,0 +1,38 @@ +#include "gpio.h" + +extern volatile unsigned int mailbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_GETBOARD 0x00010002 +#define MBOX_TAG_GETARMMEM 0x00010005 +#define MBOX_TAG_LAST 0x00000000 + +int mailbox_call(); +void get_board_revision(); +void get_arm_mem(); + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 diff --git a/lab4/shell/header/reboot.h b/lab4/shell/header/reboot.h new file mode 100644 index 000000000..e1d44aa1b --- /dev/null +++ b/lab4/shell/header/reboot.h @@ -0,0 +1,8 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); diff --git a/lab4/shell/header/shell.h b/lab4/shell/header/shell.h new file mode 100644 index 000000000..9784c1ccb --- /dev/null +++ b/lab4/shell/header/shell.h @@ -0,0 +1,2 @@ +void shell(); +void parse_command(char* buffer); diff --git a/lab4/shell/header/tasklist.h b/lab4/shell/header/tasklist.h new file mode 100644 index 000000000..0aaca4ae1 --- /dev/null +++ b/lab4/shell/header/tasklist.h @@ -0,0 +1,33 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +// #include +#include + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + +typedef void (*task_callback)(); + +typedef struct task { + struct task *prev; + struct task *next; + task_callback callback; + uint64_t priority; +} task_t; + +void execute_tasks(); +void create_task(task_callback callback,uint64_t priority); +void enqueue_task(task_t *new_task); +extern task_t *task_head; + +#endif diff --git a/lab4/shell/header/timer.h b/lab4/shell/header/timer.h new file mode 100644 index 000000000..2fac7a24f --- /dev/null +++ b/lab4/shell/header/timer.h @@ -0,0 +1,33 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +// #include + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + +typedef void (*timer_callback)(void *data); + +typedef struct timer { + struct timer *prev; // previous timer in the list + struct timer *next; // next timer in the list + timer_callback callback; // the function to call when the timer expires + void *data; // data to be passed to the callback + uint64_t expiry; // the time at which the timer will expire +} timer_t; + +extern timer_t *timer_head; // head of the timer list + +void setTimeout(char *message,uint64_t seconds); +#endif + diff --git a/lab4/shell/header/uart.h b/lab4/shell/header/uart.h new file mode 100644 index 000000000..ac6dab007 --- /dev/null +++ b/lab4/shell/header/uart.h @@ -0,0 +1,41 @@ +#ifndef UART_H +#define UART_H + +#include "gpio.h" +#include +#define UART_BUFFER_SIZE 1024 +#define ENDL uart_send_char('\r');uart_send_char('\n'); + +void uart_init(); +void uart_send_char(unsigned int c); +char uart_get_char(); +void uart_send_string(char* s); +void uart_hex(unsigned long long d); +void uart_hexll(uint64_t d); +void uart_enable_interrupt(); +int uart_async_read(char *buffer); +void uart_async_write(const char *buffer, int length); +void uart_async_send(const char *str); + + +extern char uart_read_buffer[UART_BUFFER_SIZE]; +extern char uart_write_buffer[UART_BUFFER_SIZE]; +extern int uart_read_index; +extern int uart_read_head; +extern int uart_write_index; +extern int uart_write_head; + +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +#endif diff --git a/lab4/shell/header/utils.h b/lab4/shell/header/utils.h new file mode 100644 index 000000000..64643444e --- /dev/null +++ b/lab4/shell/header/utils.h @@ -0,0 +1,26 @@ +#include +// #include + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + +#define nop asm volatile("nop") +#define MIN(a,b) (a <= b) ? a : b + +int utils_string_compare(const char* i, const char* j); +unsigned long utils_atoi(const char *s, int char_size); +void utils_align(void *size, unsigned int s); +char *utils_ret_align(char *addr, unsigned alignment); +uint32_t utils_align_up(uint32_t size, int alignment); +size_t utils_strlen(const char *s); +char *utils_strcpy(char* dst, const char *src); +char *utils_strdup(const char *src); diff --git a/lab4/shell/initramfs.cpio b/lab4/shell/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..faf47b52fd58348135f4805c9dad3157d9e67fb3 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/lab4/shell/linker.ld b/lab4/shell/linker.ld new file mode 100644 index 000000000..5018defb6 --- /dev/null +++ b/lab4/shell/linker.ld @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab4/shell/mailbox.c b/lab4/shell/mailbox.c new file mode 100644 index 000000000..7e0c5d99c --- /dev/null +++ b/lab4/shell/mailbox.c @@ -0,0 +1,51 @@ +#include "header/mailbox.h" + +volatile unsigned int __attribute__((aligned(16))) mailbox[36]; + +int mailbox_call() +{ + unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ){ + /* is it a valid successful response? */ + if(mailbox[1] == MBOX_RESPONSE) + return 1; + } + } + return 0; +} + +void get_board_revision(){ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} + +void get_arm_mem(){ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} diff --git a/lab4/shell/mailbox.o b/lab4/shell/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2118f241e7cf5768d3e64c641e7118db6261bc GIT binary patch literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< literal 0 HcmV?d00001 diff --git a/lab4/shell/main.c b/lab4/shell/main.c new file mode 100644 index 000000000..c1f840898 --- /dev/null +++ b/lab4/shell/main.c @@ -0,0 +1,116 @@ +#include "header/uart.h" +#include "header/shell.h" +#include "header/dtb.h" +#include "header/utils.h" +#include "header/cpio.h" +#include "header/timer.h" +#include "header/allocator.h" + +void test_read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + uart_send_string("\r\n"); + break; + } + else + { + uart_send_char(buffer[index]); + } + index++; + } +} + + +extern void *_dtb_ptr; +void main() +{ + + // set up serial console + uart_init(); + + // pre test /////////////////////////////// + char buffer[256]; + while(1) + { + uart_send_string("# "); + test_read_command(buffer); + char * input_string = buffer; + if(utils_string_compare(input_string,"in")) + { + break; + } + else + { + // uart_send_hex((uintptr_t) _dtb_addr); + uart_send_string("The instruct is not exist.\n"); + } + } + ////////////////////////////////////////////// + + uart_init(); + // device tree traverse + fdt_traverse(get_cpio_addr,_dtb_ptr); + traverse_file(); + + // buddy system init + buddy_system_init(_dtb_ptr); + + unsigned long el = 0; + asm volatile ("mrs %0, CurrentEL":"=r"(el)); + uart_send_string("Current exception level: "); + uart_hex(el>>2); // CurrentEL store el level at [3:2] + uart_send_string("\n"); + + asm volatile("mov %0, sp"::"r"(el)); + uart_send_string("Current stack pointer address: "); + uart_hex(el); + uart_send_string("\n"); + + // say hello + uart_send_string("Type in `help` to get instruction menu!\n"); + + uart_enable_interrupt(); + + + while(1){ + asm volatile("nop"); + } + //echo everything back + //shell(); +} + + +/* +void except_handle() { + uart_send_string("In exception"); + + unsigned long long esr_el1 = 0; + asm volatile ("mrs %0, esr_el1" :: "r" (esr_el1)); + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + unsigned imm16 = esr_el1 & 65535; //65535 = 0x1111111111111111(16) + + uart_send_string("\nec: "); + uart_hex(ec); + uart_send_string("\n"); + uart_send_string("imm16: "); + uart_hex(imm16); + uart_send_string("\n"); + + if (ec != 0x15){ // SVC from AArch64 + while(1) nop; + } + + switch (imm16) { + case 0x1337: { // exit from EL0 + // update spsr to make eret jumps back to loop + // set EL1h and mask all interrupts + uart_send_string("In the svc execution"); + return; + } + } +} +*/ diff --git a/lab4/shell/main.o b/lab4/shell/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0bda1750159724d98708f2ff0c0ecb7e74322f3d GIT binary patch literal 3872 zcmbW4L2MLd6oB9E6s-saX$u7!8Khz%Ft%9ZLNqKb$b}G;l8}g*PP;$s;_mD+GfP^V zXidBrFKt*66Cs*-pp^p$qaKVJPacVY@t|fk9yn@{U=vGyZ|1$>ce;DwHUIqYegAv! z|Nl2L|4!dLaOlN!Dg`1b_yX=*LIFk|y{~6OH4Cet4HhQ9o?S3t=JwIl?B52=wZqg8 zX@CxNsZpCc{Y(bBVa;3V_ILeJp{nO8m)Mx91ckC|7S&l*+{0;r z(}MW>*hW_J&+;4-;A}Gr*n?< zDS&6|#`;jdwYa#h9p@yDZQ4&~=K-?wPS{6tjIcgDn7K(l*k-WRC~oTB;B_C@PIevF zK|S7gvSYux(GhYP*T=|zlWE+fb`RGA2Zx6Cn7zkFt8P#=`}?f{t8Zt2H8lI**tN^* z8`#DeLjhKYSAf*(FGI`t_Gf{ z=mF425BR>eYw3&IFKruqZ|nId_rKqBVatIJo)|jUTYHMV8g~@h0)H(w8Z{ceIRFO! zH4+0eH4+1sEy1lJS<0i=l2)};40vb>jQp2!ax~zPCH~R8%cGYvF>1tb)Bgtyh@y1b zhQ=DLKH+^rW@3|jifSxRqt=MO(1agGzDC<`c#n}CZQ}oG6Ye$PlTG+LP5AjH{F5g9 z^CtY8CLBsm!L`PqCkH*_5GX&eJ>}%=v2v;8xH+ggUSRvmMUr>C$ix#&v%*0xcgF?}_qcO@@aXbZfE*P~dfd^rlN}+7iX$dEDfgO0xS>^c(M6pj6iV8-n zx!i>9Pxyf<*->IzRbGupb1ByuEh-$rqt~le0^Dl+9&f})dKCedZtjWe&xO3x?a1}F zV?Xcsk z3zs@jeej%)lm3lgRU##&!R%m{WfI4UXko)`&|j34O0|{Ed#~8f$W2GHl=AUY--- zKQT|%|K~)W<81$t$RqrgmS+R&)cvV(z0UtImvxS?{V(^jPT_JiC)e4Ebs-_H&%0XV z`n(;?W!|YU8f(j3<`v%EB#)`_jhutJZq}FKIDTiwl4Xr}YfMqG{E1TFjA9>nQJ)vh zQ$@!L)OY|^&Iuf_MtvVFuS^EH_gfh>#R&Ijlg|zXe#t-f Y^bd+I$^FyW)F{5r>!>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* literal 0 HcmV?d00001 diff --git a/lab4/shell/rootfs/file1.txt b/lab4/shell/rootfs/file1.txt new file mode 100644 index 000000000..5c275ef57 --- /dev/null +++ b/lab4/shell/rootfs/file1.txt @@ -0,0 +1 @@ +This is file one. diff --git a/lab4/shell/rootfs/one.img b/lab4/shell/rootfs/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab4/shell/rootfs/pack.sh b/lab4/shell/rootfs/pack.sh new file mode 100644 index 000000000..d837d685d --- /dev/null +++ b/lab4/shell/rootfs/pack.sh @@ -0,0 +1,2 @@ +find . | cpio -o -H newc > ../initramfs.cpio + diff --git a/lab4/shell/rootfs/thisisfile2.txt b/lab4/shell/rootfs/thisisfile2.txt new file mode 100644 index 000000000..0a8a2c0d7 --- /dev/null +++ b/lab4/shell/rootfs/thisisfile2.txt @@ -0,0 +1 @@ +Here is file two with longer size. diff --git a/lab4/shell/shell.c b/lab4/shell/shell.c new file mode 100644 index 000000000..89cbe18c8 --- /dev/null +++ b/lab4/shell/shell.c @@ -0,0 +1,146 @@ +#include "header/shell.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/mailbox.h" +#include "header/reboot.h" +#include "header/cpio.h" +#include "header/allocator.h" +#include "header/dtb.h" +#include "header/irq.h" +#include "header/timer.h" +#define BUFFER_MAX_SIZE 256u + + +extern void *_dtb_ptr; + +void read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + uart_send_char(buffer[index]); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + break; + } + index++; + } +} +/* +void async_read_command(char* buffer) { + int index = 0; + char tmp[1]; + + while (1) { + if (uart_async_read(tmp) > 0) { + buffer[index] = tmp[0]; + uart_send_char(tmp[0]); + if (tmp[0] == '\r') { + buffer[index] = '\0'; + break; + } + index++; + } + } +} +*/ + +void parse_command(char* buffer){ + char* input_string = buffer; + char* parameter[5]; //5 is the available parameter length + int para_idx = 0; + int input_string_len = utils_strlen(input_string); + for(int i=0; i < input_string_len; i++){ + if(*(input_string+i) == ' '){ + *(input_string+i) = '\0'; + parameter[para_idx++] = (input_string+i+1); + } + } + + if(utils_string_compare(input_string,"help")) { + uart_send_string("help :print this help menu\n"); + uart_send_string("hello :print Hello World!\n"); + uart_send_string("info :Get the hardware's information\n"); + uart_send_string("reboot :reboot the device\n"); + uart_send_string("ls :list the file\n"); + uart_send_string("cat :print file content\n"); + uart_send_string("malloc :give dynamic memory space\n"); + uart_send_string("dtb :print device tree\n"); + uart_send_string("exec :execute user program\n"); + } else if (utils_string_compare(input_string,"hello")) { + uart_send_string("Hello World!\n"); + } else if (utils_string_compare(input_string,"info")) { + get_board_revision(); + uart_send_string("My board revision is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + get_arm_mem(); + uart_send_string("My ARM memory base address is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("My ARM memory size is: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); + } else if (utils_string_compare(input_string,"reboot")) { + uart_send_string("Rebooting....\n"); + reset(1000); + } else if (utils_string_compare(input_string,"ls")) { + cpio_ls(); + } else if (utils_string_compare(input_string,"cat")){ + //uart_send_string("Filename: "); + //char filename[BUFFER_MAX_SIZE]; + //read_command(filename); + //cpio_cat(filename); + cpio_cat(parameter[0]); + } else if (utils_string_compare(input_string,"malloc")){ + char *a = simple_malloc(sizeof("9876")); + char *b = simple_malloc(sizeof("345")); + a[0] = '9'; + a[1] = '8'; + a[2] = '7'; + a[3] = '6'; + a[4] = '\0'; + b[0] = '3'; + b[1] = '4'; + b[2] = '5'; + b[3] = '\0'; + uart_send_string(a); + uart_send_char('\n'); + uart_send_string(b); + uart_send_char('\n'); + } else if (utils_string_compare(input_string,"dtb")) { + fdt_traverse(print_dtb,_dtb_ptr); + } else if (utils_string_compare(input_string,"exec")) { + //uart_send_string("Program name: "); + //char buffer[BUFFER_MAX_SIZE]; + //read_command(buffer); + cpio_exec_program(parameter[0]); + } else if (utils_string_compare(input_string,"timer")) { + + setTimeout("hello world1",3); + setTimeout("hello world2",6); + setTimeout("hello world3",9); + + } else if (utils_string_compare(input_string,"settimeout")) { + char *message = (char *)parameter[0]; + size_t second_str_len = utils_strlen(parameter[1]); + uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); + setTimeout(message,seconds); + } else { + uart_send_string("The instruction "); + uart_send_string(input_string); + uart_send_string(" is not exist.\n"); + } +} + +void shell(){ + /* + while(1) { + char buffer[BUFFER_MAX_SIZE]; + uart_send_string("# "); + //async_read_command(buffer); + parse_command(buffer); + } + */ + +} diff --git a/lab4/shell/shell.o b/lab4/shell/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..716286e80b959f6f98c9d10c09f860e44587de5e GIT binary patch literal 7040 zcmcJTe`p-X702KGuq|0m>R1WAcKYb z-tK$r(df36KnLz-<}+`;^WMzt?2l)^d-!|tSPUe^;P-H^CKMpsrIh_*7Vd*huyXE? zb1Mm$zWGFK?p6XWbVBpvFOSCOwkF|k-A3XQG@W@R-uYtlsmC(zdYFctu!Y#Ar`$|; zFPw_qy*vJ=IP9bLn@z5&xoXpT|8N0xG#ToX<`2QVJH(zE=05*~PbsXMbP3Db{5;-54w#yPc^ z=)ABC&@b{S0Rxy%;m@!CKgtv%>8_mn%XuCrwZ;#Cf&ayBHU{6;`@*`_G59(^Z;tVJ zsZzYY@XImtg%`%Y`0HCvJ`NY3-2(f5yMESr4$Bf> zHr5;q;!XMS(pbb~Y~5!A{Ue5brpR^|WN+gYa+~s~KC`^0YD~KBBI=rf@8Mj&uhsqW zV$F|v9I;!ohj4EU-1=yEPGbBA&V|3%@tUDngL>+MIIrN_bWB$jN#VJP`~KqMJE{7@Ei*Vu_i3+P5%wg zG8(Ss7#H1?W*fJjRGyDK{k}oOQTxz3~K@xjT}34;J~2K z`((aR^%_Qhe|jL@x2M11SNnglcW=6H;9HFS{+s=OfY{kFNKQN)+p(z|dXdR(>KL^T z-QV}x`q$SDznq*&9C#)EtJvu0pMCP_-!I=EZ1jVyF_Z9ZM_=3cdi(IpZ8ICZjh}x; zR>K`5VQG|0Lmj!WbR;Ydhoz%o>2O#Qm7xw%IS`hHI!1!Q04Sy_>{F8Ss0_~zy#4+A zZmaeLQ0v;1z=N_?N}!US+Iway#Bf)+lfEfBWkBdBlte#q;s5&{XK!@L-=c@GakY12!1w#HzW9D1pjpee=~x= z9le9FFTBV5Dcr#>olxll^h`ic5pNr2 zF;}QnDrU6^4b$;*CoL~m!23*4bFC`2Q?+h7u657Uv&(J{kFBy*g@#n{7$pldwUq8? zg$+0qo_%;fvCH||1kf=4!JdhRi=2y&@N3Lx=YuM2)^vo^10^M0r%ThB56obvrX$>l(CN{1mRP4((-FQqLWds2DM?%s z|9(wJc$WEg%+>vKP}31V4r@BXN14<7sQdYtrqjpuBImMR!b{9`f6AJU`0Z&r!Y7#P z{xmh6S*}lNI>KLy(3#P6&U5`$O-J}|6diS*f5)8S#rMuIz0LePn5RMt@D6i|>p_LT z%UsrdgzN8dF7qt>5_5e&f1v3c=lVS78O&9GK4dQXVt<7>>2Fp1TvWI^57!jFO|ieu zT;eKm{RZbUuJ9#AN7cWhaMhn=JQz%$hc@Oi?j-l$#9YP|zBxi?r^3~7cQe=bc^`8b zSJpMdT*ei?U(r{uyMvmJtoLC}NBC%jPLVnJ*`=&YUEyC>xW`=lpXYgdhPn7JyvdyA zU-kbbg>P5%Uyb0G6t1rOyu#J{_=3V!`$gsyuWEmdxx}@=aou1paS2~i^wqeQnbUQ> zLy7B-!s%IEQj(wN=(Y!`s13;b)M%RYdXS@DLVKaG)zTJXPI?MnvU>tgw8XXj+_fkO-K0i%xV5r ze@CfgI=97c=x1%(?5pJ%T7^C5HD554Tq0(039!Y?cO>h*Fp zf?w10v#ftZ(-*$PocvVvWpA%T&JuofBOIgf<6OV0@ms75Y4=RUGxL~xPLP+RH9!LOSodkalWRA@lxp2GaD>gdfTvjbCZ3^r0U-xySX)!q3o-dRwL33H-)o z@#tSYGq5X$y6PQ*)Ux!4X<6b4s;l+@Avz=I-7kwjH7#`nwOP*Tdm4??#zu0se}lO; z3}nI=O76fJX{c#8R!H-!_V35Oq`4P=YLfBgJ|%79zxa{G1}gW70q2waQbzu%N%~3t zeQcDnYWI%%Ql~WNwm;?m>Ru)Dce(#{r7so5f5AV&LaX(g;)kLUHl+2VzS3XTkNnZc xrY^Jm$*GSQhPDBHbJF|McP@SH5WxZsi0L6MV6E!k!&~*g!v2>6nebol{~u0gF?s+1 literal 0 HcmV?d00001 diff --git a/lab4/shell/start.S b/lab4/shell/start.S new file mode 100644 index 000000000..00f6e7bd7 --- /dev/null +++ b/lab4/shell/start.S @@ -0,0 +1,163 @@ + +.section ".text.kernel" + +.global _start + + + +_start: + ldr x1, =_dtb_ptr //put _dtb_ptr into register1 + str x0, [x1] //store dtb address from x0 to _dtb_ptr + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + ldr x1, =_start + bl from_el2_to_el1 + mov sp, x1 + + + /* set exception vector table */ + adr x0, exception_vector_table + msr vbar_el1, x0 + + //bl core_timer_enable + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + //bl core_timer_enable + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b + +from_el2_to_el1: + mov x0,#(1<<31) + msr hcr_el2,x0 + mov x0,#0x345 // 0x3c5 + msr spsr_el2,x0 + msr elr_el2,lr + eret +/* +core_timer_enable: + //mov x0,1 + //msr cntp_ctl_el0, x0 //enable + //mrs x0, cntfrq_el0 + //mov x3,5 + //mul x0, x0, x3 + //msr cntp_tval_el0,x0 // set expired time + //mov x0,2 + //ldr x1, =CORE0_TIMER_IRQ_CTRL + //str w0,[x1] //unmask timer interrupt + //ret +*/ +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + + +exception_handler: + save_all + bl except_handler_c + load_all + eret + +irq_exception_handler: + save_all + bl irq_except_handler_c + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + b exception_handler // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + +.global _dtb_ptr //define a global variable _dtb_ptr +.section .data //_dtb_ptr is in data section +_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 + diff --git a/lab4/shell/start.o b/lab4/shell/start.o new file mode 100644 index 0000000000000000000000000000000000000000..e072c076b559d6f0854b82792804731424c17969 GIT binary patch literal 7616 zcmeHM-Afcv6hFH&xmtd#7PzS73W5=}Vf2NBj+P&l_VtqaGR(SDyR;uRJCqsd68!^) zPd-%kcAj9X>2?b#(lIt`&G0H=DM!djmQH(nXWX?#An zia7vpmZ82S|1zFi2B{_AjjbTO_+SX)`$7Q7$2uSR)aWOlTLto^LnL2M>?7aKR*>&K z0rF$8lB`~*~rw8&4;yQ>oKfTjY2>|j$Y*GLyil`aS=KCkz)Wk z29aY3IW8f`W#qVm9K*;lf*eIkxX~mj*&8va82fRJt?E!BO?A0D<+A#uC`{r)U+)}QCBKgC&pjI(|h zXMOxly=xQ7o)iEG;4jN5;FEGDfLH=sXAq^hg@|yS$q1Q!5#kJf$i~+g{HTrNzZ!p; zqboAF6JN>TH!(X{X8gxZytEEyoOtHwWW>br!q{!>Gm>URYzI8G1D@CchxSRhqh(UE znmj4%8N78uLc1@kljG`yp2(!-xRQ<~RSnu>AjkBmJfUk)eEL8g*E5=|E77D1vK-B3 z<*cq~y5lFNR7fd_w2RbXl*e&QN3cCsn>D?VrkQ5^sK+P07juiHk^iDVz8aQ1lDHR~RCJYAjCArez`1tM4& zh-hk3iBL3hPu0?D(#^9=pB~HMP@#g!mzciOrLk^n!w$vRH&e2Mm~C3}#&=*GjbZbh z^|NWVZ>)YNKA{*pe&=X0>|Qj=!VKsbLiC#;VRKuq$?7fHAmyiVPP+BIu(V6xQh=}> rP_PFaz+Ac?*!(KQ*tsJFVCzqto#KU^Ki%8q@+JGcwY!*VdTjn5L;n#g literal 0 HcmV?d00001 diff --git a/lab4/shell/tasklist.c b/lab4/shell/tasklist.c new file mode 100644 index 000000000..8d79c6f3d --- /dev/null +++ b/lab4/shell/tasklist.c @@ -0,0 +1,66 @@ +#include "header/tasklist.h" +#include "header/allocator.h" +#include "header/uart.h" + +task_t *task_head = NULL; + +void enqueue_task(task_t *new_task) { + // Disable interrupts to protect the critical section + asm volatile("msr DAIFSet, 0xf"); + // Special case: the list is empty or the new task has higher priority + if (!task_head || new_task->priority < task_head->priority) { + new_task->next = task_head; + new_task->prev = NULL; + if (task_head) { + task_head->prev = new_task; + } + task_head = new_task; + } else { + // Find the correct position in the list + task_t *current = task_head; + while (current->next && current->next->priority <= new_task->priority) { + current = current->next; + } + + // Insert the new task + new_task->next = current->next; + new_task->prev = current; + if (current->next) { + current->next->prev = new_task; + } + current->next = new_task; + } + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, uint64_t priority) { + + task_t* task = simple_malloc(sizeof(task_t)); + if(!task) { + return; + } + + task->callback = callback; + task->priority = priority; + + enqueue_task(task); +} + +void execute_tasks() { + + + while (task_head) { + task_head->callback(); + task_head = task_head->next; + if (task_head) { + task_head->prev = NULL; + } + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + //simple_free(task); + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts +} + diff --git a/lab4/shell/tasklist.o b/lab4/shell/tasklist.o new file mode 100644 index 0000000000000000000000000000000000000000..3ecce4a61a6abc49022957361bdb58937d6d5d39 GIT binary patch literal 2144 zcmbtU&1(}u6n~rD+S`4Tm!|Y$5!|$BixgWwdJu$Uo36ApNo#fk(TeRK z;6brhrAO0~hZH@C6i*(-kK)CTg9o7?m3UdC#`h*O$udp6_?FrCo8SAIeKR}D=f=Rm!2-k^s@P!AfB^X6%Y^#D2XH?MhO4MhPy>b=#<2|Ac8>yAgBs*R04~P3 zCG_1?V_QAU?%P(;{!LZZk7f#68F1QIuu0v57fI$FY~)9JSbjK z^1oDAFJcbRR^H;WR@VRuo#RTrcqN+OU3&EdxlVzpb|uyiZU?SA?lauD0tIL?T!6D% zGzVNy+{e~j2;#cw8;Sq=r?f%eQ1lxv<)(ZvIx;d8>YbX-rk!jk643|s{=P_-O(S;) z2K4^H6P(7S0JO3k&r&TPwdRQcQ1PiHDrS-;z=*vk>mcLz z`V+0fK4$g4%KnYe=_NTdEp%Bn2rKS2oN@e}v_2?laZ z$mo$)4<^`!gU*A2!z-`(ue-y^{irFGI4|NpI?j3dPdB8xJPpesFloBOC}+KRQIC8{ zo^#ctl?R1+>-b z|8xG6j`3LPKiys;Ui6>J$h9eCN7U!K89Dkd<#@^~_Z}%&expiry < timer_head->expiry) { + new_timer->next = timer_head; + new_timer->prev = NULL; + if (timer_head) { + timer_head->prev = new_timer; + } + timer_head = new_timer; + + // Reprogram the hardware timer + asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); + return; + } + + // Find the correct position in the list + while (current->next && current->next->expiry < new_timer->expiry) { + current = current->next; + } + + // Insert the new timer + new_timer->next = current->next; + new_timer->prev = current; + if (current->next) { + current->next->prev = new_timer; + } + current->next = new_timer; + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + + +void create_timer(timer_callback callback, void* data, uint64_t after) { + //Allocate memory for the timer + timer_t* timer = simple_malloc(sizeof(timer_t)); + if(!timer) { + return; + } + + //Set the callback and data + timer->callback = callback; + timer->data = data; + + //Calculate the expiry time + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); + timer->expiry = current_time + after * cntfrq; + //Add the time to the list + add_timer(timer); +} + + +void print_message(void *data) { + char *message = data; + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); + uint64_t seconds = current_time / cntfrq; + + uart_send_string("Timeout message: "); + uart_send_string(message); + uart_send_string(" occurs at "); + uart_hex(seconds); + uart_send_string("\n"); +} + +void setTimeout(char *message,uint64_t seconds) { + + char *message_copy = utils_strdup(message); + + if(!message_copy){ + return; + } + + if (!timer_head) { + //enable core_timer_interrupt + unsigned int value = 2; + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = value; + } + + create_timer(print_message,message_copy,seconds); +} + diff --git a/lab4/shell/timer.o b/lab4/shell/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..2073fbde9b7685a25c77b303f1959a2feaf6cbc6 GIT binary patch literal 3064 zcmbW2O>7%Q6oB7)o#LixNSjn30?nq1P(gHMhe$+$!#YtZNKpw*DuINsH}*D;u;a+P zmI8@LihAggs^J1^4?V>>aR{OuKvlW+R0y}03UMokK!}77k$G?Sy=JnpCB#_c_vYL8 zGxKI?=Ie5LrL~MeU`aNJ&yb`IQ3uOF*iR$dCPD(`Y=iyZF7fUSoaRjIHl* z0UIYKjM^!zgMqz2(ft*zai`m<8(mP}UHp;O*&~d`G&frB{(2g!K28iawkf`eInN zJ2~_cWAwm1QqB0}0>l?i8oeETU?F)n#PA-;bf| ziCPl-gwg;$Aert=-Z*r#ZS;D4)g1dGHs1d5!6rGUkBqSfLuht|eU?I>y#729V9Pun&+Q)Ar@b$^*P06*~t5c^FuL`O55Ekm1V$Rkspkd~YtF@dJD? z6M}-b0B$~?QJ#>icy8eFz@IJ67rji$Ef&i;@V$VqA5??cqEAus)p<~knS$r$0iMTs zQR~Ka=%>I^6yQXJ4>0dV-pM+NS6c8SbBQnalkN{Si7$LO#1M_|Xq?W1w6|E1_@{Y1 z!BXN2pJM)8Wd2#^6h}YZSR&OxS+?yAfN52Ri`lhfCiO6)+{iT>u|1S2Id=er$PI1gZF<>eFFGsle%RC%>PP)7= z#C(MF%lk#R_=$X*{pGpHOaF2GAF_YcyujeL1Y{}m7yLdd&Gv7LKZ#j3r2Qjb@t6Ih xbwqQMi^Urvbv%NM?q$@UzRS_QLj*}aKg%@Gn$%6uF;trQPjI4w7_yA|{|i80T(tlI literal 0 HcmV?d00001 diff --git a/lab4/shell/uart.c b/lab4/shell/uart.c new file mode 100644 index 000000000..4d0df7857 --- /dev/null +++ b/lab4/shell/uart.c @@ -0,0 +1,209 @@ +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +#define RX_INTERRUPT_BIT 0x01 +#define TX_INTERRUPT_BIT 0x02 + +#define AUXINIT_BIT_POSTION 1<<29 + +char uart_read_buffer[UART_BUFFER_SIZE]; +char uart_write_buffer[UART_BUFFER_SIZE]; +int uart_read_head = 0; +int uart_read_index = 0; +int uart_write_index = 0; +int uart_write_head = 0; + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + // P.104 Since I need UART 1 Transmit/Receive Data -> TXD1/RXD1 + // p.102 I find These two in GPIO 14/15 Fun5 + // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 + // That's why I need GPFSEL1 + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 + r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 + *GPFSEL1 = r; // from here activate Trasmitter&Receiver + + //Since We've set alt5, we want to disable basic input/output + //To achieve this, we need diable pull-up and pull-dwon + *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down + //Wait 150 cycles + //this provides the required set-up time for the control signal + r=150; while(r--) { asm volatile("nop"); } + // GPIO control 54 pins + // GPPUDCLK0 controls 0-31 pins + // GPPUDCLK1 controls 32-53 pins + // set 14,15 bits = 1 which means we will modify these two bits + // trigger: set pins to 1 and wait for one clock + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + + + r=1000; while(r--) { asm volatile("nop"); } + + /* initialize UART */ + *AUX_ENABLE |=1; + //P.9: If set the mini UART is enabled. The UART will + //immediately start receiving data, especially if the + //UART1_RX line is low. + //If clear the mini UART is disabled. That also disables + //any mini UART register access + *AUX_MU_CNTL = 0; + //P.17 If this bit is set the mini UART receiver is enabled. + //If this bit is clear the mini UART receiver is disabled + //Prevent data exchange in initialization process + *AUX_MU_IER = 0; + //Set AUX_MU_IER_REG to 0. + //Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; + //P.14: 00 : the UART works in 7-bit mode + //11(3) : the UART works in 8-bit mode + //Cause 8 bits can use in ASCII, Unicode, Char + *AUX_MU_MCR = 0; + //Don’t need auto flow control. + //AUX_MU_MCR is for basic serial communication. Don't be too smart + *AUX_MU_BAUD = 270; + //set BAUD rate to 115200(transmit speed) + //so we need set AUX_MU_BAUD to 270 to meet the goal + *AUX_MU_IIR = 0xc6; + // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 + // Writing with bit 1 set will clear the receive FIFO + // Writing with bit 2 set will clear the transmit FIFO + // Both bits always read as 1 as the FIFOs are always enabled + /* map UART1 to GPIO pins */ + *AUX_MU_CNTL = 3; // enable Transmitter,Receiver + +} + + +/** + * Send a character + */ +void uart_send_char(unsigned int c) { + /* wait until we can send */ + // P.15 AUX_MU_LSR register shows the data(line) status + // AUX_MU_LSR bit 5 => 0x20 = 00100000 + // bit 5 is set if the transmit FIFO can accept at least one byte. + // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop + // else FIFO can not accept at lease one byte then still wait + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the + //UART FIFOs. + //communicate with(send to) the minicom and print to the screen + *AUX_MU_IO=c; +} + +/** + * Display a string + */ +void uart_send_string(char* s) { + while(*s) { + /* convert newline to carriage return + newline */ + if(*s=='\n') + uart_send_char('\r'); + uart_send_char(*s++); + } +} + +/** + * Receive a character + */ +char uart_get_char() { + char r; + /* wait until something is in the buffer */ + //bit 0 is set if the receive FIFO holds at least 1 symbol. + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + /* convert carriage return to newline */ + return r=='\r'?'\n':r; +} + + +/** + * Display a binary value in hexadecimal + */ +void uart_hex(unsigned long long d) { + unsigned long long n; + int c; + uart_send_string("0x"); + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x57:0x30; + uart_send_char(n); + } +} + +void uart_hexll(uint64_t d) { + uart_send_string("0x"); + unsigned int n; + int c; + for (c = 60; c >= 0; c -= 4) { + // get highest tetrad + n = (d >> c) & 0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n += n > 9 ? 0x37 : 0x30; + uart_send_char(n); + } +} + + + +void uart_enable_interrupt() { + + // Enable RX and TX interrupt for mini UART + uint32_t ier = mmio_read(AUX_MU_IER); + ier |= RX_INTERRUPT_BIT; + //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); + mmio_write(AUX_MU_IER, ier); + + // Enable the mini UART interrupt in the second-level interrupt controller + uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; + enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 + mmio_write(ENABLE_IRQS_1, enable_irqs1); +} + +void uart_disable_interrupt() { + uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; + disable_irqs1 |= AUXINIT_BIT_POSTION; + mmio_write(DISABLE_IRQS_1,disable_irqs1); +} + +int uart_async_read(char *buffer) { + if (uart_read_head == uart_read_index) { + // No characters available full! + return 0; + } else { + buffer[0] = uart_read_buffer[uart_read_head++]; + if (uart_read_head >= UART_BUFFER_SIZE) { + uart_read_head = 0; + } + return 1; + } +} +void uart_async_write(const char *buffer, int length) { + for (int i = 0; i < length; i++) { + uart_write_buffer[uart_write_head++] = buffer[i]; + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + } + // Trigger TX interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); +} + +void uart_async_send(const char *str) { + int length = utils_strlen(str); + uart_async_write(str, length); +} + + diff --git a/lab4/shell/uart.o b/lab4/shell/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..34201a8239a474db7c38c9b5349e302c1e8931bc GIT binary patch literal 4048 zcmbVOUu+a*5TCuhmV=gZlo}d9dj}^}17}++DZa365n>_=my#$UUhjGfz0e-*-8L49 zvZWA6^?@ouLIU_8;ZJ~D5Bp=I zm3FKdjFAX@o(-oeD#PG^u^C`wFFrLP{W|!ecdSro(-vSH9E)ifM=?vMvBL+pV_(ZQ zZ~Pz(<+bvm{4$IW<8vS|ls`CoDBq5`pU3?Qd`jmG<+0p`c8n*E<%s#`4&^VQo&-A< z!98HiE!>At{{`jMupK*q@^ZBu(@|1gqk8;j%DoTymZBf&^p0bNmsV?-m-2_$PXl9( z=7UD^^`njaDbH!mj;*bQUPFU6y~=1J4lmCj##8KXj|#6yKFLA#OcV+W2auC;QCtY~ zj}~UF2F%fn+*Cgx21}r_rV)A}IIxI#Cih%Ahdn)fTZi+LIt*i-!+0h~s6L7v)a}?G zbL@OcsqNHCJY$i|$HV2uCu<{cZ`?j`d_QO(sr7aQVY46W+8c!Wfk%b5$vtCdpDN!h z%vWm1Fkg($W-1?4V!mF?w+Qo-xxUsu+zpKwS-{U_QU)T`i5{;TCSy1*b4d6SuGez%G(?B)2XZ!6r>fuBgJea_m@jZ^zV9t%0Q^TBQsngrT zh!5Y=7o4ZOrI=Ueyc*|S=gCW0T**68W;~$zlH8MfzH@q8*AK9vwe{6d?UrO;#_9{z z*GC(pb*t+8oNfJw4Gqz{#upd{2x1|$wD)7+?|)8PTwdc~)h-Nwu_V8htVcYU!TL52 z*2a1x%Oxl~S??j)ToF9sJE?8Gd82~1WIsd-uIcQQ`>bOH@aF!8F|yMl`GcbYY+^~+ zIP2{!Ln!}c-6q*w5jx>NskeOU+jjHDk4{Z&E)qD8cs<@L6d4fEr@fg8$6IQer6ZHN z0uDe~ikA*0MPQkO%!C*7le-SHX5a}xRgs1K-KtcR4y7stba<7XbCCI=c_RESM@S!6 zFkZ#4EOXSvcn{+;OY0f`g7F^adrNrm3r$P#t*BGp{ftXqvJ-xR@gN1^I*1S9ql|BI zP=L=E4{|Hp8K=1<{~pF|#xJ52PKF$D6+h==-vitl>Ckn?gM8G2-)3C)BL86=g|h@N z!E+)0pa3ivGXA)eV(&|2t!M{C`XQ16+QieDwB>3!Gn0yUbSAQ%ZO+Q3Gdo;hhiQ4t zoo2raqteyos%9pU>@tzkGPBvf9_CG@bJM|z-0nDNJYM{J#-COE$7jI*o&lGuOyvpj{Hygu z7^nC0)?+hH??rcmtRpk<9GiiMemiK<+;hp!zRvla!te5aor24~^R|M^z0;-Oa_@Ys z;8mRbO9hvEXH>!E-uX$vrLT7sT<)ER3NH5!M02~ltwa)~m33vOXj!u>5w*;I3!~=_{r`&) zhGMIp_zn@9K_9s8a-ZE@@g2Gt4KzoFIIui4+f|McIj%YQkSh0`%-C|ql{8T29ZvL- z#dNZD{sR%`Oz~BckRy~W)FV!u4Qv-7`Bh$tmpTj#AYJBL;$P#V;zYiVxaeNj z_*1_ByBzQRt`Sc=$5$)lQorPS2NiNP1Yj9*|Hwdq /dev/null 2>/dev/null || true diff --git a/lab4/shell/userprogram/linker.ld b/lab4/shell/userprogram/linker.ld new file mode 100644 index 000000000..ab70a30ea --- /dev/null +++ b/lab4/shell/userprogram/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab4/shell/userprogram/one.S b/lab4/shell/userprogram/one.S new file mode 100644 index 000000000..4acf6f4dd --- /dev/null +++ b/lab4/shell/userprogram/one.S @@ -0,0 +1,7 @@ +.section ".text" +.global _start +_start: + svc 0x1337 +1: + nop + b 1b diff --git a/lab4/shell/userprogram/one.elf b/lab4/shell/userprogram/one.elf new file mode 100644 index 0000000000000000000000000000000000000000..b13e36ed9627aa5a41acd8767b43259aeddc6b32 GIT binary patch literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB literal 0 HcmV?d00001 diff --git a/lab4/shell/userprogram/one.img b/lab4/shell/userprogram/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab4/shell/userprogram/one.o b/lab4/shell/userprogram/one.o new file mode 100644 index 0000000000000000000000000000000000000000..c00c28e5b03a97b1c7da93cb70b11273c5c3833a GIT binary patch literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T literal 0 HcmV?d00001 diff --git a/lab4/shell/utils.c b/lab4/shell/utils.c new file mode 100644 index 000000000..d2fc5ac4d --- /dev/null +++ b/lab4/shell/utils.c @@ -0,0 +1,68 @@ +#include "header/utils.h" +#include "header/allocator.h" + +int utils_string_compare(const char* str1,const char* str2) { + for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ + if(*str1 != *str2) return 0; + else if(*str1 == '\0' && *str2 =='\0') return 1; + } + return 1; +} + +unsigned long utils_atoi(const char *s, int char_size) { + unsigned long num = 0; + for (int i = 0; i < char_size; i++) { + num = num * 16; + if (*s >= '0' && *s <= '9') { + num += (*s - '0'); + } else if (*s >= 'A' && *s <= 'F') { + num += (*s - 'A' + 10); + } else if (*s >= 'a' && *s <= 'f') { + num += (*s - 'a' + 10); + } + s++; + } + return num; +} + +void utils_align(void *size, unsigned int s) { + unsigned long* x = (unsigned long*) size; + unsigned long mask = s-1; + *x = ((*x) + mask) & (~mask); +} + +char *utils_ret_align(char *addr, unsigned alignment) +{ + return (char *) (((unsigned long long) addr + alignment - 1) & ~((unsigned long long) alignment - 1)); +} + +uint32_t utils_align_up(uint32_t size, int alignment) { + return (size + alignment - 1) & ~(alignment-1); +} + +//with null-terminator -> "hello" return 6 +size_t utils_strlen(const char *s) { + size_t i = 0; + while (s[i]) i++; + return i+1; +} + + +char *utils_strcpy(char* dst, const char *src) { + char *save = dst; + while((*dst++ = *src++)); + return save; +} + + +char *utils_strdup(const char *src) { + size_t len = utils_strlen(src); + char *dst = simple_malloc(len); + if (dst == NULL) { // Check if the memory has been successfully allocated + return NULL; + } + utils_strcpy(dst, src); // Copy the string + return dst; +} + + diff --git a/lab4/shell/utils.o b/lab4/shell/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..a954be0cd2016659d2accb5a623990b8fc6ea0d3 GIT binary patch literal 2440 zcmbtUPiPcp6o2!_sM%m^2q=xzU0p?sPIo0jY7d=gTcIs&S667Iu+DDA?AF~)vO5d0 zO0%Uc6jNw}o`hEDA5hOiZ#qg30Z%IJsg-CCJ*bBg3e6!M-nNl<{VdOETliZ=8?0(5BK-kdakGs?x`G=BR{nEf1J?*)L# z`3)Cd@QuRn(_o%}Ajku>57GI)0heDx{UZbNJ$`Bi@!P8a2Eb3xkbePs9<+7HkAVFO zJUo3T?L%&>spY=h1pOuauBBn}(*Hp|{gIa2_Jx-F8L`wKkTcPLdH^Qp0P++EFgC@y zz7*ss@3oCE+0L}j{~ZJyC?{b$*o!F>a$7*38G+Opy!#^IbSL`m8QM!=!Yu%82IZT` z&&2hp%ORFP-P_1}NvC1m*wP^lbNpp!mofgVUUr6m2!g%G*1#;;B$x9?{o9JYGs;`S z{{4t{l4I%A)k{kT%q}EgaRK`V7~9sP*i_#<$1i>y#RrU!<2mO8T%r7g>*dri)j;_d z687TKsT&uihJUFS2M-+Bm)vor*s6Q2WHxIJS()A0R(Q;Qx@V7-8QRG(JRi;;Z~Dn0 zFsEMB2KzRL*ha>On3LTumcNc+Hp^m9cK9$tieqKQ2AGrGX_h4}Vc#;giFq3NPb`lT zA6b|D&ivlke^x)-d-u;f>tH0o>aL95z6t*X-IPYx%>Xd)uNxT{Nu{+R&~3vgPHf58 zu`lGSaXD6!0jpPnh!}v|q|kGC?vK?kbE19`E@zq5%Z&TTiDWjfqD=Pl1R@EJk3Wjf zSCe{=GCsh#%x;Wvn{k<+$M`YE!x8GbbH71Z)7)uvT~^c18=Av_hDUZYYUE0o4- z6Hdcr(DBAAB33J7b(R~hS8!tIP%gA4I-#nr*kat$#L13k6wR8I+CMvjR%q^)3&$Hy z&E<5@%#s*^uB>j5jTq6d+>hwA@+}Rbg0|Hb1Lp7ZD#<&i{iRTASTFc?#?@Z}Gd^tg zA*PfQ{#H`Vr}fWrOnFa~gGlnr-bH99ztpi06(Wlb@yrv}{~r6R=HfpW4~nw%PvEyu z=+^%-_upqj>OcMJiNExpYFBfU%YO{c@#T6EqfhmxxN7ea0-uUP`X*w_|J7ctM@={X O9sD3aT=t9v)&DU;a33`Q literal 0 HcmV?d00001 From 2f84522b05b18a4501a9bf2828641cee2b980928 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:00:44 +0800 Subject: [PATCH 03/24] Create readme.md --- lab3_asy/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab3_asy/readme.md diff --git a/lab3_asy/readme.md b/lab3_asy/readme.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab3_asy/readme.md @@ -0,0 +1 @@ + From 3f0d207641f629fdef6daff5e48325badf18635f Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:01:53 +0800 Subject: [PATCH 04/24] Add files via upload --- lab3_asy/shell/Makefile | 22 ++ lab3_asy/shell/Untitled-1 | 0 lab3_asy/shell/allocator.c | 20 ++ lab3_asy/shell/allocator.o | Bin 0 -> 1744 bytes lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32753 bytes lab3_asy/shell/cpio.c | 96 ++++++++ lab3_asy/shell/cpio.o | Bin 0 -> 4768 bytes lab3_asy/shell/dtb.c | 163 ++++++++++++++ lab3_asy/shell/dtb.o | Bin 0 -> 4880 bytes lab3_asy/shell/except.c | 280 ++++++++++++++++++++++++ lab3_asy/shell/except.o | Bin 0 -> 6352 bytes lab3_asy/shell/header/allocator.h | 7 + lab3_asy/shell/header/cpio.h | 39 ++++ lab3_asy/shell/header/dtb.h | 26 +++ lab3_asy/shell/header/gpio.h | 38 ++++ lab3_asy/shell/header/irq.h | 22 ++ lab3_asy/shell/header/mailbox.h | 38 ++++ lab3_asy/shell/header/reboot.h | 8 + lab3_asy/shell/header/shell.h | 2 + lab3_asy/shell/header/tasklist.h | 22 ++ lab3_asy/shell/header/timer.h | 20 ++ lab3_asy/shell/header/uart.h | 39 ++++ lab3_asy/shell/header/utils.h | 25 +++ lab3_asy/shell/initramfs.cpio | Bin 0 -> 1024 bytes lab3_asy/shell/kernel8.elf | Bin 0 -> 83976 bytes lab3_asy/shell/kernel8.img | Bin 0 -> 13408 bytes lab3_asy/shell/linker.ld | 44 ++++ lab3_asy/shell/mailbox.c | 51 +++++ lab3_asy/shell/mailbox.o | Bin 0 -> 2064 bytes lab3_asy/shell/main.c | 80 +++++++ lab3_asy/shell/main.o | Bin 0 -> 3728 bytes lab3_asy/shell/reboot.c | 16 ++ lab3_asy/shell/reboot.o | Bin 0 -> 1496 bytes lab3_asy/shell/rootfs/file1.txt | 1 + lab3_asy/shell/rootfs/one.img | Bin 0 -> 16 bytes lab3_asy/shell/rootfs/pack.sh | 2 + lab3_asy/shell/rootfs/thisisfile2.txt | 1 + lab3_asy/shell/shell.c | 151 +++++++++++++ lab3_asy/shell/shell.o | Bin 0 -> 7040 bytes lab3_asy/shell/start.S | 163 ++++++++++++++ lab3_asy/shell/start.o | Bin 0 -> 7616 bytes lab3_asy/shell/tasklist.c | 73 ++++++ lab3_asy/shell/tasklist.o | Bin 0 -> 2472 bytes lab3_asy/shell/timer.c | 115 ++++++++++ lab3_asy/shell/timer.o | Bin 0 -> 3480 bytes lab3_asy/shell/uart.c | 207 ++++++++++++++++++ lab3_asy/shell/uart.o | Bin 0 -> 4712 bytes lab3_asy/shell/userprogram/Makefile | 11 + lab3_asy/shell/userprogram/linker.ld | 19 ++ lab3_asy/shell/userprogram/one.S | 7 + lab3_asy/shell/userprogram/one.elf | Bin 0 -> 66352 bytes lab3_asy/shell/userprogram/one.img | Bin 0 -> 16 bytes lab3_asy/shell/userprogram/one.o | Bin 0 -> 728 bytes lab3_asy/shell/utils.c | 63 ++++++ lab3_asy/shell/utils.o | Bin 0 -> 2320 bytes 55 files changed, 1871 insertions(+) create mode 100644 lab3_asy/shell/Makefile create mode 100644 lab3_asy/shell/Untitled-1 create mode 100644 lab3_asy/shell/allocator.c create mode 100644 lab3_asy/shell/allocator.o create mode 100644 lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab3_asy/shell/cpio.c create mode 100644 lab3_asy/shell/cpio.o create mode 100644 lab3_asy/shell/dtb.c create mode 100644 lab3_asy/shell/dtb.o create mode 100644 lab3_asy/shell/except.c create mode 100644 lab3_asy/shell/except.o create mode 100644 lab3_asy/shell/header/allocator.h create mode 100644 lab3_asy/shell/header/cpio.h create mode 100644 lab3_asy/shell/header/dtb.h create mode 100644 lab3_asy/shell/header/gpio.h create mode 100644 lab3_asy/shell/header/irq.h create mode 100644 lab3_asy/shell/header/mailbox.h create mode 100644 lab3_asy/shell/header/reboot.h create mode 100644 lab3_asy/shell/header/shell.h create mode 100644 lab3_asy/shell/header/tasklist.h create mode 100644 lab3_asy/shell/header/timer.h create mode 100644 lab3_asy/shell/header/uart.h create mode 100644 lab3_asy/shell/header/utils.h create mode 100644 lab3_asy/shell/initramfs.cpio create mode 100644 lab3_asy/shell/kernel8.elf create mode 100644 lab3_asy/shell/kernel8.img create mode 100644 lab3_asy/shell/linker.ld create mode 100644 lab3_asy/shell/mailbox.c create mode 100644 lab3_asy/shell/mailbox.o create mode 100644 lab3_asy/shell/main.c create mode 100644 lab3_asy/shell/main.o create mode 100644 lab3_asy/shell/reboot.c create mode 100644 lab3_asy/shell/reboot.o create mode 100644 lab3_asy/shell/rootfs/file1.txt create mode 100644 lab3_asy/shell/rootfs/one.img create mode 100644 lab3_asy/shell/rootfs/pack.sh create mode 100644 lab3_asy/shell/rootfs/thisisfile2.txt create mode 100644 lab3_asy/shell/shell.c create mode 100644 lab3_asy/shell/shell.o create mode 100644 lab3_asy/shell/start.S create mode 100644 lab3_asy/shell/start.o create mode 100644 lab3_asy/shell/tasklist.c create mode 100644 lab3_asy/shell/tasklist.o create mode 100644 lab3_asy/shell/timer.c create mode 100644 lab3_asy/shell/timer.o create mode 100644 lab3_asy/shell/uart.c create mode 100644 lab3_asy/shell/uart.o create mode 100644 lab3_asy/shell/userprogram/Makefile create mode 100644 lab3_asy/shell/userprogram/linker.ld create mode 100644 lab3_asy/shell/userprogram/one.S create mode 100644 lab3_asy/shell/userprogram/one.elf create mode 100644 lab3_asy/shell/userprogram/one.img create mode 100644 lab3_asy/shell/userprogram/one.o create mode 100644 lab3_asy/shell/utils.c create mode 100644 lab3_asy/shell/utils.o diff --git a/lab3_asy/shell/Makefile b/lab3_asy/shell/Makefile new file mode 100644 index 000000000..beea4a7b2 --- /dev/null +++ b/lab3_asy/shell/Makefile @@ -0,0 +1,22 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include +CFLAGS += -I /usr/aarch64-linux-gnu/include +all: kernel8.img + +start.o: start.S + aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o + +%.o: %.c + aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf + aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab3_asy/shell/Untitled-1 b/lab3_asy/shell/Untitled-1 new file mode 100644 index 000000000..e69de29bb diff --git a/lab3_asy/shell/allocator.c b/lab3_asy/shell/allocator.c new file mode 100644 index 000000000..4ca648ee9 --- /dev/null +++ b/lab3_asy/shell/allocator.c @@ -0,0 +1,20 @@ +#include "header/allocator.h" +#include "header/utils.h" + +#define SIMPLE_MALLOC_BUFFER_SIZE 8192 +static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; +static unsigned long simple_malloc_offset = 0; + +void* simple_malloc(unsigned long size){ + //align to 8 bytes + utils_align(&size,8); + + if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { + //Not enough space left + return (void*) 0; + } + void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; + simple_malloc_offset += size; + + return allocated; +} diff --git a/lab3_asy/shell/allocator.o b/lab3_asy/shell/allocator.o new file mode 100644 index 0000000000000000000000000000000000000000..42047e4bff9d5a846fec68d6bb675751e99ff9b2 GIT binary patch literal 1744 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 OPqI~*e!TdI|Nj8Si!WyY literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/cpio.c b/lab3_asy/shell/cpio.c new file mode 100644 index 000000000..a38879c9c --- /dev/null +++ b/lab3_asy/shell/cpio.c @@ -0,0 +1,96 @@ +#include "header/cpio.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/allocator.h" + +int file_num = 0; +struct file *f = NULL; + +void allocate_file_array() { + if (f == NULL) { + f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); + if (f == NULL) { + uart_send_string("Memory allocation error\n"); + // Handle memory allocation error + } + } +} + +void traverse_file() +{ + allocate_file_array(); + char* addr = (char *)cpio_addr; + + + while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ + + struct cpio_header *header = (struct cpio_header *)addr; + unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); + unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; + unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); + + utils_align(&headerPathname_size, 4); + utils_align(&file_size, 4); + + f[file_num].file_header = header; + f[file_num].filename_size = filename_size; + f[file_num].headerPathname_size = headerPathname_size; + f[file_num].file_size = file_size; + f[file_num].file_content_head = (char*) header + headerPathname_size; + + addr += (headerPathname_size + file_size); + file_num += 1; + } +} + +int findfile(char* filename) { + for(int n=0;n<=file_num;n++) { + if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ + return n; + } + } + return -1; +} + +void cpio_ls() +{ + for(int n=0;n<=file_num;n++) { + uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); + uart_send_string("\n"); + } +} + + +void cpio_cat(char *filename) +{ + int targetfile_num = findfile(filename); + + if(targetfile_num != -1) { + for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) + { + uart_send_char(f[targetfile_num].file_content_head[i]); + } + uart_send_string("\n"); + + } else { + uart_send_string("Can not Find the file\n"); + } + +} + +void cpio_exec_program(char* filename) { + int targetfile_num = findfile(filename); + + char* target = (char*) 0x20000; + for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/dtb.c b/lab3_asy/shell/dtb.c new file mode 100644 index 000000000..523dac1d4 --- /dev/null +++ b/lab3_asy/shell/dtb.c @@ -0,0 +1,163 @@ +#include "header/dtb.h" +#include "header/uart.h" +#include "header/utils.h" +#define UNUSED(x) (void)(x) + + +char* cpio_addr; +int space = 0; +//1. Define the callback function type(fdt_callback) +//2. Create a structure for holding the FDT header information(fdt_header) +//3. Implement helper functions to extract the FDT header information + +uint32_t fdt_u32_le2be (const void *addr) { + const uint8_t *bytes = (const uint8_t *) addr; + uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; + return ret; +} + +void send_space(int n) { + while(n--) uart_send_string(" "); +} + +int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { + uintptr_t end_ptr = cur_ptr + totalsize; + + while(cur_ptr < end_ptr) { + + uint32_t token = fdt_u32_le2be((char *)cur_ptr); + cur_ptr += 4; + + switch(token){ + case FDT_BEGIN_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. + Node name (variable length, NULL-terminated): Specifies the name of the node being opened. + */ + //uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char*)cur_ptr,NULL,0); + cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); + break; + case FDT_END_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_END_NODE token. + */ + //uart_send_string("In FDT_END_NODE;\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_PROP: { + + /* + Token type (4 bytes): Indicates that it's an FDT_PROP token. + Data length (4 bytes): Specifies the length of the property data (len). + Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). + Property data (variable length): Contains the property data itself, the size of which is determined by len. + */ + //uart_send_string("In FDT_PROP \n"); + uint32_t len = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + //second parameter name here is property name not node name + cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); + cur_ptr += utils_align_up(len,4); + break; + + } + case FDT_NOP: + //uart_send_string("In FDT_NOP\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_END: + //uart_send_string("In FDT_END\n"); + cb(token,NULL,NULL,0); + return 0; + default:; + return -1; + } + } + return -1; + +} +//4. Implement the fdt_traverse function: + +int fdt_traverse(fdt_callback cb,void * _dtb){ + uintptr_t dtb_ptr = (uintptr_t) _dtb; + uart_send_string("\ndtb loading at: "); + uart_hex(dtb_ptr); + // uart_send_char('\n'); + uart_send_string("\r\n"); + struct fdt_header* header = (struct fdt_header*) dtb_ptr; + + uint32_t magic = fdt_u32_le2be(&(header->magic)); + + if (magic != 0xd00dfeed){ + + uart_send_string("The header magic is wrong\n"); + return -1; + } + + /* + +-----------------+ + | fdt_header | <- dtb_ptr + +-----------------+ + | reserved memory | + +-----------------+ + | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) + +-----------------+ + | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) + +-----------------+ + */ + + uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); + uint32_t totalsize = fdt_u32_le2be(&header->totalsize); + parse_struct(cb, struct_ptr,strings_ptr,totalsize); + return 1; + +} + +//5. Implement the initramfs_callback function: +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ + UNUSED(size); + if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ + cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); + uart_send_string("cpio address is at: "); + uart_hex((uintptr_t)fdt_u32_le2be(data)); + // uart_send_char('\n'); + uart_send_string("\r\n"); + } +} + +//6. Implement print_dtb callback function: + +void print_dtb(int token, const char* name, const void* data, uint32_t size) { + UNUSED(data); + UNUSED(size); + + switch(token){ + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_space(space); + uart_send_string((char*)name); + uart_send_string("{\n "); + space++; + break; + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if(space >0) send_space(space); + uart_send_string("}\n"); + break; + case FDT_NOP: + break; + case FDT_PROP: + send_space(space); + uart_send_string((char*)name); + break; + case FDT_END: + break; + } +} diff --git a/lab3_asy/shell/dtb.o b/lab3_asy/shell/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9 GIT binary patch literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/except.c b/lab3_asy/shell/except.c new file mode 100644 index 000000000..047cee92b --- /dev/null +++ b/lab3_asy/shell/except.c @@ -0,0 +1,280 @@ + +#include "header/uart.h" +#include "header/irq.h" +#include "header/shell.h" +#include "header/timer.h" +#include "header/tasklist.h" +#include "header/utils.h" + +#define CNTPSIRQ_BIT_POSITION 0x02 +#define AUXINIT_BIT_POSTION 1<<29 + + +void except_handler_c() { + uart_send_string("In Exception handle\n"); + + //read spsr_el1 + unsigned long long spsr_el1 = 0; + asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); + uart_send_string("spsr_el1: "); + uart_hex(spsr_el1); + uart_send_string("\n"); + + //read elr_el1 + unsigned long long elr_el1 = 0; + asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); + uart_send_string("elr_el1: "); + uart_hex(elr_el1); + uart_send_string("\n"); + + //esr_el1 + unsigned long long esr_el1 = 0; + asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); + uart_hex(esr_el1); + uart_send_string("\n"); + + //ec + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + uart_send_string("ec: "); + uart_hex(ec); + uart_send_string("\n"); + + + while(1){ + + } + +} + +void timer_irq_handler(char dontcare) { + uart_send_string("in timer_irq_handler\n"); + //enable core_0_timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + // Disable interrupts to protect critical section + // asm volatile("msr DAIFSet, 0xf"); + // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x02); + + uint64_t current_time; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + + while(timer_head && timer_head->expiry <= current_time) { + timer_t *timer = timer_head; + + //Execute the callback + timer->callback(timer->data); + + // Remove timer from the list + timer_head = timer->next; + if (timer_head) { + timer_head->prev = NULL; + } + + //free timer + + // Reprogram the hardware timer if there are still timers left + if(timer_head) { + asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } else { + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + } + + + //enable interrupt + asm volatile("msr DAIFClr,0xf"); + } + uart_send_string("out timer_irq_handler\n"); +} + +void uart_transmit_handler(char dontcare) { + uart_send_string("in uart trans handler \n"); + mmio_write(AUX_MU_IO, 1); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); + uart_send_string("test2\n"); + // special case (Enter) + if (uart_write_buffer[uart_write_index-1] == '\r'){ + uart_write_buffer[uart_write_index++] = '\n'; + uart_write_buffer[uart_write_index] = '\0'; + } + else if (uart_write_buffer[uart_write_index-1] == '\n') + { + uart_write_buffer[uart_write_index] = '\0'; + } + + uart_hex(uart_write_index); + uart_hex(uart_write_head); + uart_send_string("test\n"); + // Send data from the write buffer + while (uart_write_head != uart_write_index) + { + // uart_send_string("in uart trans handler flag1 \n"); + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + + if (uart_write_head == uart_write_index) { + uart_send_string("in uart trans handler flag2 \n"); + //uart_send_string("//////////////// \n"); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n') + { + // uart_send_string("in uart trans handler flag3 \n"); + uart_read_buffer[uart_read_index-1] = '\0'; + parse_command(uart_read_buffer); + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + // uart_send_string("in uart trans handler flag4 \n"); + } + } + } + // uart_send_string("out uart trans handler \n"); + // mmio_write(AUX_MU_IO, 0); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x1); +} + +void uart_receive_handler(char data) { + // uart_send_string("in uart receive handler \n"); + // uart_hex(uart_write_index); + // uart_hex(uart_write_head); + // Read data(8 bytes) and store it in the read buffer + // char data = mmio_read(AUX_MU_IO) & 0xff; + //uart_send_char(data); + //uart_send_string("\r\n"); + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + create_task(uart_transmit_handler,2,'a'); // for echo +} + + +void irq_except_handler_c(char dontcare) { + + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + // unsigned long long DAIFSet = 0; + // asm volatile("mrs %0, DAIFSet":"=r"(DAIFSet)); + // uart_hex(DAIFSet); + uart_send_string("in irq_except_handler_c \n"); + // uart_hex(uart_write_index); + // uart_hex(uart_write_head); + uint32_t irq_pending1 = mmio_read(IRQ_PENDING_1); + uint32_t core0_interrupt_source = mmio_read(CORE0_INTERRUPT_SOURCE); + uint32_t iir = mmio_read(AUX_MU_IIR); + if (core0_interrupt_source & CNTPSIRQ_BIT_POSITION) { + + // uart_send_string("in core0 interrupt \n"); + //djsable core 0 timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 0; + + create_task(timer_irq_handler,3,'a'); + // uart_send_string("out core0 interrupt\n"); + } + + // Handle UART interrupt + if (irq_pending1 & AUXINIT_BIT_POSTION) { + // uart_send_string("in irq pending \n"); + // uart_hex(uart_write_index); + // uart_hex(uart_write_head); + if ((iir & 0x06) == 0x04) { + char data = mmio_read(AUX_MU_IO) & 0xff; + uart_send_string("in iir 0x04 aaaa \n"); + // Disable receive interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); + create_task(uart_receive_handler, 1, data); + } + + if ((iir & 0x06) == 0x02) { + char data = 'a'; + uart_send_string("in iir 0x02 bbb \n"); + + // Disable transmit interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x02)); + create_task(uart_transmit_handler, 2, data); + } + } + + // asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); + execute_tasks(); + //asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + // uart_send_string("out irq_except_handler_c\n"); + +} + + +/* +void uart_irq_handler(){ + // uart_send_string("in uart_irq_handler\n"); + ///uart_hex(uart_write_index); + ///uart_hex(uart_write_head); + ///uart_send_string("\r\n"); + uint32_t iir = mmio_read(AUX_MU_IIR); + + // Check if it is a receive interrupt + if ((iir & 0x06) == 0x04) { + // Read data(8 bytes) and store it in the read buffer + /// uart_send_string("in uart_irq_handler_receive\n"); + char data = mmio_read(AUX_MU_IO) & 0xff; + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + // Enable tx interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); + } + + // Check if it is a transmit interrupt + if ((iir & 0x06) == 0x02) { + /// uart_send_string("in uart_irq_handler_transmit\n"); + // Send data from the write buffer + if (uart_write_head != uart_write_index) { + /// uart_send_string("in uart_irq_handler_trans_!=\n"); + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + } else { + /// uart_send_string("in uart_irq_handler_trans_else\n"); + // Disable tx interrupt when there is no data left to send + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + + if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n'){ + uart_read_buffer[uart_read_index-1] = '\0'; + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + parse_command(uart_read_buffer); + // uart_write_index = 0; + } + } + } +} +*/ + diff --git a/lab3_asy/shell/except.o b/lab3_asy/shell/except.o new file mode 100644 index 0000000000000000000000000000000000000000..3ac9484bf34c297ab740786f28e43547c60b27d8 GIT binary patch literal 6352 zcmbVQVN6@s6+ZTJh(l%7daQt6B>vOITNpM?%_lLS07OEo-G2+q~2$V1jK{ zuT;fN&=y7e0m4nPDT$agsZeE7r>0uaP?t?i;zxc&6w+*3JGbITrA1noHcG9PvUA=$ z7f!BiP3nm*_ulV*=R4=#ckg|E89mVTq}SsCWghqgZ1fZgFur4>Z8=Q~?tuze9hsZK z?l_i-RRbnIJ>;3W{k)g3tjC{O^uYA3eURw}EDZp&=0~;5-^_h`xf*@4UMoL|<&XiF z_Tc!PTFBpzwI86m4j>QPth|N%Jy_PhZ!8n{T@PI9skHKSu;X7b4+O*Bju{i$ulJN$ z`HUCx)|YE!b$r?FkVI`YSYIZ%EykFQ~U zCu+>(kNTWBf&bK^x$^q0<5)LfU61+Vdd-qH>2`oMTMuX?F@3lUerWg z!XLoc?chB+<%1yk&tsw34L;cZ>O#0J;)Pj{0kaY0lV9kI`-TPpf?mvj6muot-+Z|i z+=*H_c6H>h(^rhp_4Wm`ZEkJteq5{Vot{j0BldHK z_u&ZTxX{q{HjdTB8rsl5JBs;GJeq?CO9>6ugU(Aw^T%6iPZ0b|p=f9Iun z!}vq!^APg!ndLEuZxQ$Z@fs>J-NeQC;~kJ$#CiftwSoPW&Bu2(qF$KvFjrmg;_6zk z7>~3_m$X>3TIIhw@=n3tL|(SaYFj2h@}YjtsCuKy?Prr-n4mu4tp&Vl2Up|O-EGS` z<8DmqW?tEONa<6J1<%VnGwQ7W6VIjOAGb~~LIs}tEvFW}xz}$2o_~7wL0o&>JF|~r zu{{30OYrfYWLaJ1XeA8gaNmrU!_X9-XWApHBY$zuCEXvSO?L>^6SPL{&iXod_TTuN zW$ZCJlgMerc)X6z`kcU+QQW^L&=>jHyJMVkVo;70gYqK|Y1QNNC9RK)s)tn^SF5h5 z7IL63Zl?MM>_n(9F%*i0({b}aI%*$F^$o^ZhG0k@OC~~gfAixe^#B|YYrFq080@Iaz&Mn-?P#e9 zgrZIi@~82>gxQpCYBj@XYG4CzF(Z)(!B6eq|G2sP*~oA_HEcFF2U-J7k2ViG-R4(X zS^`b2-(VPZw~;uS=cR7&r62UvR@A{G*spO=fO)Dr?zPVQFKj+AS(e@On(wsn%o*>G z-aGKY`^(qgUAh;5E`{$he+dsC@(-Rbzp$lq(x2VD@3peioA#gaoi%>t{k6w?xcr0n z|MvIyZn&-;TPgk+`(EaH7uILFO&cHe%=5krM(3nAOY#&?ackUo&iFnW{~-pTtU9(* zD7V$^Hb||&V;|F|y z7MKD40*n9y$_j9L9+hIg&htkMe?zSA73uU?3H&>VlaBIt_61_W5`4P^{$dII7bS4I zc+{T8=DJN`s~G8v15{2tyC&b~z~$M|QAJNp%}+gOU} zfO`W3qR`k2jcF*j)PSz7P|}X~hLWj7U;G88#O!ddJLX(z1AQrVi@4~EiN2H_>WlZ< zX$eGzj~uZR64?-nDQW_>rK{6t&tu_4(hfxj2L|xcb#)SU)b9JKy&gY`e2kq6Cyzq0 zOAhC3M~9h_#DzgqC#VXKfIJ;)C-2bk8rKbK5qHmy3(#Fbwij`{s@ClZZqbhgiC<(~ z#Z|hO7*}x>eueR!THFOqr-}PlxmG#~zri@=DfdNA;M=)P)lF{e^Yx=YnaW??%N2~P zxC-CJxUOR|PU|D{X%x83r;~BYztT;?`P;=f>ErLDbqg|1`jU^|7LMuse#X_j4zkiQ z#?`zOo)S88KcpGg=QXD3A7=fNn!duF7ZGyw{Lcz~xjyFvF4yxKn!KB zOYmj>rr=AwN$_RoGZI2bR_HXep9Ev~{zL)s(QApT+;lhug(u`2fF`sf7%}U fvqK1K-2WH=Lz}SH1^Vq!%zrokXo-=SFx~%u6P_nV literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/header/allocator.h b/lab3_asy/shell/header/allocator.h new file mode 100644 index 000000000..56f46666f --- /dev/null +++ b/lab3_asy/shell/header/allocator.h @@ -0,0 +1,7 @@ +#ifndef ALLOCATOR_H +#define ALLOCATOR_H + + +void* simple_malloc(unsigned long size); + +#endif diff --git a/lab3_asy/shell/header/cpio.h b/lab3_asy/shell/header/cpio.h new file mode 100644 index 000000000..be0e36b9f --- /dev/null +++ b/lab3_asy/shell/header/cpio.h @@ -0,0 +1,39 @@ +//#define QEMU_CPIO_ADDR (char *)0x8000000; //qemu +//#define RASP_CPIO_ADDR (char *)0x20000000;//rasperrypi + +#define MAX_FILE_NUM 10 + +extern char* cpio_addr; + +void traverse_file(); +void cpio_ls(); +void cpio_cat(char* filename); +void cpio_exec_program(char* filename); + +struct cpio_header { + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; //determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; //determine when two entries refer to the same file. + char c_mode[8]; //specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +}; + + +struct file { + struct cpio_header* file_header; + unsigned long filename_size; + unsigned long headerPathname_size; + unsigned long file_size; + char* file_content_head; +}; + diff --git a/lab3_asy/shell/header/dtb.h b/lab3_asy/shell/header/dtb.h new file mode 100644 index 000000000..16af25520 --- /dev/null +++ b/lab3_asy/shell/header/dtb.h @@ -0,0 +1,26 @@ +#include +// #include +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); + +struct __attribute__((packed)) fdt_header { + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +}; + +int fdt_traverse(fdt_callback cb,void *dtb_ptr); +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); +void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab3_asy/shell/header/gpio.h b/lab3_asy/shell/header/gpio.h new file mode 100644 index 000000000..38ca70635 --- /dev/null +++ b/lab3_asy/shell/header/gpio.h @@ -0,0 +1,38 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +//Page 90, Physical/bus addr diff +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + + +// Helper function to write data to a memory-mapped I/O address +static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { + *reg = data; +} + +// Helper function to read data from a memory-mapped I/O address +static inline uint32_t mmio_read(volatile uint32_t* reg) { + return *reg; +} + +#endif diff --git a/lab3_asy/shell/header/irq.h b/lab3_asy/shell/header/irq.h new file mode 100644 index 000000000..9085cb30c --- /dev/null +++ b/lab3_asy/shell/header/irq.h @@ -0,0 +1,22 @@ +#ifndef IRQ_H +#define IRQ_H + +#include "gpio.h" + + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) + + +#endif + diff --git a/lab3_asy/shell/header/mailbox.h b/lab3_asy/shell/header/mailbox.h new file mode 100644 index 000000000..d13ac3ce9 --- /dev/null +++ b/lab3_asy/shell/header/mailbox.h @@ -0,0 +1,38 @@ +#include "gpio.h" + +extern volatile unsigned int mailbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_GETBOARD 0x00010002 +#define MBOX_TAG_GETARMMEM 0x00010005 +#define MBOX_TAG_LAST 0x00000000 + +int mailbox_call(); +void get_board_revision(); +void get_arm_mem(); + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 diff --git a/lab3_asy/shell/header/reboot.h b/lab3_asy/shell/header/reboot.h new file mode 100644 index 000000000..e1d44aa1b --- /dev/null +++ b/lab3_asy/shell/header/reboot.h @@ -0,0 +1,8 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); diff --git a/lab3_asy/shell/header/shell.h b/lab3_asy/shell/header/shell.h new file mode 100644 index 000000000..9784c1ccb --- /dev/null +++ b/lab3_asy/shell/header/shell.h @@ -0,0 +1,2 @@ +void shell(); +void parse_command(char* buffer); diff --git a/lab3_asy/shell/header/tasklist.h b/lab3_asy/shell/header/tasklist.h new file mode 100644 index 000000000..0b73da4b0 --- /dev/null +++ b/lab3_asy/shell/header/tasklist.h @@ -0,0 +1,22 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +// #include +#include + +typedef void (*task_callback)(); + +typedef struct task { + struct task *prev; + struct task *next; + char parameter; + task_callback callback; + uint64_t priority; +} task_t; + +void execute_tasks(); +void create_task(task_callback callback,uint64_t priority, char parameter); +void enqueue_task(task_t *new_task); +extern task_t *task_head; + +#endif diff --git a/lab3_asy/shell/header/timer.h b/lab3_asy/shell/header/timer.h new file mode 100644 index 000000000..a9a8c65da --- /dev/null +++ b/lab3_asy/shell/header/timer.h @@ -0,0 +1,20 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +// #include + +typedef void (*timer_callback)(void *data); + +typedef struct timer { + struct timer *prev; // previous timer in the list + struct timer *next; // next timer in the list + timer_callback callback; // the function to call when the timer expires + void *data; // data to be passed to the callback + uint64_t expiry; // the time at which the timer will expire +} timer_t; + +extern timer_t *timer_head; // head of the timer list + +void setTimeout(char *message,uint64_t seconds); +#endif diff --git a/lab3_asy/shell/header/uart.h b/lab3_asy/shell/header/uart.h new file mode 100644 index 000000000..0c3ff1bd8 --- /dev/null +++ b/lab3_asy/shell/header/uart.h @@ -0,0 +1,39 @@ +#ifndef UART_H +#define UART_H + +#include "gpio.h" +#include +#define UART_BUFFER_SIZE 1024 + +void uart_init(); +void uart_send_char(unsigned int c); +char uart_get_char(); +void uart_send_string(char* s); +void uart_hex(unsigned long long d); +void uart_enable_interrupt(); +int uart_async_read(char *buffer); +void uart_async_write(const char *buffer, int length); +void uart_async_send(const char *str); + + +extern char uart_read_buffer[UART_BUFFER_SIZE]; +extern char uart_write_buffer[UART_BUFFER_SIZE]; +extern int uart_read_index; +extern int uart_read_head; +extern int uart_write_index; +extern int uart_write_head; + +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +#endif diff --git a/lab3_asy/shell/header/utils.h b/lab3_asy/shell/header/utils.h new file mode 100644 index 000000000..3ba6dd719 --- /dev/null +++ b/lab3_asy/shell/header/utils.h @@ -0,0 +1,25 @@ +#include +// #include + +#define nop asm volatile("nop") + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + + +int utils_string_compare(const char* i, const char* j); +unsigned long utils_atoi(const char *s, int char_size); +void utils_align(void *size, unsigned int s); +uint32_t utils_align_up(uint32_t size, int alignment); +size_t utils_strlen(const char *s); +char *utils_strcpy(char* dst, const char *src); +char *utils_strdup(const char *src); diff --git a/lab3_asy/shell/initramfs.cpio b/lab3_asy/shell/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..faf47b52fd58348135f4805c9dad3157d9e67fb3 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/kernel8.img b/lab3_asy/shell/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..f528914e4aa4d556a58e0dbeadabedc57c6e434b GIT binary patch literal 13408 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 literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/linker.ld b/lab3_asy/shell/linker.ld new file mode 100644 index 000000000..5018defb6 --- /dev/null +++ b/lab3_asy/shell/linker.ld @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/mailbox.c b/lab3_asy/shell/mailbox.c new file mode 100644 index 000000000..7e0c5d99c --- /dev/null +++ b/lab3_asy/shell/mailbox.c @@ -0,0 +1,51 @@ +#include "header/mailbox.h" + +volatile unsigned int __attribute__((aligned(16))) mailbox[36]; + +int mailbox_call() +{ + unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ){ + /* is it a valid successful response? */ + if(mailbox[1] == MBOX_RESPONSE) + return 1; + } + } + return 0; +} + +void get_board_revision(){ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} + +void get_arm_mem(){ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} diff --git a/lab3_asy/shell/mailbox.o b/lab3_asy/shell/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2118f241e7cf5768d3e64c641e7118db6261bc GIT binary patch literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/main.c b/lab3_asy/shell/main.c new file mode 100644 index 000000000..b0f0731e8 --- /dev/null +++ b/lab3_asy/shell/main.c @@ -0,0 +1,80 @@ +#include "header/uart.h" +#include "header/shell.h" +#include "header/dtb.h" +#include "header/utils.h" +#include "header/cpio.h" +#include "header/timer.h" + +void test_read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + uart_send_string("\r\n"); + break; + } + else + { + uart_send_char(buffer[index]); + } + index++; + } +} + +extern void *_dtb_ptr; +void main() +{ + + uart_init(); + // pre test ////////////////////////// + char buffer[256]; + while(1) + { + uart_send_string("# "); + test_read_command(buffer); + char * input_string = buffer; + if(utils_string_compare(input_string,"in")) + { + break; + } + else + { + // uart_send_hex((uintptr_t) _dtb_addr); + uart_send_string("The instruct is not exist.\n"); + } + } + ///////////////////////////////////////// + + // set up serial console + uart_init(); + + unsigned long el = 0; + asm volatile ("mrs %0, CurrentEL":"=r"(el)); + uart_send_string("Current exception level: "); + uart_hex(el>>2); // CurrentEL store el level at [3:2] + uart_send_string("\r\n"); + + asm volatile("mov %0, sp"::"r"(el)); + uart_send_string("Current stack pointer address: "); + uart_hex(el); + uart_send_string("\r\n"); + + // say hello + fdt_traverse(get_cpio_addr,_dtb_ptr); + traverse_file(); + uart_send_string("Type in `help` to get instruction menu!\n"); + + uart_enable_interrupt(); + + + while(1){ + asm volatile("nop"); + // execute_tasks(); + } + //echo everything back + //shell(); +} + + diff --git a/lab3_asy/shell/main.o b/lab3_asy/shell/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c80fdbc7443a8e19e1096da4f762dd69d6d23497 GIT binary patch literal 3728 zcmbuBPiz!b7{I^XDFkaNwf`uT$kbLW1je@3xDXB7mWl^L(3ZqR%I^PdwKlWlkr##SYq%w+#N9mSZ=(lCw(;u+n^cNXTMxr*I;3FBDQ!_gQYf@ z`#uiPjwTgqb7vk&z%FQgCEoVByBQXC_ruwqjg85}00%M8Jk9Gs{v(U)vtNIRKI98q zWxigVB(dzEpUer}vR%(9XFT04V#abkBXAfiJC3l4Wkkuding8?=S2RH9=HR~ zyPlbOK`#|8+Y^p%X0wiPU9_4!U!nwhIw$g_wC)x4(*hI8j1;dR>~c?7jrG}&{Qcj0 zF22}_`?)n1TlgUk3%4`cVi%6LW9!2D+(x$63u`-Yd{EX4msDBRI+j+nuBCRY8;v#G z|B4pdM>@3_*6vrWZ7JOei3-;5FxD@I^-E#>R8mI4!UZtL5P``?6!akf|!JO(m-7A{!f#e!s3;JM+bipXgT}BiaA2_P4+mcw8Zrik_ezYe04@F%Aok)j&@gj< zth;G9=*X~^zD&|}q*=eza9JC@5U<3Z{`se?*P3BJ;>Udp0G%G-k>=(2rG1z8j=r_$ z?FWy%(|56V{M`q}F7#I(l2)}la&3S=H)_plHQx*X4S%&n!$`G6gH2U0nNBdoFOo9yC-H-5*{A(rfsJKb9+W*R@1}w|idZro5lrXA z45YH&RI21T;KwUj#T0!8VLI!jJjXmI99IAa609ZhZ{rT_p=)x z)olUtue+p9T)p4?uC^gppZX)xz9YgLsqDG_%s*4&sPVs0c!$)f`&Qwq{dbacUarfs~AVuwf|dkx?f!!gnAs45XUn_C=HTx z9cJXr7Rk8|%$t-r>b_bOzB7ytcytS76VBtgE|jFyi1Rz)Bf~vk@XRSN@Us*2Io2GJ zHw{nBcwl5r&je%2b-{3oG$8XqBY{IULW1AEatRFj7UG!>3_R=!3uUWWew~;0)#A+VQ>KBYE^h zQ3)gcTcH@L?8gDc{IC9l=u0t&u&HuU4z8#WbzVQOV;mXjRrQkwIvdJ3(fTEk*Q(!F zGGJP6tV!nJ{9Hde4^WB$Y^tQ?!%Ov1g_pzqDV$_owR=N-_?3yM?OEv`HJ_Itr}&b} z>t~!trPls+c@*P)(f$dsKkuK`6U~hX{*v%D*>6QgXSS$6oe-nX4kDP7f70L3K#}PF S>6=o^|AbsWowHPl`u_ts$YKlt literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/reboot.c b/lab3_asy/shell/reboot.c new file mode 100644 index 000000000..048f2d348 --- /dev/null +++ b/lab3_asy/shell/reboot.c @@ -0,0 +1,16 @@ +#include "header/reboot.h" + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab3_asy/shell/reboot.o b/lab3_asy/shell/reboot.o new file mode 100644 index 0000000000000000000000000000000000000000..dda9e282580625dcaef2ab81c697421da43712d2 GIT binary patch literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/rootfs/file1.txt b/lab3_asy/shell/rootfs/file1.txt new file mode 100644 index 000000000..5c275ef57 --- /dev/null +++ b/lab3_asy/shell/rootfs/file1.txt @@ -0,0 +1 @@ +This is file one. diff --git a/lab3_asy/shell/rootfs/one.img b/lab3_asy/shell/rootfs/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/rootfs/pack.sh b/lab3_asy/shell/rootfs/pack.sh new file mode 100644 index 000000000..d837d685d --- /dev/null +++ b/lab3_asy/shell/rootfs/pack.sh @@ -0,0 +1,2 @@ +find . | cpio -o -H newc > ../initramfs.cpio + diff --git a/lab3_asy/shell/rootfs/thisisfile2.txt b/lab3_asy/shell/rootfs/thisisfile2.txt new file mode 100644 index 000000000..0a8a2c0d7 --- /dev/null +++ b/lab3_asy/shell/rootfs/thisisfile2.txt @@ -0,0 +1 @@ +Here is file two with longer size. diff --git a/lab3_asy/shell/shell.c b/lab3_asy/shell/shell.c new file mode 100644 index 000000000..bfa8e0a3d --- /dev/null +++ b/lab3_asy/shell/shell.c @@ -0,0 +1,151 @@ +#include "header/shell.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/mailbox.h" +#include "header/reboot.h" +#include "header/cpio.h" +#include "header/allocator.h" +#include "header/dtb.h" +#include "header/irq.h" +#include "header/timer.h" +#define BUFFER_MAX_SIZE 256u + + +extern void *_dtb_ptr; + +void read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + uart_send_char(buffer[index]); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + break; + } + index++; + } +} +/* +void async_read_command(char* buffer) { + int index = 0; + char tmp[1]; + + while (1) { + if (uart_async_read(tmp) > 0) { + buffer[index] = tmp[0]; + uart_send_char(tmp[0]); + if (tmp[0] == '\r') { + buffer[index] = '\0'; + break; + } + index++; + } + } +} +*/ + +void parse_command(char* buffer){ + // uart_send_string("in parse command\n"); + char* input_string = buffer; + char* parameter[5]; //5 is the available parameter length + int para_idx = 0; + int input_string_len = utils_strlen(input_string); + for(int i=0; i < input_string_len; i++){ + if(*(input_string+i) == ' '){ + *(input_string+i) = '\0'; + parameter[para_idx++] = (input_string+i+1); + } + } + + if(utils_string_compare(input_string,"help")) { + uart_send_string("help :print this help menu\n"); + uart_send_string("hello :print Hello World!\n"); + uart_send_string("info :Get the hardware's information\n"); + uart_send_string("reboot :reboot the device\n"); + uart_send_string("ls :list the file\n"); + uart_send_string("cat :print file content\n"); + uart_send_string("malloc :give dynamic memory space\n"); + uart_send_string("dtb :print device tree\n"); + uart_send_string("exec :execute user program\n"); + } else if (utils_string_compare(input_string,"hello")) { + // uart_send_string("Hello World!\n"); + uart_send_string("Hello World!\n"); + } else if (utils_string_compare(input_string,"info")) { + get_board_revision(); + uart_send_string("My board revision is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + get_arm_mem(); + uart_send_string("My ARM memory base address is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("My ARM memory size is: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); + } else if (utils_string_compare(input_string,"reboot")) { + uart_send_string("Rebooting....\n"); + reset(1000); + } else if (utils_string_compare(input_string,"ls")) { + cpio_ls(); + } else if (utils_string_compare(input_string,"cat")){ + //uart_send_string("Filename: "); + //char filename[BUFFER_MAX_SIZE]; + //read_command(filename); + //cpio_cat(filename); + cpio_cat(parameter[0]); + } else if (utils_string_compare(input_string,"malloc")){ + char *a = simple_malloc(sizeof("9876")); + char *b = simple_malloc(sizeof("345")); + a[0] = '9'; + a[1] = '8'; + a[2] = '7'; + a[3] = '6'; + a[4] = '\0'; + b[0] = '3'; + b[1] = '4'; + b[2] = '5'; + b[3] = '\0'; + uart_send_string(a); + uart_send_char('\n'); + uart_send_string(b); + uart_send_char('\n'); + } else if (utils_string_compare(input_string,"dtb")) { + fdt_traverse(print_dtb,_dtb_ptr); + } else if (utils_string_compare(input_string,"exec")) { + //uart_send_string("Program name: "); + //char buffer[BUFFER_MAX_SIZE]; + //read_command(buffer); + cpio_exec_program(parameter[0]); + } else if (utils_string_compare(input_string,"timer")) { + + setTimeout("hello world1",3); + setTimeout("hello world2",6); + setTimeout("hello world3",9); + + } else if (utils_string_compare(input_string,"settimeout")) { + char *message = (char *)parameter[0]; + size_t second_str_len = utils_strlen(parameter[1]); + uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); + setTimeout(message,seconds); + } else { + uart_send_string("The instruction "); + uart_send_string(input_string); + uart_send_string(" is not exist.\n"); + } +} + +void shell(){ + /* + while(1) { + char buffer[BUFFER_MAX_SIZE]; + uart_send_string("# "); + //async_read_command(buffer); + parse_command(buffer); + } + */ + +} + + + diff --git a/lab3_asy/shell/shell.o b/lab3_asy/shell/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..716286e80b959f6f98c9d10c09f860e44587de5e GIT binary patch literal 7040 zcmcJTe`p-X702KGuq|0m>R1WAcKYb z-tK$r(df36KnLz-<}+`;^WMzt?2l)^d-!|tSPUe^;P-H^CKMpsrIh_*7Vd*huyXE? zb1Mm$zWGFK?p6XWbVBpvFOSCOwkF|k-A3XQG@W@R-uYtlsmC(zdYFctu!Y#Ar`$|; zFPw_qy*vJ=IP9bLn@z5&xoXpT|8N0xG#ToX<`2QVJH(zE=05*~PbsXMbP3Db{5;-54w#yPc^ z=)ABC&@b{S0Rxy%;m@!CKgtv%>8_mn%XuCrwZ;#Cf&ayBHU{6;`@*`_G59(^Z;tVJ zsZzYY@XImtg%`%Y`0HCvJ`NY3-2(f5yMESr4$Bf> zHr5;q;!XMS(pbb~Y~5!A{Ue5brpR^|WN+gYa+~s~KC`^0YD~KBBI=rf@8Mj&uhsqW zV$F|v9I;!ohj4EU-1=yEPGbBA&V|3%@tUDngL>+MIIrN_bWB$jN#VJP`~KqMJE{7@Ei*Vu_i3+P5%wg zG8(Ss7#H1?W*fJjRGyDK{k}oOQTxz3~K@xjT}34;J~2K z`((aR^%_Qhe|jL@x2M11SNnglcW=6H;9HFS{+s=OfY{kFNKQN)+p(z|dXdR(>KL^T z-QV}x`q$SDznq*&9C#)EtJvu0pMCP_-!I=EZ1jVyF_Z9ZM_=3cdi(IpZ8ICZjh}x; zR>K`5VQG|0Lmj!WbR;Ydhoz%o>2O#Qm7xw%IS`hHI!1!Q04Sy_>{F8Ss0_~zy#4+A zZmaeLQ0v;1z=N_?N}!US+Iway#Bf)+lfEfBWkBdBlte#q;s5&{XK!@L-=c@GakY12!1w#HzW9D1pjpee=~x= z9le9FFTBV5Dcr#>olxll^h`ic5pNr2 zF;}QnDrU6^4b$;*CoL~m!23*4bFC`2Q?+h7u657Uv&(J{kFBy*g@#n{7$pldwUq8? zg$+0qo_%;fvCH||1kf=4!JdhRi=2y&@N3Lx=YuM2)^vo^10^M0r%ThB56obvrX$>l(CN{1mRP4((-FQqLWds2DM?%s z|9(wJc$WEg%+>vKP}31V4r@BXN14<7sQdYtrqjpuBImMR!b{9`f6AJU`0Z&r!Y7#P z{xmh6S*}lNI>KLy(3#P6&U5`$O-J}|6diS*f5)8S#rMuIz0LePn5RMt@D6i|>p_LT z%UsrdgzN8dF7qt>5_5e&f1v3c=lVS78O&9GK4dQXVt<7>>2Fp1TvWI^57!jFO|ieu zT;eKm{RZbUuJ9#AN7cWhaMhn=JQz%$hc@Oi?j-l$#9YP|zBxi?r^3~7cQe=bc^`8b zSJpMdT*ei?U(r{uyMvmJtoLC}NBC%jPLVnJ*`=&YUEyC>xW`=lpXYgdhPn7JyvdyA zU-kbbg>P5%Uyb0G6t1rOyu#J{_=3V!`$gsyuWEmdxx}@=aou1paS2~i^wqeQnbUQ> zLy7B-!s%IEQj(wN=(Y!`s13;b)M%RYdXS@DLVKaG)zTJXPI?MnvU>tgw8XXj+_fkO-K0i%xV5r ze@CfgI=97c=x1%(?5pJ%T7^C5HD554Tq0(039!Y?cO>h*Fp zf?w10v#ftZ(-*$PocvVvWpA%T&JuofBOIgf<6OV0@ms75Y4=RUGxL~xPLP+RH9!LOSodkalWRA@lxp2GaD>gdfTvjbCZ3^r0U-xySX)!q3o-dRwL33H-)o z@#tSYGq5X$y6PQ*)Ux!4X<6b4s;l+@Avz=I-7kwjH7#`nwOP*Tdm4??#zu0se}lO; z3}nI=O76fJX{c#8R!H-!_V35Oq`4P=YLfBgJ|%79zxa{G1}gW70q2waQbzu%N%~3t zeQcDnYWI%%Ql~WNwm;?m>Ru)Dce(#{r7so5f5AV&LaX(g;)kLUHl+2VzS3XTkNnZc xrY^Jm$*GSQhPDBHbJF|McP@SH5WxZsi0L6MV6E!k!&~*g!v2>6nebol{~u0gF?s+1 literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/start.S b/lab3_asy/shell/start.S new file mode 100644 index 000000000..8f8331f31 --- /dev/null +++ b/lab3_asy/shell/start.S @@ -0,0 +1,163 @@ + +.section ".text.kernel" + +.global _start + + + +_start: + ldr x1, =_dtb_ptr //put _dtb_ptr into register1 + str x0, [x1] //store dtb address from x0 to _dtb_ptr + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + ldr x1, =_start + bl from_el2_to_el1 + mov sp, x1 + + + /* set exception vector table */ + adr x0, exception_vector_table + msr vbar_el1, x0 // vbar -> Vector Base Address Register + + //bl core_timer_enable + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + //bl core_timer_enable + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b + +from_el2_to_el1: + mov x0,#(1<<31) + msr hcr_el2,x0 + mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable + msr spsr_el2,x0 // spsr -> saved program status register + msr elr_el2,lr // lr->link register elr->Eeception Link Register + eret +/* +core_timer_enable: + //mov x0,1 + //msr cntp_ctl_el0, x0 //enable + //mrs x0, cntfrq_el0 + //mov x3,5 + //mul x0, x0, x3 + //msr cntp_tval_el0,x0 // set expired time + //mov x0,2 + //ldr x1, =CORE0_TIMER_IRQ_CTRL + //str w0,[x1] //unmask timer interrupt + //ret +*/ +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + + +exception_handler: + save_all + bl except_handler_c + load_all + eret + +irq_exception_handler: + save_all + bl irq_except_handler_c + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + b exception_handler // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + +.global _dtb_ptr //define a global variable _dtb_ptr +.section .data //_dtb_ptr is in data section +_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 + diff --git a/lab3_asy/shell/start.o b/lab3_asy/shell/start.o new file mode 100644 index 0000000000000000000000000000000000000000..815811e7bafe472582f0983e07edcf6df83d8ad4 GIT binary patch literal 7616 zcmeHM&1(}u6o1LCO{@J@XlRQ~p->TxRQ#eyyRG&^ZT-4fy)2t%HNkw;&7!qJ8^nL0 z(o+v=y$yKqAP7D6U$77lo`Q&oh)5A>OKp6!yVIV6|U{YcC6hllXjY z1#T|vJ0 z2FQ=0O0sgLiu}B>m;6%qk<~lZWIbI&HXhWH%}20CHSz%kIr@;JA34q;$9d!!K#oD= z7($L=nw+FmEuv>eed9%>8 zTUzCG)_;rD{~%a@QLz5JVEt!;^``~vcMH~U7Oa0zu>R(T*zeDxVEuW)`cs1SZwc1# z7OaoIsdsEr*^>eQ3H)U_C45rOB#=vB`wXHKw-Fhxav4FZFGGyO4>JBypB&dG%y>Gb#C#h=s4UUF$mR_$`PxxbRmlywQc9wHFR({C*eC ziswh%T}QT#^ysU`6<_ZJQ5^sK+OnVvuiHY=31=QAarSsO4f`Hro~cio5RPi524O4= zgbh8Rg((`os~agj;pW+)Pmkqrs8GS>D_oy-X{_7Yu|qNb%~YHqZkv|8@tqh)WB7cw zeh$snjo0tOCluqy&yE&D?nR?4+<=ZCM863NHn(M)?cS0DQhpl8((UhstzG(-0)(7^ ryffec=FE14vuQ=zeJ;hYZpriority < task_head->priority) { + new_task->next = task_head; + new_task->prev = NULL; + if (task_head) { + task_head->prev = new_task; + } + task_head = new_task; + } else { + // Find the correct position in the list + task_t *current = task_head; + while (current->next && current->next->priority <= new_task->priority) { + current = current->next; + } + + // Insert the new task + new_task->next = current->next; + new_task->prev = current; + if (current->next) { + current->next->prev = new_task; + } + current->next = new_task; + } + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, uint64_t priority, char data) { + // uart_send_string("in create_task"); + task_t* task = simple_malloc(sizeof(task_t)); + if(!task) { + return; + } + + task->callback = callback; + task->priority = priority; + task->parameter = data; + + enqueue_task(task); +} + +void execute_tasks() { + // uart_send_string("in execute_tasks \n"); + while (task_head) { + // mmio_write(AUX_MU_IO, 0); + // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x02); + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + task_head->callback(task_head->parameter); + uart_send_string("out callback\n"); + task_head = task_head->next; + if (task_head) { + task_head->prev = NULL; + } + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + // simple_free(task); + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + // uart_send_string("out exe \n"); +} + diff --git a/lab3_asy/shell/tasklist.o b/lab3_asy/shell/tasklist.o new file mode 100644 index 0000000000000000000000000000000000000000..9d596bfe34095ce4dfdb85edbf45b65f9e5f9d83 GIT binary patch literal 2472 zcmbVNO>7fa5T5nhP<~7ZBnZ?Xyr8H8QC4=81L4A&P(q~&5Hu3K)LA>*I>JBTT}y@_ z$f@Td+#{TEP8AA*3su!};J^U^;Zz`p-l!^7DF>?xW@bI(tX}L(U$i^(zWKg+Z{Lhx zZhZ08$(Uh)3kG)eE|5F(Y`%I_lwp#biYtWcC*LWst3Hz_r+Lgfg-)L9o z9yL}K+*~JsbugBnK!ct4LcNcNXamM$>(ZaD;%W7zW)*?RO zH=u^Tb1{M6O6Nkj^PzR0wC(kO3)e#pl&gW2a|?y6o4dFfU~*#OsC8f}TP+1uE0wax z?BwB8HJqldkB-{Ov4aeg7{@@{fN}L4n6^Oyr+ozS1eryKtQ;@czV+1YX6`WFkceqiTd zqy{51;FT^{y{ea?0OTs38?f)s7B3aNOcA@boCB}s<*FR=q3TwGjPI3ZGJa5*EqxE9 z&g4CJhW95YJ&2_fpF*;ay&8Uibvj;Wd>Hxd+O~n88UGaVt?ZL|#=gGpOUCv5e?<7v z>Mb+A6Z1#$zk1}664O4nGlz_ca~k@(@gDe|UU)kV^kE$D-_A&Cxb&0MLHLhFVf$B# zftv*z3)i-J@hV=ywF9pffIZ^|F4$S$2fI?H3DHyb5wLURV$mxhrBn_)d-C+uVL!k- z4SA&Y@|o`{Zqbv~{N`gWZ1dcVXIYPTak!53 zrQD~VF|OZKfwr!s*I~MYDW|TlF;UhNy*^K2fT*KFU@Ln4Mi#y7!$Cgz(jP2`ADAHj zBLo+n*e_Wxak2M=AOKq({uXhH}r(}u>~=@KXm;j#Pr%B)Va*E;biT_={f-20bTXn(D@Ft?dbZC{*DLd literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/timer.c b/lab3_asy/shell/timer.c new file mode 100644 index 000000000..0839a1fdf --- /dev/null +++ b/lab3_asy/shell/timer.c @@ -0,0 +1,115 @@ +#include "header/timer.h" +#include "header/allocator.h" +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +timer_t *timer_head = NULL; + +void add_timer(timer_t *new_timer) { + + timer_t *current = timer_head; + + // Disable interrupts to protect the critical section + asm volatile("msr DAIFSet, 0xf"); + // Special case: the list is empty or the new timer is the earliest + if (!timer_head || new_timer->expiry < timer_head->expiry) { + new_timer->next = timer_head; + new_timer->prev = NULL; + if (timer_head) { + timer_head->prev = new_timer; + } + timer_head = new_timer; + + // Reprogram the hardware timer + asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); + return; + } + + // Find the correct position in the list + while (current->next && current->next->expiry < new_timer->expiry) { + current = current->next; + } + + // Insert the new timer + new_timer->next = current->next; + new_timer->prev = current; + if (current->next) { + current->next->prev = new_timer; + } + current->next = new_timer; + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + + +void create_timer(timer_callback callback, void* data, uint64_t after) { + //Allocate memory for the timer + timer_t* timer = simple_malloc(sizeof(timer_t)); + if(!timer) { + return; + } + + //Set the callback and data + timer->callback = callback; + timer->data = data; + + //Calculate the expiry time + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); + timer->expiry = current_time + after * cntfrq; + //Add the time to the list + add_timer(timer); +} + + +void print_message(void *data) { + char *message = data; + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); + uint64_t seconds = current_time / cntfrq; + + uart_send_string("Timeout message: "); + uart_send_string(message); + uart_send_string(" occurs at "); + uart_hex(seconds); + uart_send_string("\n"); +} + +void repeat_print(void *data) +{ + char *message = data; + for(int i=0; i<100000; i++) + { + // int a = 1; + uart_send_string(message); + uart_send_string("\r\n"); + uart_send_string("================================\n"); + } +} + +void setTimeout(char *message,uint64_t seconds) { + + char *message_copy = utils_strdup(message); + + if(!message_copy){ + return; + } + + if (!timer_head) { + //enable core_timer_interrupt + unsigned int value = 2; + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt + *address = value; + } + + // create_timer(print_message,message_copy,seconds); + create_timer(repeat_print, message_copy, seconds); +} + diff --git a/lab3_asy/shell/timer.o b/lab3_asy/shell/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..1a7b22f28520b7de70a002723fbc7d4a22578123 GIT binary patch literal 3480 zcmbVOL2MgE6#eUUf}1A6#R*gdHJd6zL26cU8i}fa(y(o`I1iBJ!f%At^^st=L*fA){FtZjk# z(d_^8_Wd_Ae`Yp5dvxSgpQ3;?1-^!zo*=o^1wlsp}i+)61B?w4t`MZxh~Xg!jA3<%!Ml!Q$4b zq2l)J4_DXJ=q*2LEI_36+i`XMWAs;4SXG0O(ot+@q2c}&fQcYL+kVma-QT6a#9dWc z?(#=UM!9^=KL^EmKa|RtFZBFS)Bs9utTO;bTvKTt+wkul>l)0DY3OB6Cu-1`kIUs} z-0OXa<7}$F<*g8uws4)$Fn@#A7ExfeeN-v#-*{ ztZvf$g?^-@VPCE#hHFs~kE4z{q7=JuE-JQ#MpdlIS&tY;tcS*=IzwRo#vs-a;Obv^ zp1%15Ylr&K(nL>ySN_GA1{2dMGo7=wlxbPU8S}6vvH`SoJf6#1nqfN#@{bJyqhzQqK@WJC1P$ZM|ax~f0k>#Q=!() z2T<{^mZ_*z%T#Enf_Dj|8gCYO^|%hdp8gYc^aFt3pej=#P=yhoLSq&FBqC3_>JVeb zbLfK{yIn7Kh#zCH!2U(XA8=os2aM^=)Y8F=B6LQ%6!IL!>hPzTzruWRE)cWp@D~u@ z9+ z$|TKb%19>DaS*vtzORnPl$i(1wD~SW&Yn(Mq?yQNKq$j}waLA;zCYPiIwHl5tswK7Ns5T-HJ2HsjuP&DFu@J^HV){wE%NiGNy0 zr{Kava`Nau_vp*>f7zoi@vj)CI=J_7jd5BR{{E=gb;hYa?tS@*aqqtT%DA`wcU?Ly z6?K4nj8mQ6c);h7y!$23Z3FU|B8akn5|8m1r`bzfepd<}e3a+0>cLkS2i^K0WgC;| z?X2UcWRx|NhHjgA8}x)>8=y~G7Urj%cJLwfk-Zp7%mdh=-*@7^I)IgsZ>XXoLq6@9a7 TXD1/RXD1 + // p.102 I find These two in GPIO 14/15 Fun5 + // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 + // That's why I need GPFSEL1 + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 + r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 + *GPFSEL1 = r; // from here activate Trasmitter&Receiver + + //Since We've set alt5, we want to disable basic input/output + //To achieve this, we need diable pull-up and pull-dwon + *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down + //Wait 150 cycles + //this provides the required set-up time for the control signal + r=150; while(r--) { asm volatile("nop"); } + // GPIO control 54 pins + // GPPUDCLK0 controls 0-31 pins + // GPPUDCLK1 controls 32-53 pins + // set 14,15 bits = 1 which means we will modify these two bits + // trigger: set pins to 1 and wait for one clock + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + + + r=1000; while(r--) { asm volatile("nop"); } + + /* initialize UART */ + *AUX_ENABLE |=1; + //P.9: If set the mini UART is enabled. The UART will + //immediately start receiving data, especially if the + //UART1_RX line is low. + //If clear the mini UART is disabled. That also disables + //any mini UART register access + *AUX_MU_CNTL = 0; + //P.17 If this bit is set the mini UART receiver is enabled. + //If this bit is clear the mini UART receiver is disabled + //Prevent data exchange in initialization process + *AUX_MU_IER = 0; + //Set AUX_MU_IER_REG to 0. + //Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; + //P.14: 00 : the UART works in 7-bit mode + //11(3) : the UART works in 8-bit mode + //Cause 8 bits can use in ASCII, Unicode, Char + *AUX_MU_MCR = 0; + //Don’t need auto flow control. + //AUX_MU_MCR is for basic serial communication. Don't be too smart + *AUX_MU_BAUD = 270; + //set BAUD rate to 115200(transmit speed) + //so we need set AUX_MU_BAUD to 270 to meet the goal + *AUX_MU_IIR = 0xc6; + // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 + // Writing with bit 1 set will clear the receive FIFO + // Writing with bit 2 set will clear the transmit FIFO + // Both bits always read as 1 as the FIFOs are always enabled + /* map UART1 to GPIO pins */ + *AUX_MU_CNTL = 3; // enable Transmitter,Receiver + +} + + +/** + * Send a character + */ +void uart_send_char(unsigned int c) { + /* wait until we can send */ + // P.15 AUX_MU_LSR register shows the data(line) status + // AUX_MU_LSR bit 5 => 0x20 = 00100000 + // bit 5 is set if the transmit FIFO can accept at least one byte. + // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop + // else FIFO can not accept at lease one byte then still wait + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the + //UART FIFOs. + //communicate with(send to) the minicom and print to the screen + *AUX_MU_IO=c; +} + +/** + * Display a string + */ +void uart_send_string(char* s) { + while(*s) { + /* convert newline to carriage return + newline */ + if(*s=='\n') + uart_send_char('\r'); + uart_send_char(*s++); + } +} + +/** + * Receive a character + */ +char uart_get_char() { + char r; + /* wait until something is in the buffer */ + //bit 0 is set if the receive FIFO holds at least 1 symbol. + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + /* convert carriage return to newline */ + return r=='\r'?'\n':r; +} + + +/** + * Display a binary value in hexadecimal + */ +void uart_hex(unsigned long long d) { + unsigned long long n; + int c; + uart_send_string("0x"); + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x57:0x30; + uart_send_char(n); + } +} + +void uart_enable_interrupt() { + + // Enable RX and TX interrupt for mini UART + uint32_t ier = mmio_read(AUX_MU_IER); + ier |= RX_INTERRUPT_BIT; + //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); + mmio_write(AUX_MU_IER, ier); + + // Enable the mini UART interrupt in the second-level interrupt controller + // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; + uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); + enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 + mmio_write(ENABLE_IRQS_1, enable_irqs1); +} + +void uart_disable_interrupt() { + // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; + uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); + disable_irqs1 |= AUXINIT_BIT_POSTION; + mmio_write(DISABLE_IRQS_1,disable_irqs1); +} + +int uart_async_read(char *buffer) { + if (uart_read_head == uart_read_index) { + // No characters available + return 0; + } else { + buffer[0] = uart_read_buffer[uart_read_head++]; + if (uart_read_head >= UART_BUFFER_SIZE) { + uart_read_head = 0; + } + return 1; + } +} +void uart_async_write(const char *buffer, int length) { + // uart_write_head = 1; + // uart_read_index = 1; + for (int i = 0; i < length; i++) + { + uart_send_string("qq\n"); + uart_write_buffer[uart_write_index++] = buffer[i]; + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + } + // Trigger TX interrupt + /// uart_send_string("Triiger TX interrupt\n"); + uart_hex(uart_write_index); + uart_hex(uart_write_head); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); + /// uart_send_string("flag1\n"); + uart_hex(uart_write_index); + uart_hex(uart_write_head); +} + +void uart_async_send(const char *str) { + uart_send_string("in uart asy send ===========================\n"); + int length = utils_strlen(str); + uart_async_write(str, length); +} + + diff --git a/lab3_asy/shell/uart.o b/lab3_asy/shell/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..f6088c1ce3ee39a9a459387b666066fc2b654f3d GIT binary patch literal 4712 zcmbtXZ){Ul6hE)8j55Y7V+11V-ey5CSlKeoG*R9_MGPu5Gf_kAy0y54QCQo>>C|;> zL^6%Bx)4JI`JfR=O#EOX<%14EGmRfiMPp*nfkrX#fj@r1IP34cp1WPHn<09V*L&~p zp7T5BopauOul@IKxX))B`EPC}%J<`{aqMr%Pu)k0#TIJ;?CAA~1v|E>n`WP$%X<5( zWly&sq~U^9FB&L3*)iH*@%si;~KT2-?HzW;H!fk&-osY7H_@Xf?xLUh@M66 z9hQ$8S=Wy})@MI&TiM9!<<#w3)M8h=P0XS548opmPyJQAP5DzkIG#(z;-Ud?vM;uC z;D59@`*wnlW^i--1dOhus+vaXrr^M}%rnvV@w=$$E5F!uXu_r(;>;l@BOD*w4%*qs zujSdotg@^ZEAt!;9ot)5;l8>$L>GR}?%F#<){ADm?Lpe)M_m0usvr2P*fP;~^dS4& z2~KOx9*@f!f9ImhF`))7bU9`sy8$tHIUQKLr@%TUu6%La$bar9#2$jJ>v!{S5^c>Q zhie?lW&Jdtxg6AT%~-stjp&X#=tcj$ru#vn7OpwRMA%ok;2Z$&elSQaoReBVZ9-4x z0`N84qFgz~6+|zdb%VJFu;y6C?easohmq5Pd-9(__ov|f`DXY&74YYepN}@hKd)=* z7oWvoAivrwI~zkzmObmfHXD57l5?&f_XOwsH_18Illz1Hj3V!Zyw@P_bpyNh`p7q# zch1o$`i=9x6ZfU^j>k90{J(&2MQ}IgdPMibbyYr`rBnQ$psrWLKZtmJ@WIcS@)JWW z>jOjiTB>P?A(nsh$@leN{06l9nmzyD?`vGk+tuEe>Q}Bi4!xX(+K%8Eo9O$zN4o zdvCCoRMdFbV!_X8dMjlf(lA%%n>DOO=8ZC5hp|KEJ9uoa4DR#ow;uoDWF;>-hTS}Y zC?AZy;UPpS7RKHeY@>`0#^W*%`7jY~-(WejH_rv+;5vhgrHOxd_P1p;s4}kZJTg{7*gU1 zl$y@iv#Au70fVQ^gou+@rR72O3)hVC^J1ZT<|e_b<(5_7a9vn`hv2Gr?i2hi!FLGX z!-|J%4pDuRz?^wp!By`(D|oBms()S*{C&Z_9s;&c@Dq|!uWx|8hbxH7lp_GX!|ACdquK*b`F%wL02MK+Vu3I9h26jb!RfJVqs!La^>38Z|m8zB_TKI z83=$}9+ZAsfKl)24+LLm;D-fYf>HaFCDl*Nqf*a>i%UN-kB)Z0fFGCv z|59)>p05Nq<2j+}a~@P5jcfWkeok;R4&S?5Neok=H z@9!GE$YU=31mqQRE&6bwhV#3cWfpKLwYOg7{Z8TMWqpru&Lny>6pqI- zF$%Y((-cl^=LM_RhnpzezJ1%aL=q~=?U_V)-9wMulFr21w?dDt6CKelsn|AtEB!xl zV2+YpaaJ*-%Ri6`8wU#qwP6lKrT2K)pYg2`*}4O|-%A zt2UTJmz7vBr)j@Y?5mYSF*24^51ct0WM2)+{%!@xsO(i7E^wZ!J{C24S^RT+x+ps} zuE(aD>v~77^8TL?duh{2iczu0f0Zjl#jn7}Fqy7?U(G9NsOORE$F|B|)sN{--)uQ1 rhnIRk@OL3on)Y*mnY9B%uk!|k-)FiQOMIhDZ$Bzu-yOO!=BEAMIq%;P literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/Makefile b/lab3_asy/shell/userprogram/Makefile new file mode 100644 index 000000000..19cefe3cf --- /dev/null +++ b/lab3_asy/shell/userprogram/Makefile @@ -0,0 +1,11 @@ +all: one.img + +one.o: one.S + aarch64-linux-gnu-gcc -c one.S -o one.o + +one.img: one.o + aarch64-linux-gnu-ld one.o -T linker.ld -o one.elf + aarch64-linux-gnu-objcopy -O binary one.elf one.img + +clean: + rm one.o one.elf > /dev/null 2>/dev/null || true diff --git a/lab3_asy/shell/userprogram/linker.ld b/lab3_asy/shell/userprogram/linker.ld new file mode 100644 index 000000000..ab70a30ea --- /dev/null +++ b/lab3_asy/shell/userprogram/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/userprogram/one.S b/lab3_asy/shell/userprogram/one.S new file mode 100644 index 000000000..4acf6f4dd --- /dev/null +++ b/lab3_asy/shell/userprogram/one.S @@ -0,0 +1,7 @@ +.section ".text" +.global _start +_start: + svc 0x1337 +1: + nop + b 1b diff --git a/lab3_asy/shell/userprogram/one.elf b/lab3_asy/shell/userprogram/one.elf new file mode 100644 index 0000000000000000000000000000000000000000..b13e36ed9627aa5a41acd8767b43259aeddc6b32 GIT binary patch literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/one.img b/lab3_asy/shell/userprogram/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/one.o b/lab3_asy/shell/userprogram/one.o new file mode 100644 index 0000000000000000000000000000000000000000..c00c28e5b03a97b1c7da93cb70b11273c5c3833a GIT binary patch literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/utils.c b/lab3_asy/shell/utils.c new file mode 100644 index 000000000..8242d820c --- /dev/null +++ b/lab3_asy/shell/utils.c @@ -0,0 +1,63 @@ +#include "header/utils.h" +#include "header/allocator.h" + +int utils_string_compare(const char* str1,const char* str2) { + for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ + if(*str1 != *str2) return 0; + else if(*str1 == '\0' && *str2 =='\0') return 1; + } + return 1; +} + +unsigned long utils_atoi(const char *s, int char_size) { + unsigned long num = 0; + for (int i = 0; i < char_size; i++) { + num = num * 16; + if (*s >= '0' && *s <= '9') { + num += (*s - '0'); + } else if (*s >= 'A' && *s <= 'F') { + num += (*s - 'A' + 10); + } else if (*s >= 'a' && *s <= 'f') { + num += (*s - 'a' + 10); + } + s++; + } + return num; +} + +void utils_align(void *size, unsigned int s) { + unsigned long* x = (unsigned long*) size; + unsigned long mask = s-1; + *x = ((*x) + mask) & (~mask); +} + +uint32_t utils_align_up(uint32_t size, int alignment) { + return (size + alignment - 1) & ~(alignment-1); +} + +//with null-terminator -> "hello" return 6 +size_t utils_strlen(const char *s) { + size_t i = 0; + while (s[i]) i++; + return i+1; +} + + +char *utils_strcpy(char* dst, const char *src) { + char *save = dst; + while((*dst++ = *src++)); + return save; +} + + +char *utils_strdup(const char *src) { + size_t len = utils_strlen(src); + char *dst = simple_malloc(len); + if (dst == NULL) { // Check if the memory has been successfully allocated + return NULL; + } + utils_strcpy(dst, src); // Copy the string + return dst; +} + + diff --git a/lab3_asy/shell/utils.o b/lab3_asy/shell/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..74670709cc74f02475f1c6c05ac4403bb067de43 GIT binary patch literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Thu, 25 Apr 2024 08:51:08 +0800 Subject: [PATCH 05/24] Delete lab3_asy directory --- lab3_asy/readme.md | 1 - lab3_asy/shell/Makefile | 22 -- lab3_asy/shell/Untitled-1 | 0 lab3_asy/shell/allocator.c | 20 -- lab3_asy/shell/allocator.o | Bin 1744 -> 0 bytes lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb | Bin 32753 -> 0 bytes lab3_asy/shell/cpio.c | 96 -------- lab3_asy/shell/cpio.o | Bin 4768 -> 0 bytes lab3_asy/shell/dtb.c | 163 -------------- lab3_asy/shell/dtb.o | Bin 4880 -> 0 bytes lab3_asy/shell/except.c | 280 ------------------------ lab3_asy/shell/except.o | Bin 6352 -> 0 bytes lab3_asy/shell/header/allocator.h | 7 - lab3_asy/shell/header/cpio.h | 39 ---- lab3_asy/shell/header/dtb.h | 26 --- lab3_asy/shell/header/gpio.h | 38 ---- lab3_asy/shell/header/irq.h | 22 -- lab3_asy/shell/header/mailbox.h | 38 ---- lab3_asy/shell/header/reboot.h | 8 - lab3_asy/shell/header/shell.h | 2 - lab3_asy/shell/header/tasklist.h | 22 -- lab3_asy/shell/header/timer.h | 20 -- lab3_asy/shell/header/uart.h | 39 ---- lab3_asy/shell/header/utils.h | 25 --- lab3_asy/shell/initramfs.cpio | Bin 1024 -> 0 bytes lab3_asy/shell/kernel8.elf | Bin 83976 -> 0 bytes lab3_asy/shell/kernel8.img | Bin 13408 -> 0 bytes lab3_asy/shell/linker.ld | 44 ---- lab3_asy/shell/mailbox.c | 51 ----- lab3_asy/shell/mailbox.o | Bin 2064 -> 0 bytes lab3_asy/shell/main.c | 80 ------- lab3_asy/shell/main.o | Bin 3728 -> 0 bytes lab3_asy/shell/reboot.c | 16 -- lab3_asy/shell/reboot.o | Bin 1496 -> 0 bytes lab3_asy/shell/rootfs/file1.txt | 1 - lab3_asy/shell/rootfs/one.img | Bin 16 -> 0 bytes lab3_asy/shell/rootfs/pack.sh | 2 - lab3_asy/shell/rootfs/thisisfile2.txt | 1 - lab3_asy/shell/shell.c | 151 ------------- lab3_asy/shell/shell.o | Bin 7040 -> 0 bytes lab3_asy/shell/start.S | 163 -------------- lab3_asy/shell/start.o | Bin 7616 -> 0 bytes lab3_asy/shell/tasklist.c | 73 ------ lab3_asy/shell/tasklist.o | Bin 2472 -> 0 bytes lab3_asy/shell/timer.c | 115 ---------- lab3_asy/shell/timer.o | Bin 3480 -> 0 bytes lab3_asy/shell/uart.c | 207 ------------------ lab3_asy/shell/uart.o | Bin 4712 -> 0 bytes lab3_asy/shell/userprogram/Makefile | 11 - lab3_asy/shell/userprogram/linker.ld | 19 -- lab3_asy/shell/userprogram/one.S | 7 - lab3_asy/shell/userprogram/one.elf | Bin 66352 -> 0 bytes lab3_asy/shell/userprogram/one.img | Bin 16 -> 0 bytes lab3_asy/shell/userprogram/one.o | Bin 728 -> 0 bytes lab3_asy/shell/utils.c | 63 ------ lab3_asy/shell/utils.o | Bin 2320 -> 0 bytes 56 files changed, 1872 deletions(-) delete mode 100644 lab3_asy/readme.md delete mode 100644 lab3_asy/shell/Makefile delete mode 100644 lab3_asy/shell/Untitled-1 delete mode 100644 lab3_asy/shell/allocator.c delete mode 100644 lab3_asy/shell/allocator.o delete mode 100644 lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb delete mode 100644 lab3_asy/shell/cpio.c delete mode 100644 lab3_asy/shell/cpio.o delete mode 100644 lab3_asy/shell/dtb.c delete mode 100644 lab3_asy/shell/dtb.o delete mode 100644 lab3_asy/shell/except.c delete mode 100644 lab3_asy/shell/except.o delete mode 100644 lab3_asy/shell/header/allocator.h delete mode 100644 lab3_asy/shell/header/cpio.h delete mode 100644 lab3_asy/shell/header/dtb.h delete mode 100644 lab3_asy/shell/header/gpio.h delete mode 100644 lab3_asy/shell/header/irq.h delete mode 100644 lab3_asy/shell/header/mailbox.h delete mode 100644 lab3_asy/shell/header/reboot.h delete mode 100644 lab3_asy/shell/header/shell.h delete mode 100644 lab3_asy/shell/header/tasklist.h delete mode 100644 lab3_asy/shell/header/timer.h delete mode 100644 lab3_asy/shell/header/uart.h delete mode 100644 lab3_asy/shell/header/utils.h delete mode 100644 lab3_asy/shell/initramfs.cpio delete mode 100644 lab3_asy/shell/kernel8.elf delete mode 100644 lab3_asy/shell/kernel8.img delete mode 100644 lab3_asy/shell/linker.ld delete mode 100644 lab3_asy/shell/mailbox.c delete mode 100644 lab3_asy/shell/mailbox.o delete mode 100644 lab3_asy/shell/main.c delete mode 100644 lab3_asy/shell/main.o delete mode 100644 lab3_asy/shell/reboot.c delete mode 100644 lab3_asy/shell/reboot.o delete mode 100644 lab3_asy/shell/rootfs/file1.txt delete mode 100644 lab3_asy/shell/rootfs/one.img delete mode 100644 lab3_asy/shell/rootfs/pack.sh delete mode 100644 lab3_asy/shell/rootfs/thisisfile2.txt delete mode 100644 lab3_asy/shell/shell.c delete mode 100644 lab3_asy/shell/shell.o delete mode 100644 lab3_asy/shell/start.S delete mode 100644 lab3_asy/shell/start.o delete mode 100644 lab3_asy/shell/tasklist.c delete mode 100644 lab3_asy/shell/tasklist.o delete mode 100644 lab3_asy/shell/timer.c delete mode 100644 lab3_asy/shell/timer.o delete mode 100644 lab3_asy/shell/uart.c delete mode 100644 lab3_asy/shell/uart.o delete mode 100644 lab3_asy/shell/userprogram/Makefile delete mode 100644 lab3_asy/shell/userprogram/linker.ld delete mode 100644 lab3_asy/shell/userprogram/one.S delete mode 100644 lab3_asy/shell/userprogram/one.elf delete mode 100644 lab3_asy/shell/userprogram/one.img delete mode 100644 lab3_asy/shell/userprogram/one.o delete mode 100644 lab3_asy/shell/utils.c delete mode 100644 lab3_asy/shell/utils.o diff --git a/lab3_asy/readme.md b/lab3_asy/readme.md deleted file mode 100644 index 8b1378917..000000000 --- a/lab3_asy/readme.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lab3_asy/shell/Makefile b/lab3_asy/shell/Makefile deleted file mode 100644 index beea4a7b2..000000000 --- a/lab3_asy/shell/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -SRCS = $(wildcard *.c) -OBJS = $(SRCS:.c=.o) -CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include -CFLAGS += -I /usr/aarch64-linux-gnu/include -all: kernel8.img - -start.o: start.S - aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o - -%.o: %.c - aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ - -kernel8.img: start.o $(OBJS) - aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf - aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img - -clean: - rm kernel8.elf *.o >/dev/null 2>/dev/null || true - -run: - qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab3_asy/shell/Untitled-1 b/lab3_asy/shell/Untitled-1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab3_asy/shell/allocator.c b/lab3_asy/shell/allocator.c deleted file mode 100644 index 4ca648ee9..000000000 --- a/lab3_asy/shell/allocator.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "header/allocator.h" -#include "header/utils.h" - -#define SIMPLE_MALLOC_BUFFER_SIZE 8192 -static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; -static unsigned long simple_malloc_offset = 0; - -void* simple_malloc(unsigned long size){ - //align to 8 bytes - utils_align(&size,8); - - if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { - //Not enough space left - return (void*) 0; - } - void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; - simple_malloc_offset += size; - - return allocated; -} diff --git a/lab3_asy/shell/allocator.o b/lab3_asy/shell/allocator.o deleted file mode 100644 index 42047e4bff9d5a846fec68d6bb675751e99ff9b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1744 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 OPqI~*e!TdI|Nj8Si!WyY diff --git a/lab3_asy/shell/cpio.c b/lab3_asy/shell/cpio.c deleted file mode 100644 index a38879c9c..000000000 --- a/lab3_asy/shell/cpio.c +++ /dev/null @@ -1,96 +0,0 @@ -#include "header/cpio.h" -#include "header/uart.h" -#include "header/utils.h" -#include "header/allocator.h" - -int file_num = 0; -struct file *f = NULL; - -void allocate_file_array() { - if (f == NULL) { - f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); - if (f == NULL) { - uart_send_string("Memory allocation error\n"); - // Handle memory allocation error - } - } -} - -void traverse_file() -{ - allocate_file_array(); - char* addr = (char *)cpio_addr; - - - while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ - - struct cpio_header *header = (struct cpio_header *)addr; - unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); - unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; - unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); - - utils_align(&headerPathname_size, 4); - utils_align(&file_size, 4); - - f[file_num].file_header = header; - f[file_num].filename_size = filename_size; - f[file_num].headerPathname_size = headerPathname_size; - f[file_num].file_size = file_size; - f[file_num].file_content_head = (char*) header + headerPathname_size; - - addr += (headerPathname_size + file_size); - file_num += 1; - } -} - -int findfile(char* filename) { - for(int n=0;n<=file_num;n++) { - if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ - return n; - } - } - return -1; -} - -void cpio_ls() -{ - for(int n=0;n<=file_num;n++) { - uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); - uart_send_string("\n"); - } -} - - -void cpio_cat(char *filename) -{ - int targetfile_num = findfile(filename); - - if(targetfile_num != -1) { - for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) - { - uart_send_char(f[targetfile_num].file_content_head[i]); - } - uart_send_string("\n"); - - } else { - uart_send_string("Can not Find the file\n"); - } - -} - -void cpio_exec_program(char* filename) { - int targetfile_num = findfile(filename); - - char* target = (char*) 0x20000; - for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J diff --git a/lab3_asy/shell/dtb.c b/lab3_asy/shell/dtb.c deleted file mode 100644 index 523dac1d4..000000000 --- a/lab3_asy/shell/dtb.c +++ /dev/null @@ -1,163 +0,0 @@ -#include "header/dtb.h" -#include "header/uart.h" -#include "header/utils.h" -#define UNUSED(x) (void)(x) - - -char* cpio_addr; -int space = 0; -//1. Define the callback function type(fdt_callback) -//2. Create a structure for holding the FDT header information(fdt_header) -//3. Implement helper functions to extract the FDT header information - -uint32_t fdt_u32_le2be (const void *addr) { - const uint8_t *bytes = (const uint8_t *) addr; - uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; - return ret; -} - -void send_space(int n) { - while(n--) uart_send_string(" "); -} - -int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { - uintptr_t end_ptr = cur_ptr + totalsize; - - while(cur_ptr < end_ptr) { - - uint32_t token = fdt_u32_le2be((char *)cur_ptr); - cur_ptr += 4; - - switch(token){ - case FDT_BEGIN_NODE: - /* - Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. - Node name (variable length, NULL-terminated): Specifies the name of the node being opened. - */ - //uart_send_string("In FDT_BEGIN_NODE\n"); - cb(token, (char*)cur_ptr,NULL,0); - cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); - break; - case FDT_END_NODE: - /* - Token type (4 bytes): Indicates that it's an FDT_END_NODE token. - */ - //uart_send_string("In FDT_END_NODE;\n"); - cb(token,NULL,NULL,0); - break; - - case FDT_PROP: { - - /* - Token type (4 bytes): Indicates that it's an FDT_PROP token. - Data length (4 bytes): Specifies the length of the property data (len). - Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). - Property data (variable length): Contains the property data itself, the size of which is determined by len. - */ - //uart_send_string("In FDT_PROP \n"); - uint32_t len = fdt_u32_le2be((char*)cur_ptr); - cur_ptr += 4; - uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); - cur_ptr += 4; - //second parameter name here is property name not node name - cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); - cur_ptr += utils_align_up(len,4); - break; - - } - case FDT_NOP: - //uart_send_string("In FDT_NOP\n"); - cb(token,NULL,NULL,0); - break; - - case FDT_END: - //uart_send_string("In FDT_END\n"); - cb(token,NULL,NULL,0); - return 0; - default:; - return -1; - } - } - return -1; - -} -//4. Implement the fdt_traverse function: - -int fdt_traverse(fdt_callback cb,void * _dtb){ - uintptr_t dtb_ptr = (uintptr_t) _dtb; - uart_send_string("\ndtb loading at: "); - uart_hex(dtb_ptr); - // uart_send_char('\n'); - uart_send_string("\r\n"); - struct fdt_header* header = (struct fdt_header*) dtb_ptr; - - uint32_t magic = fdt_u32_le2be(&(header->magic)); - - if (magic != 0xd00dfeed){ - - uart_send_string("The header magic is wrong\n"); - return -1; - } - - /* - +-----------------+ - | fdt_header | <- dtb_ptr - +-----------------+ - | reserved memory | - +-----------------+ - | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) - +-----------------+ - | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) - +-----------------+ - */ - - uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); - uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); - uint32_t totalsize = fdt_u32_le2be(&header->totalsize); - parse_struct(cb, struct_ptr,strings_ptr,totalsize); - return 1; - -} - -//5. Implement the initramfs_callback function: -void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ - UNUSED(size); - if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ - cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); - uart_send_string("cpio address is at: "); - uart_hex((uintptr_t)fdt_u32_le2be(data)); - // uart_send_char('\n'); - uart_send_string("\r\n"); - } -} - -//6. Implement print_dtb callback function: - -void print_dtb(int token, const char* name, const void* data, uint32_t size) { - UNUSED(data); - UNUSED(size); - - switch(token){ - case FDT_BEGIN_NODE: - uart_send_string("\n"); - send_space(space); - uart_send_string((char*)name); - uart_send_string("{\n "); - space++; - break; - case FDT_END_NODE: - uart_send_string("\n"); - space--; - if(space >0) send_space(space); - uart_send_string("}\n"); - break; - case FDT_NOP: - break; - case FDT_PROP: - send_space(space); - uart_send_string((char*)name); - break; - case FDT_END: - break; - } -} diff --git a/lab3_asy/shell/dtb.o b/lab3_asy/shell/dtb.o deleted file mode 100644 index 52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h diff --git a/lab3_asy/shell/except.c b/lab3_asy/shell/except.c deleted file mode 100644 index 047cee92b..000000000 --- a/lab3_asy/shell/except.c +++ /dev/null @@ -1,280 +0,0 @@ - -#include "header/uart.h" -#include "header/irq.h" -#include "header/shell.h" -#include "header/timer.h" -#include "header/tasklist.h" -#include "header/utils.h" - -#define CNTPSIRQ_BIT_POSITION 0x02 -#define AUXINIT_BIT_POSTION 1<<29 - - -void except_handler_c() { - uart_send_string("In Exception handle\n"); - - //read spsr_el1 - unsigned long long spsr_el1 = 0; - asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); - uart_send_string("spsr_el1: "); - uart_hex(spsr_el1); - uart_send_string("\n"); - - //read elr_el1 - unsigned long long elr_el1 = 0; - asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); - uart_send_string("elr_el1: "); - uart_hex(elr_el1); - uart_send_string("\n"); - - //esr_el1 - unsigned long long esr_el1 = 0; - asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); - uart_hex(esr_el1); - uart_send_string("\n"); - - //ec - unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) - uart_send_string("ec: "); - uart_hex(ec); - uart_send_string("\n"); - - - while(1){ - - } - -} - -void timer_irq_handler(char dontcare) { - uart_send_string("in timer_irq_handler\n"); - //enable core_0_timer - unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; - *address = 2; - - asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); - // Disable interrupts to protect critical section - // asm volatile("msr DAIFSet, 0xf"); - // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x02); - - uint64_t current_time; - asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); - - while(timer_head && timer_head->expiry <= current_time) { - timer_t *timer = timer_head; - - //Execute the callback - timer->callback(timer->data); - - // Remove timer from the list - timer_head = timer->next; - if (timer_head) { - timer_head->prev = NULL; - } - - //free timer - - // Reprogram the hardware timer if there are still timers left - if(timer_head) { - asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); - asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); - } else { - asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); - } - - - //enable interrupt - asm volatile("msr DAIFClr,0xf"); - } - uart_send_string("out timer_irq_handler\n"); -} - -void uart_transmit_handler(char dontcare) { - uart_send_string("in uart trans handler \n"); - mmio_write(AUX_MU_IO, 1); - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); - uart_send_string("test2\n"); - // special case (Enter) - if (uart_write_buffer[uart_write_index-1] == '\r'){ - uart_write_buffer[uart_write_index++] = '\n'; - uart_write_buffer[uart_write_index] = '\0'; - } - else if (uart_write_buffer[uart_write_index-1] == '\n') - { - uart_write_buffer[uart_write_index] = '\0'; - } - - uart_hex(uart_write_index); - uart_hex(uart_write_head); - uart_send_string("test\n"); - // Send data from the write buffer - while (uart_write_head != uart_write_index) - { - // uart_send_string("in uart trans handler flag1 \n"); - mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - - - if (uart_write_head == uart_write_index) { - uart_send_string("in uart trans handler flag2 \n"); - //uart_send_string("//////////////// \n"); - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); - if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n') - { - // uart_send_string("in uart trans handler flag3 \n"); - uart_read_buffer[uart_read_index-1] = '\0'; - parse_command(uart_read_buffer); - uart_read_index = 0; - uart_write_index = 0; - uart_write_head = 0; - // uart_send_string("in uart trans handler flag4 \n"); - } - } - } - // uart_send_string("out uart trans handler \n"); - // mmio_write(AUX_MU_IO, 0); - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x1); -} - -void uart_receive_handler(char data) { - // uart_send_string("in uart receive handler \n"); - // uart_hex(uart_write_index); - // uart_hex(uart_write_head); - // Read data(8 bytes) and store it in the read buffer - // char data = mmio_read(AUX_MU_IO) & 0xff; - //uart_send_char(data); - //uart_send_string("\r\n"); - if (uart_read_index >= UART_BUFFER_SIZE) { - uart_read_index = 0; - } - uart_read_buffer[uart_read_index++] = data; - if (uart_read_index >= UART_BUFFER_SIZE) { - uart_read_index = 0; - } - - // Enqueue the received data into the write buffer - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - uart_write_buffer[uart_write_index++] = data; - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - - create_task(uart_transmit_handler,2,'a'); // for echo -} - - -void irq_except_handler_c(char dontcare) { - - asm volatile("msr DAIFSet, 0xf"); // Disable interrupts - // unsigned long long DAIFSet = 0; - // asm volatile("mrs %0, DAIFSet":"=r"(DAIFSet)); - // uart_hex(DAIFSet); - uart_send_string("in irq_except_handler_c \n"); - // uart_hex(uart_write_index); - // uart_hex(uart_write_head); - uint32_t irq_pending1 = mmio_read(IRQ_PENDING_1); - uint32_t core0_interrupt_source = mmio_read(CORE0_INTERRUPT_SOURCE); - uint32_t iir = mmio_read(AUX_MU_IIR); - if (core0_interrupt_source & CNTPSIRQ_BIT_POSITION) { - - // uart_send_string("in core0 interrupt \n"); - //djsable core 0 timer - unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; - *address = 0; - - create_task(timer_irq_handler,3,'a'); - // uart_send_string("out core0 interrupt\n"); - } - - // Handle UART interrupt - if (irq_pending1 & AUXINIT_BIT_POSTION) { - // uart_send_string("in irq pending \n"); - // uart_hex(uart_write_index); - // uart_hex(uart_write_head); - if ((iir & 0x06) == 0x04) { - char data = mmio_read(AUX_MU_IO) & 0xff; - uart_send_string("in iir 0x04 aaaa \n"); - // Disable receive interrupt - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); - create_task(uart_receive_handler, 1, data); - } - - if ((iir & 0x06) == 0x02) { - char data = 'a'; - uart_send_string("in iir 0x02 bbb \n"); - - // Disable transmit interrupt - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x02)); - create_task(uart_transmit_handler, 2, data); - } - } - - // asm volatile("msr DAIFClr, 0xf"); // Enable interrupts - // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); - execute_tasks(); - //asm volatile("msr DAIFClr, 0xf"); // Enable interrupts - // uart_send_string("out irq_except_handler_c\n"); - -} - - -/* -void uart_irq_handler(){ - // uart_send_string("in uart_irq_handler\n"); - ///uart_hex(uart_write_index); - ///uart_hex(uart_write_head); - ///uart_send_string("\r\n"); - uint32_t iir = mmio_read(AUX_MU_IIR); - - // Check if it is a receive interrupt - if ((iir & 0x06) == 0x04) { - // Read data(8 bytes) and store it in the read buffer - /// uart_send_string("in uart_irq_handler_receive\n"); - char data = mmio_read(AUX_MU_IO) & 0xff; - uart_read_buffer[uart_read_index++] = data; - if (uart_read_index >= UART_BUFFER_SIZE) { - uart_read_index = 0; - } - - // Enqueue the received data into the write buffer - uart_write_buffer[uart_write_index++] = data; - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - - // Enable tx interrupt - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); - } - - // Check if it is a transmit interrupt - if ((iir & 0x06) == 0x02) { - /// uart_send_string("in uart_irq_handler_transmit\n"); - // Send data from the write buffer - if (uart_write_head != uart_write_index) { - /// uart_send_string("in uart_irq_handler_trans_!=\n"); - mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - } else { - /// uart_send_string("in uart_irq_handler_trans_else\n"); - // Disable tx interrupt when there is no data left to send - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); - - if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n'){ - uart_read_buffer[uart_read_index-1] = '\0'; - uart_read_index = 0; - uart_write_index = 0; - uart_write_head = 0; - parse_command(uart_read_buffer); - // uart_write_index = 0; - } - } - } -} -*/ - diff --git a/lab3_asy/shell/except.o b/lab3_asy/shell/except.o deleted file mode 100644 index 3ac9484bf34c297ab740786f28e43547c60b27d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6352 zcmbVQVN6@s6+ZTJh(l%7daQt6B>vOITNpM?%_lLS07OEo-G2+q~2$V1jK{ zuT;fN&=y7e0m4nPDT$agsZeE7r>0uaP?t?i;zxc&6w+*3JGbITrA1noHcG9PvUA=$ z7f!BiP3nm*_ulV*=R4=#ckg|E89mVTq}SsCWghqgZ1fZgFur4>Z8=Q~?tuze9hsZK z?l_i-RRbnIJ>;3W{k)g3tjC{O^uYA3eURw}EDZp&=0~;5-^_h`xf*@4UMoL|<&XiF z_Tc!PTFBpzwI86m4j>QPth|N%Jy_PhZ!8n{T@PI9skHKSu;X7b4+O*Bju{i$ulJN$ z`HUCx)|YE!b$r?FkVI`YSYIZ%EykFQ~U zCu+>(kNTWBf&bK^x$^q0<5)LfU61+Vdd-qH>2`oMTMuX?F@3lUerWg z!XLoc?chB+<%1yk&tsw34L;cZ>O#0J;)Pj{0kaY0lV9kI`-TPpf?mvj6muot-+Z|i z+=*H_c6H>h(^rhp_4Wm`ZEkJteq5{Vot{j0BldHK z_u&ZTxX{q{HjdTB8rsl5JBs;GJeq?CO9>6ugU(Aw^T%6iPZ0b|p=f9Iun z!}vq!^APg!ndLEuZxQ$Z@fs>J-NeQC;~kJ$#CiftwSoPW&Bu2(qF$KvFjrmg;_6zk z7>~3_m$X>3TIIhw@=n3tL|(SaYFj2h@}YjtsCuKy?Prr-n4mu4tp&Vl2Up|O-EGS` z<8DmqW?tEONa<6J1<%VnGwQ7W6VIjOAGb~~LIs}tEvFW}xz}$2o_~7wL0o&>JF|~r zu{{30OYrfYWLaJ1XeA8gaNmrU!_X9-XWApHBY$zuCEXvSO?L>^6SPL{&iXod_TTuN zW$ZCJlgMerc)X6z`kcU+QQW^L&=>jHyJMVkVo;70gYqK|Y1QNNC9RK)s)tn^SF5h5 z7IL63Zl?MM>_n(9F%*i0({b}aI%*$F^$o^ZhG0k@OC~~gfAixe^#B|YYrFq080@Iaz&Mn-?P#e9 zgrZIi@~82>gxQpCYBj@XYG4CzF(Z)(!B6eq|G2sP*~oA_HEcFF2U-J7k2ViG-R4(X zS^`b2-(VPZw~;uS=cR7&r62UvR@A{G*spO=fO)Dr?zPVQFKj+AS(e@On(wsn%o*>G z-aGKY`^(qgUAh;5E`{$he+dsC@(-Rbzp$lq(x2VD@3peioA#gaoi%>t{k6w?xcr0n z|MvIyZn&-;TPgk+`(EaH7uILFO&cHe%=5krM(3nAOY#&?ackUo&iFnW{~-pTtU9(* zD7V$^Hb||&V;|F|y z7MKD40*n9y$_j9L9+hIg&htkMe?zSA73uU?3H&>VlaBIt_61_W5`4P^{$dII7bS4I zc+{T8=DJN`s~G8v15{2tyC&b~z~$M|QAJNp%}+gOU} zfO`W3qR`k2jcF*j)PSz7P|}X~hLWj7U;G88#O!ddJLX(z1AQrVi@4~EiN2H_>WlZ< zX$eGzj~uZR64?-nDQW_>rK{6t&tu_4(hfxj2L|xcb#)SU)b9JKy&gY`e2kq6Cyzq0 zOAhC3M~9h_#DzgqC#VXKfIJ;)C-2bk8rKbK5qHmy3(#Fbwij`{s@ClZZqbhgiC<(~ z#Z|hO7*}x>eueR!THFOqr-}PlxmG#~zri@=DfdNA;M=)P)lF{e^Yx=YnaW??%N2~P zxC-CJxUOR|PU|D{X%x83r;~BYztT;?`P;=f>ErLDbqg|1`jU^|7LMuse#X_j4zkiQ z#?`zOo)S88KcpGg=QXD3A7=fNn!duF7ZGyw{Lcz~xjyFvF4yxKn!KB zOYmj>rr=AwN$_RoGZI2bR_HXep9Ev~{zL)s(QApT+;lhug(u`2fF`sf7%}U fvqK1K-2WH=Lz}SH1^Vq!%zrokXo-=SFx~%u6P_nV diff --git a/lab3_asy/shell/header/allocator.h b/lab3_asy/shell/header/allocator.h deleted file mode 100644 index 56f46666f..000000000 --- a/lab3_asy/shell/header/allocator.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef ALLOCATOR_H -#define ALLOCATOR_H - - -void* simple_malloc(unsigned long size); - -#endif diff --git a/lab3_asy/shell/header/cpio.h b/lab3_asy/shell/header/cpio.h deleted file mode 100644 index be0e36b9f..000000000 --- a/lab3_asy/shell/header/cpio.h +++ /dev/null @@ -1,39 +0,0 @@ -//#define QEMU_CPIO_ADDR (char *)0x8000000; //qemu -//#define RASP_CPIO_ADDR (char *)0x20000000;//rasperrypi - -#define MAX_FILE_NUM 10 - -extern char* cpio_addr; - -void traverse_file(); -void cpio_ls(); -void cpio_cat(char* filename); -void cpio_exec_program(char* filename); - -struct cpio_header { - // uses 8-byte hexadecimal fields for all numbers - char c_magic[6]; //determine whether this archive is written with little-endian or big-endian integers. - char c_ino[8]; //determine when two entries refer to the same file. - char c_mode[8]; //specifies both the regular permissions and the file type. - char c_uid[8]; // numeric user id - char c_gid[8]; // numeric group id - char c_nlink[8]; // number of links to this file. - char c_mtime[8]; // Modification time of the file - char c_filesize[8]; // size of the file - char c_devmajor[8]; - char c_devminor[8]; - char c_rdevmajor[8]; - char c_rdevminor[8]; - char c_namesize[8]; // number of bytes in the pathname - char c_check[8]; // always set to zero by writers and ignored by readers. -}; - - -struct file { - struct cpio_header* file_header; - unsigned long filename_size; - unsigned long headerPathname_size; - unsigned long file_size; - char* file_content_head; -}; - diff --git a/lab3_asy/shell/header/dtb.h b/lab3_asy/shell/header/dtb.h deleted file mode 100644 index 16af25520..000000000 --- a/lab3_asy/shell/header/dtb.h +++ /dev/null @@ -1,26 +0,0 @@ -#include -// #include -#define FDT_BEGIN_NODE 0x00000001 -#define FDT_END_NODE 0x00000002 -#define FDT_PROP 0x00000003 -#define FDT_NOP 0x00000004 -#define FDT_END 0x00000009 - -typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); - -struct __attribute__((packed)) fdt_header { - uint32_t magic; // contain the value 0xd00dfeed (big-endian). - uint32_t totalsize; // in byte - uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header - uint32_t off_dt_strings; - uint32_t off_mem_rsvmap; - uint32_t version; - uint32_t last_comp_version; - uint32_t boot_cpuid_phys; - uint32_t size_dt_strings; // the length in bytes of the strings block section - uint32_t size_dt_struct; -}; - -int fdt_traverse(fdt_callback cb,void *dtb_ptr); -void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); -void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab3_asy/shell/header/gpio.h b/lab3_asy/shell/header/gpio.h deleted file mode 100644 index 38ca70635..000000000 --- a/lab3_asy/shell/header/gpio.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef GPIO_H -#define GPIO_H - -#include -//Page 90, Physical/bus addr diff -#define MMIO_BASE 0x3F000000 - -#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) -#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) -#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) -#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) -#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) -#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) -#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) -#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) -#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) -#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) -#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) -#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) -#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) -#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) -#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) -#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) -#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) -#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) - - -// Helper function to write data to a memory-mapped I/O address -static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { - *reg = data; -} - -// Helper function to read data from a memory-mapped I/O address -static inline uint32_t mmio_read(volatile uint32_t* reg) { - return *reg; -} - -#endif diff --git a/lab3_asy/shell/header/irq.h b/lab3_asy/shell/header/irq.h deleted file mode 100644 index 9085cb30c..000000000 --- a/lab3_asy/shell/header/irq.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef IRQ_H -#define IRQ_H - -#include "gpio.h" - - -#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) -#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) -#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) -#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) -#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) -#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) -#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) -#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) -#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) -#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) -#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) -#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) - - -#endif - diff --git a/lab3_asy/shell/header/mailbox.h b/lab3_asy/shell/header/mailbox.h deleted file mode 100644 index d13ac3ce9..000000000 --- a/lab3_asy/shell/header/mailbox.h +++ /dev/null @@ -1,38 +0,0 @@ -#include "gpio.h" - -extern volatile unsigned int mailbox[36]; - -#define MBOX_REQUEST 0 - -/* channels */ -#define MBOX_CH_POWER 0 -#define MBOX_CH_FB 1 -#define MBOX_CH_VUART 2 -#define MBOX_CH_VCHIQ 3 -#define MBOX_CH_LEDS 4 -#define MBOX_CH_BTNS 5 -#define MBOX_CH_TOUCH 6 -#define MBOX_CH_COUNT 7 -#define MBOX_CH_PROP 8 - -/* tags */ -#define TAG_REQUEST_CODE 0x00000000 -#define MBOX_TAG_GETSERIAL 0x00010004 -#define MBOX_TAG_GETBOARD 0x00010002 -#define MBOX_TAG_GETARMMEM 0x00010005 -#define MBOX_TAG_LAST 0x00000000 - -int mailbox_call(); -void get_board_revision(); -void get_arm_mem(); - -#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) -#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) -#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) -#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) -#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) -#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) -#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) -#define MBOX_RESPONSE 0x80000000 -#define MBOX_FULL 0x80000000 -#define MBOX_EMPTY 0x40000000 diff --git a/lab3_asy/shell/header/reboot.h b/lab3_asy/shell/header/reboot.h deleted file mode 100644 index e1d44aa1b..000000000 --- a/lab3_asy/shell/header/reboot.h +++ /dev/null @@ -1,8 +0,0 @@ -#define PM_PASSWORD 0x5a000000 -#define PM_RSTC 0x3F10001c -#define PM_WDOG 0x3F100024 - - -void set(long addr, unsigned int value); -void reset(int tick); -void cancel_reset(); diff --git a/lab3_asy/shell/header/shell.h b/lab3_asy/shell/header/shell.h deleted file mode 100644 index 9784c1ccb..000000000 --- a/lab3_asy/shell/header/shell.h +++ /dev/null @@ -1,2 +0,0 @@ -void shell(); -void parse_command(char* buffer); diff --git a/lab3_asy/shell/header/tasklist.h b/lab3_asy/shell/header/tasklist.h deleted file mode 100644 index 0b73da4b0..000000000 --- a/lab3_asy/shell/header/tasklist.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef TASKLIST_H -#define TASKLIST_H - -// #include -#include - -typedef void (*task_callback)(); - -typedef struct task { - struct task *prev; - struct task *next; - char parameter; - task_callback callback; - uint64_t priority; -} task_t; - -void execute_tasks(); -void create_task(task_callback callback,uint64_t priority, char parameter); -void enqueue_task(task_t *new_task); -extern task_t *task_head; - -#endif diff --git a/lab3_asy/shell/header/timer.h b/lab3_asy/shell/header/timer.h deleted file mode 100644 index a9a8c65da..000000000 --- a/lab3_asy/shell/header/timer.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -#include -// #include - -typedef void (*timer_callback)(void *data); - -typedef struct timer { - struct timer *prev; // previous timer in the list - struct timer *next; // next timer in the list - timer_callback callback; // the function to call when the timer expires - void *data; // data to be passed to the callback - uint64_t expiry; // the time at which the timer will expire -} timer_t; - -extern timer_t *timer_head; // head of the timer list - -void setTimeout(char *message,uint64_t seconds); -#endif diff --git a/lab3_asy/shell/header/uart.h b/lab3_asy/shell/header/uart.h deleted file mode 100644 index 0c3ff1bd8..000000000 --- a/lab3_asy/shell/header/uart.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef UART_H -#define UART_H - -#include "gpio.h" -#include -#define UART_BUFFER_SIZE 1024 - -void uart_init(); -void uart_send_char(unsigned int c); -char uart_get_char(); -void uart_send_string(char* s); -void uart_hex(unsigned long long d); -void uart_enable_interrupt(); -int uart_async_read(char *buffer); -void uart_async_write(const char *buffer, int length); -void uart_async_send(const char *str); - - -extern char uart_read_buffer[UART_BUFFER_SIZE]; -extern char uart_write_buffer[UART_BUFFER_SIZE]; -extern int uart_read_index; -extern int uart_read_head; -extern int uart_write_index; -extern int uart_write_head; - -#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) -#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) -#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) -#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) -#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) -#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) -#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) -#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) -#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) -#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) -#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) -#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) - -#endif diff --git a/lab3_asy/shell/header/utils.h b/lab3_asy/shell/header/utils.h deleted file mode 100644 index 3ba6dd719..000000000 --- a/lab3_asy/shell/header/utils.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -// #include - -#define nop asm volatile("nop") - -#ifdef _cplusplus -#define NULL 0 -#else -#define NULL (void*)0 -#endif - -#ifndef __SIZE_TYPE__ -#define __SIZE_TYPE__ long unsigned int -#endif -// #if !(defined (__GNUG__) && defined (size_t)) -typedef __SIZE_TYPE__ size_t; - - -int utils_string_compare(const char* i, const char* j); -unsigned long utils_atoi(const char *s, int char_size); -void utils_align(void *size, unsigned int s); -uint32_t utils_align_up(uint32_t size, int alignment); -size_t utils_strlen(const char *s); -char *utils_strcpy(char* dst, const char *src); -char *utils_strdup(const char *src); diff --git a/lab3_asy/shell/initramfs.cpio b/lab3_asy/shell/initramfs.cpio deleted file mode 100644 index faf47b52fd58348135f4805c9dad3157d9e67fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 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 diff --git a/lab3_asy/shell/kernel8.img b/lab3_asy/shell/kernel8.img deleted file mode 100644 index f528914e4aa4d556a58e0dbeadabedc57c6e434b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13408 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 diff --git a/lab3_asy/shell/linker.ld b/lab3_asy/shell/linker.ld deleted file mode 100644 index 5018defb6..000000000 --- a/lab3_asy/shell/linker.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2018 bzt (bztsrc@github) - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -SECTIONS -{ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } -} -__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/mailbox.c b/lab3_asy/shell/mailbox.c deleted file mode 100644 index 7e0c5d99c..000000000 --- a/lab3_asy/shell/mailbox.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "header/mailbox.h" - -volatile unsigned int __attribute__((aligned(16))) mailbox[36]; - -int mailbox_call() -{ - unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); - /* wait until we can write to the mailbox */ - do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); - /* write the address of our message to the mailbox with channel identifier */ - *MBOX_WRITE = r; - /* now wait for the response */ - while(1) { - /* is there a response? */ - do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); - /* is it a response to our message? */ - if(r == *MBOX_READ){ - /* is it a valid successful response? */ - if(mailbox[1] == MBOX_RESPONSE) - return 1; - } - } - return 0; -} - -void get_board_revision(){ - mailbox[0] = 7 * 4; // buffer size in bytes - mailbox[1] = MBOX_REQUEST; - // tags begin - mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier - mailbox[3] = 4; // maximum of request and response value buffer's length. - mailbox[4] = TAG_REQUEST_CODE; - mailbox[5] = 0; // value buffer - // tags end - mailbox[6] = MBOX_TAG_LAST; - mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. -} - -void get_arm_mem(){ - mailbox[0] = 8 * 4; // buffer size in bytes - mailbox[1] = MBOX_REQUEST; - // tags begin - mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier - mailbox[3] = 8; // maximum of request and response value buffer's length. - mailbox[4] = TAG_REQUEST_CODE; - mailbox[5] = 0; // value buffer - mailbox[6] = 0; // value buffer - // tags end - mailbox[7] = MBOX_TAG_LAST; - mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. -} diff --git a/lab3_asy/shell/mailbox.o b/lab3_asy/shell/mailbox.o deleted file mode 100644 index 8e2118f241e7cf5768d3e64c641e7118db6261bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< diff --git a/lab3_asy/shell/main.c b/lab3_asy/shell/main.c deleted file mode 100644 index b0f0731e8..000000000 --- a/lab3_asy/shell/main.c +++ /dev/null @@ -1,80 +0,0 @@ -#include "header/uart.h" -#include "header/shell.h" -#include "header/dtb.h" -#include "header/utils.h" -#include "header/cpio.h" -#include "header/timer.h" - -void test_read_command(char* buffer) { - int index = 0; - while(1) { - buffer[index] = uart_get_char(); - if(buffer[index] == '\n') { - buffer[index] = '\0'; - buffer[index+1] = '\n'; - uart_send_string("\r\n"); - break; - } - else - { - uart_send_char(buffer[index]); - } - index++; - } -} - -extern void *_dtb_ptr; -void main() -{ - - uart_init(); - // pre test ////////////////////////// - char buffer[256]; - while(1) - { - uart_send_string("# "); - test_read_command(buffer); - char * input_string = buffer; - if(utils_string_compare(input_string,"in")) - { - break; - } - else - { - // uart_send_hex((uintptr_t) _dtb_addr); - uart_send_string("The instruct is not exist.\n"); - } - } - ///////////////////////////////////////// - - // set up serial console - uart_init(); - - unsigned long el = 0; - asm volatile ("mrs %0, CurrentEL":"=r"(el)); - uart_send_string("Current exception level: "); - uart_hex(el>>2); // CurrentEL store el level at [3:2] - uart_send_string("\r\n"); - - asm volatile("mov %0, sp"::"r"(el)); - uart_send_string("Current stack pointer address: "); - uart_hex(el); - uart_send_string("\r\n"); - - // say hello - fdt_traverse(get_cpio_addr,_dtb_ptr); - traverse_file(); - uart_send_string("Type in `help` to get instruction menu!\n"); - - uart_enable_interrupt(); - - - while(1){ - asm volatile("nop"); - // execute_tasks(); - } - //echo everything back - //shell(); -} - - diff --git a/lab3_asy/shell/main.o b/lab3_asy/shell/main.o deleted file mode 100644 index c80fdbc7443a8e19e1096da4f762dd69d6d23497..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3728 zcmbuBPiz!b7{I^XDFkaNwf`uT$kbLW1je@3xDXB7mWl^L(3ZqR%I^PdwKlWlkr##SYq%w+#N9mSZ=(lCw(;u+n^cNXTMxr*I;3FBDQ!_gQYf@ z`#uiPjwTgqb7vk&z%FQgCEoVByBQXC_ruwqjg85}00%M8Jk9Gs{v(U)vtNIRKI98q zWxigVB(dzEpUer}vR%(9XFT04V#abkBXAfiJC3l4Wkkuding8?=S2RH9=HR~ zyPlbOK`#|8+Y^p%X0wiPU9_4!U!nwhIw$g_wC)x4(*hI8j1;dR>~c?7jrG}&{Qcj0 zF22}_`?)n1TlgUk3%4`cVi%6LW9!2D+(x$63u`-Yd{EX4msDBRI+j+nuBCRY8;v#G z|B4pdM>@3_*6vrWZ7JOei3-;5FxD@I^-E#>R8mI4!UZtL5P``?6!akf|!JO(m-7A{!f#e!s3;JM+bipXgT}BiaA2_P4+mcw8Zrik_ezYe04@F%Aok)j&@gj< zth;G9=*X~^zD&|}q*=eza9JC@5U<3Z{`se?*P3BJ;>Udp0G%G-k>=(2rG1z8j=r_$ z?FWy%(|56V{M`q}F7#I(l2)}la&3S=H)_plHQx*X4S%&n!$`G6gH2U0nNBdoFOo9yC-H-5*{A(rfsJKb9+W*R@1}w|idZro5lrXA z45YH&RI21T;KwUj#T0!8VLI!jJjXmI99IAa609ZhZ{rT_p=)x z)olUtue+p9T)p4?uC^gppZX)xz9YgLsqDG_%s*4&sPVs0c!$)f`&Qwq{dbacUarfs~AVuwf|dkx?f!!gnAs45XUn_C=HTx z9cJXr7Rk8|%$t-r>b_bOzB7ytcytS76VBtgE|jFyi1Rz)Bf~vk@XRSN@Us*2Io2GJ zHw{nBcwl5r&je%2b-{3oG$8XqBY{IULW1AEatRFj7UG!>3_R=!3uUWWew~;0)#A+VQ>KBYE^h zQ3)gcTcH@L?8gDc{IC9l=u0t&u&HuU4z8#WbzVQOV;mXjRrQkwIvdJ3(fTEk*Q(!F zGGJP6tV!nJ{9Hde4^WB$Y^tQ?!%Ov1g_pzqDV$_owR=N-_?3yM?OEv`HJ_Itr}&b} z>t~!trPls+c@*P)(f$dsKkuK`6U~hX{*v%D*>6QgXSS$6oe-nX4kDP7f70L3K#}PF S>6=o^|AbsWowHPl`u_ts$YKlt diff --git a/lab3_asy/shell/reboot.c b/lab3_asy/shell/reboot.c deleted file mode 100644 index 048f2d348..000000000 --- a/lab3_asy/shell/reboot.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "header/reboot.h" - -void set(long addr, unsigned int value) { - volatile unsigned int* point = (unsigned int*)addr; - *point = value; -} - -void reset(int tick) { // reboot after watchdog timer expire - set(PM_RSTC, PM_PASSWORD | 0x20); // full reset - set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick -} - -void cancel_reset() { - set(PM_RSTC, PM_PASSWORD | 0); // full reset - set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick -} diff --git a/lab3_asy/shell/reboot.o b/lab3_asy/shell/reboot.o deleted file mode 100644 index dda9e282580625dcaef2ab81c697421da43712d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* diff --git a/lab3_asy/shell/rootfs/file1.txt b/lab3_asy/shell/rootfs/file1.txt deleted file mode 100644 index 5c275ef57..000000000 --- a/lab3_asy/shell/rootfs/file1.txt +++ /dev/null @@ -1 +0,0 @@ -This is file one. diff --git a/lab3_asy/shell/rootfs/one.img b/lab3_asy/shell/rootfs/one.img deleted file mode 100644 index 13bb5c616b672e699f602fb9c67dce4a755fcb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N diff --git a/lab3_asy/shell/rootfs/pack.sh b/lab3_asy/shell/rootfs/pack.sh deleted file mode 100644 index d837d685d..000000000 --- a/lab3_asy/shell/rootfs/pack.sh +++ /dev/null @@ -1,2 +0,0 @@ -find . | cpio -o -H newc > ../initramfs.cpio - diff --git a/lab3_asy/shell/rootfs/thisisfile2.txt b/lab3_asy/shell/rootfs/thisisfile2.txt deleted file mode 100644 index 0a8a2c0d7..000000000 --- a/lab3_asy/shell/rootfs/thisisfile2.txt +++ /dev/null @@ -1 +0,0 @@ -Here is file two with longer size. diff --git a/lab3_asy/shell/shell.c b/lab3_asy/shell/shell.c deleted file mode 100644 index bfa8e0a3d..000000000 --- a/lab3_asy/shell/shell.c +++ /dev/null @@ -1,151 +0,0 @@ -#include "header/shell.h" -#include "header/uart.h" -#include "header/utils.h" -#include "header/mailbox.h" -#include "header/reboot.h" -#include "header/cpio.h" -#include "header/allocator.h" -#include "header/dtb.h" -#include "header/irq.h" -#include "header/timer.h" -#define BUFFER_MAX_SIZE 256u - - -extern void *_dtb_ptr; - -void read_command(char* buffer) { - int index = 0; - while(1) { - buffer[index] = uart_get_char(); - uart_send_char(buffer[index]); - if(buffer[index] == '\n') { - buffer[index] = '\0'; - buffer[index+1] = '\n'; - break; - } - index++; - } -} -/* -void async_read_command(char* buffer) { - int index = 0; - char tmp[1]; - - while (1) { - if (uart_async_read(tmp) > 0) { - buffer[index] = tmp[0]; - uart_send_char(tmp[0]); - if (tmp[0] == '\r') { - buffer[index] = '\0'; - break; - } - index++; - } - } -} -*/ - -void parse_command(char* buffer){ - // uart_send_string("in parse command\n"); - char* input_string = buffer; - char* parameter[5]; //5 is the available parameter length - int para_idx = 0; - int input_string_len = utils_strlen(input_string); - for(int i=0; i < input_string_len; i++){ - if(*(input_string+i) == ' '){ - *(input_string+i) = '\0'; - parameter[para_idx++] = (input_string+i+1); - } - } - - if(utils_string_compare(input_string,"help")) { - uart_send_string("help :print this help menu\n"); - uart_send_string("hello :print Hello World!\n"); - uart_send_string("info :Get the hardware's information\n"); - uart_send_string("reboot :reboot the device\n"); - uart_send_string("ls :list the file\n"); - uart_send_string("cat :print file content\n"); - uart_send_string("malloc :give dynamic memory space\n"); - uart_send_string("dtb :print device tree\n"); - uart_send_string("exec :execute user program\n"); - } else if (utils_string_compare(input_string,"hello")) { - // uart_send_string("Hello World!\n"); - uart_send_string("Hello World!\n"); - } else if (utils_string_compare(input_string,"info")) { - get_board_revision(); - uart_send_string("My board revision is: "); - uart_hex(mailbox[5]); - uart_send_string("\n"); - get_arm_mem(); - uart_send_string("My ARM memory base address is: "); - uart_hex(mailbox[5]); - uart_send_string("\n"); - uart_send_string("My ARM memory size is: "); - uart_hex(mailbox[6]); - uart_send_string("\n"); - } else if (utils_string_compare(input_string,"reboot")) { - uart_send_string("Rebooting....\n"); - reset(1000); - } else if (utils_string_compare(input_string,"ls")) { - cpio_ls(); - } else if (utils_string_compare(input_string,"cat")){ - //uart_send_string("Filename: "); - //char filename[BUFFER_MAX_SIZE]; - //read_command(filename); - //cpio_cat(filename); - cpio_cat(parameter[0]); - } else if (utils_string_compare(input_string,"malloc")){ - char *a = simple_malloc(sizeof("9876")); - char *b = simple_malloc(sizeof("345")); - a[0] = '9'; - a[1] = '8'; - a[2] = '7'; - a[3] = '6'; - a[4] = '\0'; - b[0] = '3'; - b[1] = '4'; - b[2] = '5'; - b[3] = '\0'; - uart_send_string(a); - uart_send_char('\n'); - uart_send_string(b); - uart_send_char('\n'); - } else if (utils_string_compare(input_string,"dtb")) { - fdt_traverse(print_dtb,_dtb_ptr); - } else if (utils_string_compare(input_string,"exec")) { - //uart_send_string("Program name: "); - //char buffer[BUFFER_MAX_SIZE]; - //read_command(buffer); - cpio_exec_program(parameter[0]); - } else if (utils_string_compare(input_string,"timer")) { - - setTimeout("hello world1",3); - setTimeout("hello world2",6); - setTimeout("hello world3",9); - - } else if (utils_string_compare(input_string,"settimeout")) { - char *message = (char *)parameter[0]; - size_t second_str_len = utils_strlen(parameter[1]); - uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); - setTimeout(message,seconds); - } else { - uart_send_string("The instruction "); - uart_send_string(input_string); - uart_send_string(" is not exist.\n"); - } -} - -void shell(){ - /* - while(1) { - char buffer[BUFFER_MAX_SIZE]; - uart_send_string("# "); - //async_read_command(buffer); - parse_command(buffer); - } - */ - -} - - - diff --git a/lab3_asy/shell/shell.o b/lab3_asy/shell/shell.o deleted file mode 100644 index 716286e80b959f6f98c9d10c09f860e44587de5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7040 zcmcJTe`p-X702KGuq|0m>R1WAcKYb z-tK$r(df36KnLz-<}+`;^WMzt?2l)^d-!|tSPUe^;P-H^CKMpsrIh_*7Vd*huyXE? zb1Mm$zWGFK?p6XWbVBpvFOSCOwkF|k-A3XQG@W@R-uYtlsmC(zdYFctu!Y#Ar`$|; zFPw_qy*vJ=IP9bLn@z5&xoXpT|8N0xG#ToX<`2QVJH(zE=05*~PbsXMbP3Db{5;-54w#yPc^ z=)ABC&@b{S0Rxy%;m@!CKgtv%>8_mn%XuCrwZ;#Cf&ayBHU{6;`@*`_G59(^Z;tVJ zsZzYY@XImtg%`%Y`0HCvJ`NY3-2(f5yMESr4$Bf> zHr5;q;!XMS(pbb~Y~5!A{Ue5brpR^|WN+gYa+~s~KC`^0YD~KBBI=rf@8Mj&uhsqW zV$F|v9I;!ohj4EU-1=yEPGbBA&V|3%@tUDngL>+MIIrN_bWB$jN#VJP`~KqMJE{7@Ei*Vu_i3+P5%wg zG8(Ss7#H1?W*fJjRGyDK{k}oOQTxz3~K@xjT}34;J~2K z`((aR^%_Qhe|jL@x2M11SNnglcW=6H;9HFS{+s=OfY{kFNKQN)+p(z|dXdR(>KL^T z-QV}x`q$SDznq*&9C#)EtJvu0pMCP_-!I=EZ1jVyF_Z9ZM_=3cdi(IpZ8ICZjh}x; zR>K`5VQG|0Lmj!WbR;Ydhoz%o>2O#Qm7xw%IS`hHI!1!Q04Sy_>{F8Ss0_~zy#4+A zZmaeLQ0v;1z=N_?N}!US+Iway#Bf)+lfEfBWkBdBlte#q;s5&{XK!@L-=c@GakY12!1w#HzW9D1pjpee=~x= z9le9FFTBV5Dcr#>olxll^h`ic5pNr2 zF;}QnDrU6^4b$;*CoL~m!23*4bFC`2Q?+h7u657Uv&(J{kFBy*g@#n{7$pldwUq8? zg$+0qo_%;fvCH||1kf=4!JdhRi=2y&@N3Lx=YuM2)^vo^10^M0r%ThB56obvrX$>l(CN{1mRP4((-FQqLWds2DM?%s z|9(wJc$WEg%+>vKP}31V4r@BXN14<7sQdYtrqjpuBImMR!b{9`f6AJU`0Z&r!Y7#P z{xmh6S*}lNI>KLy(3#P6&U5`$O-J}|6diS*f5)8S#rMuIz0LePn5RMt@D6i|>p_LT z%UsrdgzN8dF7qt>5_5e&f1v3c=lVS78O&9GK4dQXVt<7>>2Fp1TvWI^57!jFO|ieu zT;eKm{RZbUuJ9#AN7cWhaMhn=JQz%$hc@Oi?j-l$#9YP|zBxi?r^3~7cQe=bc^`8b zSJpMdT*ei?U(r{uyMvmJtoLC}NBC%jPLVnJ*`=&YUEyC>xW`=lpXYgdhPn7JyvdyA zU-kbbg>P5%Uyb0G6t1rOyu#J{_=3V!`$gsyuWEmdxx}@=aou1paS2~i^wqeQnbUQ> zLy7B-!s%IEQj(wN=(Y!`s13;b)M%RYdXS@DLVKaG)zTJXPI?MnvU>tgw8XXj+_fkO-K0i%xV5r ze@CfgI=97c=x1%(?5pJ%T7^C5HD554Tq0(039!Y?cO>h*Fp zf?w10v#ftZ(-*$PocvVvWpA%T&JuofBOIgf<6OV0@ms75Y4=RUGxL~xPLP+RH9!LOSodkalWRA@lxp2GaD>gdfTvjbCZ3^r0U-xySX)!q3o-dRwL33H-)o z@#tSYGq5X$y6PQ*)Ux!4X<6b4s;l+@Avz=I-7kwjH7#`nwOP*Tdm4??#zu0se}lO; z3}nI=O76fJX{c#8R!H-!_V35Oq`4P=YLfBgJ|%79zxa{G1}gW70q2waQbzu%N%~3t zeQcDnYWI%%Ql~WNwm;?m>Ru)Dce(#{r7so5f5AV&LaX(g;)kLUHl+2VzS3XTkNnZc xrY^Jm$*GSQhPDBHbJF|McP@SH5WxZsi0L6MV6E!k!&~*g!v2>6nebol{~u0gF?s+1 diff --git a/lab3_asy/shell/start.S b/lab3_asy/shell/start.S deleted file mode 100644 index 8f8331f31..000000000 --- a/lab3_asy/shell/start.S +++ /dev/null @@ -1,163 +0,0 @@ - -.section ".text.kernel" - -.global _start - - - -_start: - ldr x1, =_dtb_ptr //put _dtb_ptr into register1 - str x0, [x1] //store dtb address from x0 to _dtb_ptr - // read cpu id, stop slave cores - mrs x1, mpidr_el1 - and x1, x1, #3 - cbz x1, 2f - // cpu id > 0, stop -1: wfe - b 1b -2: // cpu id == 0 - - ldr x1, =_start - bl from_el2_to_el1 - mov sp, x1 - - - /* set exception vector table */ - adr x0, exception_vector_table - msr vbar_el1, x0 // vbar -> Vector Base Address Register - - //bl core_timer_enable - - // clear bss - ldr x1, =__bss_start - ldr w2, =__bss_size - -3: cbz w2, 4f - str xzr, [x1], #8 - sub w2, w2, #1 - cbnz w2, 3b - //bl core_timer_enable - // jump to C code, should not return -4: bl main - // for failsafe, halt this core too - b 1b - -from_el2_to_el1: - mov x0,#(1<<31) - msr hcr_el2,x0 - mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable - msr spsr_el2,x0 // spsr -> saved program status register - msr elr_el2,lr // lr->link register elr->Eeception Link Register - eret -/* -core_timer_enable: - //mov x0,1 - //msr cntp_ctl_el0, x0 //enable - //mrs x0, cntfrq_el0 - //mov x3,5 - //mul x0, x0, x3 - //msr cntp_tval_el0,x0 // set expired time - //mov x0,2 - //ldr x1, =CORE0_TIMER_IRQ_CTRL - //str w0,[x1] //unmask timer interrupt - //ret -*/ -// save general registers to stack -.macro save_all - sub sp, sp, 32 * 8 - stp x0, x1, [sp ,16 * 0] - stp x2, x3, [sp ,16 * 1] - stp x4, x5, [sp ,16 * 2] - stp x6, x7, [sp ,16 * 3] - stp x8, x9, [sp ,16 * 4] - stp x10, x11, [sp ,16 * 5] - stp x12, x13, [sp ,16 * 6] - stp x14, x15, [sp ,16 * 7] - stp x16, x17, [sp ,16 * 8] - stp x18, x19, [sp ,16 * 9] - stp x20, x21, [sp ,16 * 10] - stp x22, x23, [sp ,16 * 11] - stp x24, x25, [sp ,16 * 12] - stp x26, x27, [sp ,16 * 13] - stp x28, x29, [sp ,16 * 14] - str x30, [sp, 16 * 15] -.endm - -// load general registers from stack -.macro load_all - ldp x0, x1, [sp ,16 * 0] - ldp x2, x3, [sp ,16 * 1] - ldp x4, x5, [sp ,16 * 2] - ldp x6, x7, [sp ,16 * 3] - ldp x8, x9, [sp ,16 * 4] - ldp x10, x11, [sp ,16 * 5] - ldp x12, x13, [sp ,16 * 6] - ldp x14, x15, [sp ,16 * 7] - ldp x16, x17, [sp ,16 * 8] - ldp x18, x19, [sp ,16 * 9] - ldp x20, x21, [sp ,16 * 10] - ldp x22, x23, [sp ,16 * 11] - ldp x24, x25, [sp ,16 * 12] - ldp x26, x27, [sp ,16 * 13] - ldp x28, x29, [sp ,16 * 14] - ldr x30, [sp, 16 * 15] - add sp, sp, 32 * 8 -.endm - - - -exception_handler: - save_all - bl except_handler_c - load_all - eret - -irq_exception_handler: - save_all - bl irq_except_handler_c - load_all - eret - -.align 11 // vector table should be aligned to 0x800 -.global exception_vector_table -exception_vector_table: - b exception_handler // branch to a handler function. - .align 7 // entry size is 0x80, .align will pad 0 - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b irq_exception_handler - .align 7 - b irq_exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b irq_exception_handler - .align 7 - b irq_exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - -.global _dtb_ptr //define a global variable _dtb_ptr -.section .data //_dtb_ptr is in data section -_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 - diff --git a/lab3_asy/shell/start.o b/lab3_asy/shell/start.o deleted file mode 100644 index 815811e7bafe472582f0983e07edcf6df83d8ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7616 zcmeHM&1(}u6o1LCO{@J@XlRQ~p->TxRQ#eyyRG&^ZT-4fy)2t%HNkw;&7!qJ8^nL0 z(o+v=y$yKqAP7D6U$77lo`Q&oh)5A>OKp6!yVIV6|U{YcC6hllXjY z1#T|vJ0 z2FQ=0O0sgLiu}B>m;6%qk<~lZWIbI&HXhWH%}20CHSz%kIr@;JA34q;$9d!!K#oD= z7($L=nw+FmEuv>eed9%>8 zTUzCG)_;rD{~%a@QLz5JVEt!;^``~vcMH~U7Oa0zu>R(T*zeDxVEuW)`cs1SZwc1# z7OaoIsdsEr*^>eQ3H)U_C45rOB#=vB`wXHKw-Fhxav4FZFGGyO4>JBypB&dG%y>Gb#C#h=s4UUF$mR_$`PxxbRmlywQc9wHFR({C*eC ziswh%T}QT#^ysU`6<_ZJQ5^sK+OnVvuiHY=31=QAarSsO4f`Hro~cio5RPi524O4= zgbh8Rg((`os~agj;pW+)Pmkqrs8GS>D_oy-X{_7Yu|qNb%~YHqZkv|8@tqh)WB7cw zeh$snjo0tOCluqy&yE&D?nR?4+<=ZCM863NHn(M)?cS0DQhpl8((UhstzG(-0)(7^ ryffec=FE14vuQ=zeJ;hYZpriority < task_head->priority) { - new_task->next = task_head; - new_task->prev = NULL; - if (task_head) { - task_head->prev = new_task; - } - task_head = new_task; - } else { - // Find the correct position in the list - task_t *current = task_head; - while (current->next && current->next->priority <= new_task->priority) { - current = current->next; - } - - // Insert the new task - new_task->next = current->next; - new_task->prev = current; - if (current->next) { - current->next->prev = new_task; - } - current->next = new_task; - } - - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); -} - -void create_task(task_callback callback, uint64_t priority, char data) { - // uart_send_string("in create_task"); - task_t* task = simple_malloc(sizeof(task_t)); - if(!task) { - return; - } - - task->callback = callback; - task->priority = priority; - task->parameter = data; - - enqueue_task(task); -} - -void execute_tasks() { - // uart_send_string("in execute_tasks \n"); - while (task_head) { - // mmio_write(AUX_MU_IO, 0); - // mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x02); - asm volatile("msr DAIFClr, 0xf"); // Enable interrupts - task_head->callback(task_head->parameter); - uart_send_string("out callback\n"); - task_head = task_head->next; - if (task_head) { - task_head->prev = NULL; - } - asm volatile("msr DAIFSet, 0xf"); // Disable interrupts - // simple_free(task); - } - - asm volatile("msr DAIFClr, 0xf"); // Enable interrupts - // uart_send_string("out exe \n"); -} - diff --git a/lab3_asy/shell/tasklist.o b/lab3_asy/shell/tasklist.o deleted file mode 100644 index 9d596bfe34095ce4dfdb85edbf45b65f9e5f9d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2472 zcmbVNO>7fa5T5nhP<~7ZBnZ?Xyr8H8QC4=81L4A&P(q~&5Hu3K)LA>*I>JBTT}y@_ z$f@Td+#{TEP8AA*3su!};J^U^;Zz`p-l!^7DF>?xW@bI(tX}L(U$i^(zWKg+Z{Lhx zZhZ08$(Uh)3kG)eE|5F(Y`%I_lwp#biYtWcC*LWst3Hz_r+Lgfg-)L9o z9yL}K+*~JsbugBnK!ct4LcNcNXamM$>(ZaD;%W7zW)*?RO zH=u^Tb1{M6O6Nkj^PzR0wC(kO3)e#pl&gW2a|?y6o4dFfU~*#OsC8f}TP+1uE0wax z?BwB8HJqldkB-{Ov4aeg7{@@{fN}L4n6^Oyr+ozS1eryKtQ;@czV+1YX6`WFkceqiTd zqy{51;FT^{y{ea?0OTs38?f)s7B3aNOcA@boCB}s<*FR=q3TwGjPI3ZGJa5*EqxE9 z&g4CJhW95YJ&2_fpF*;ay&8Uibvj;Wd>Hxd+O~n88UGaVt?ZL|#=gGpOUCv5e?<7v z>Mb+A6Z1#$zk1}664O4nGlz_ca~k@(@gDe|UU)kV^kE$D-_A&Cxb&0MLHLhFVf$B# zftv*z3)i-J@hV=ywF9pffIZ^|F4$S$2fI?H3DHyb5wLURV$mxhrBn_)d-C+uVL!k- z4SA&Y@|o`{Zqbv~{N`gWZ1dcVXIYPTak!53 zrQD~VF|OZKfwr!s*I~MYDW|TlF;UhNy*^K2fT*KFU@Ln4Mi#y7!$Cgz(jP2`ADAHj zBLo+n*e_Wxak2M=AOKq({uXhH}r(}u>~=@KXm;j#Pr%B)Va*E;biT_={f-20bTXn(D@Ft?dbZC{*DLd diff --git a/lab3_asy/shell/timer.c b/lab3_asy/shell/timer.c deleted file mode 100644 index 0839a1fdf..000000000 --- a/lab3_asy/shell/timer.c +++ /dev/null @@ -1,115 +0,0 @@ -#include "header/timer.h" -#include "header/allocator.h" -#include "header/uart.h" -#include "header/irq.h" -#include "header/utils.h" - -timer_t *timer_head = NULL; - -void add_timer(timer_t *new_timer) { - - timer_t *current = timer_head; - - // Disable interrupts to protect the critical section - asm volatile("msr DAIFSet, 0xf"); - // Special case: the list is empty or the new timer is the earliest - if (!timer_head || new_timer->expiry < timer_head->expiry) { - new_timer->next = timer_head; - new_timer->prev = NULL; - if (timer_head) { - timer_head->prev = new_timer; - } - timer_head = new_timer; - - // Reprogram the hardware timer - asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); - asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); - - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); - return; - } - - // Find the correct position in the list - while (current->next && current->next->expiry < new_timer->expiry) { - current = current->next; - } - - // Insert the new timer - new_timer->next = current->next; - new_timer->prev = current; - if (current->next) { - current->next->prev = new_timer; - } - current->next = new_timer; - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); -} - - -void create_timer(timer_callback callback, void* data, uint64_t after) { - //Allocate memory for the timer - timer_t* timer = simple_malloc(sizeof(timer_t)); - if(!timer) { - return; - } - - //Set the callback and data - timer->callback = callback; - timer->data = data; - - //Calculate the expiry time - uint64_t current_time, cntfrq; - asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); - asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); - timer->expiry = current_time + after * cntfrq; - //Add the time to the list - add_timer(timer); -} - - -void print_message(void *data) { - char *message = data; - uint64_t current_time, cntfrq; - asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); - asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); - uint64_t seconds = current_time / cntfrq; - - uart_send_string("Timeout message: "); - uart_send_string(message); - uart_send_string(" occurs at "); - uart_hex(seconds); - uart_send_string("\n"); -} - -void repeat_print(void *data) -{ - char *message = data; - for(int i=0; i<100000; i++) - { - // int a = 1; - uart_send_string(message); - uart_send_string("\r\n"); - uart_send_string("================================\n"); - } -} - -void setTimeout(char *message,uint64_t seconds) { - - char *message_copy = utils_strdup(message); - - if(!message_copy){ - return; - } - - if (!timer_head) { - //enable core_timer_interrupt - unsigned int value = 2; - unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt - *address = value; - } - - // create_timer(print_message,message_copy,seconds); - create_timer(repeat_print, message_copy, seconds); -} - diff --git a/lab3_asy/shell/timer.o b/lab3_asy/shell/timer.o deleted file mode 100644 index 1a7b22f28520b7de70a002723fbc7d4a22578123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3480 zcmbVOL2MgE6#eUUf}1A6#R*gdHJd6zL26cU8i}fa(y(o`I1iBJ!f%At^^st=L*fA){FtZjk# z(d_^8_Wd_Ae`Yp5dvxSgpQ3;?1-^!zo*=o^1wlsp}i+)61B?w4t`MZxh~Xg!jA3<%!Ml!Q$4b zq2l)J4_DXJ=q*2LEI_36+i`XMWAs;4SXG0O(ot+@q2c}&fQcYL+kVma-QT6a#9dWc z?(#=UM!9^=KL^EmKa|RtFZBFS)Bs9utTO;bTvKTt+wkul>l)0DY3OB6Cu-1`kIUs} z-0OXa<7}$F<*g8uws4)$Fn@#A7ExfeeN-v#-*{ ztZvf$g?^-@VPCE#hHFs~kE4z{q7=JuE-JQ#MpdlIS&tY;tcS*=IzwRo#vs-a;Obv^ zp1%15Ylr&K(nL>ySN_GA1{2dMGo7=wlxbPU8S}6vvH`SoJf6#1nqfN#@{bJyqhzQqK@WJC1P$ZM|ax~f0k>#Q=!() z2T<{^mZ_*z%T#Enf_Dj|8gCYO^|%hdp8gYc^aFt3pej=#P=yhoLSq&FBqC3_>JVeb zbLfK{yIn7Kh#zCH!2U(XA8=os2aM^=)Y8F=B6LQ%6!IL!>hPzTzruWRE)cWp@D~u@ z9+ z$|TKb%19>DaS*vtzORnPl$i(1wD~SW&Yn(Mq?yQNKq$j}waLA;zCYPiIwHl5tswK7Ns5T-HJ2HsjuP&DFu@J^HV){wE%NiGNy0 zr{Kava`Nau_vp*>f7zoi@vj)CI=J_7jd5BR{{E=gb;hYa?tS@*aqqtT%DA`wcU?Ly z6?K4nj8mQ6c);h7y!$23Z3FU|B8akn5|8m1r`bzfepd<}e3a+0>cLkS2i^K0WgC;| z?X2UcWRx|NhHjgA8}x)>8=y~G7Urj%cJLwfk-Zp7%mdh=-*@7^I)IgsZ>XXoLq6@9a7 TXD1/RXD1 - // p.102 I find These two in GPIO 14/15 Fun5 - // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 - // That's why I need GPFSEL1 - r=*GPFSEL1; - r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 - r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 - *GPFSEL1 = r; // from here activate Trasmitter&Receiver - - //Since We've set alt5, we want to disable basic input/output - //To achieve this, we need diable pull-up and pull-dwon - *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down - //Wait 150 cycles - //this provides the required set-up time for the control signal - r=150; while(r--) { asm volatile("nop"); } - // GPIO control 54 pins - // GPPUDCLK0 controls 0-31 pins - // GPPUDCLK1 controls 32-53 pins - // set 14,15 bits = 1 which means we will modify these two bits - // trigger: set pins to 1 and wait for one clock - *GPPUDCLK0 = (1<<14)|(1<<15); - r=150; while(r--) { asm volatile("nop"); } - *GPPUDCLK0 = 0; // flush GPIO setup - - - r=1000; while(r--) { asm volatile("nop"); } - - /* initialize UART */ - *AUX_ENABLE |=1; - //P.9: If set the mini UART is enabled. The UART will - //immediately start receiving data, especially if the - //UART1_RX line is low. - //If clear the mini UART is disabled. That also disables - //any mini UART register access - *AUX_MU_CNTL = 0; - //P.17 If this bit is set the mini UART receiver is enabled. - //If this bit is clear the mini UART receiver is disabled - //Prevent data exchange in initialization process - *AUX_MU_IER = 0; - //Set AUX_MU_IER_REG to 0. - //Disable interrupt because currently you don’t need interrupt. - *AUX_MU_LCR = 3; - //P.14: 00 : the UART works in 7-bit mode - //11(3) : the UART works in 8-bit mode - //Cause 8 bits can use in ASCII, Unicode, Char - *AUX_MU_MCR = 0; - //Don’t need auto flow control. - //AUX_MU_MCR is for basic serial communication. Don't be too smart - *AUX_MU_BAUD = 270; - //set BAUD rate to 115200(transmit speed) - //so we need set AUX_MU_BAUD to 270 to meet the goal - *AUX_MU_IIR = 0xc6; - // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 - // Writing with bit 1 set will clear the receive FIFO - // Writing with bit 2 set will clear the transmit FIFO - // Both bits always read as 1 as the FIFOs are always enabled - /* map UART1 to GPIO pins */ - *AUX_MU_CNTL = 3; // enable Transmitter,Receiver - -} - - -/** - * Send a character - */ -void uart_send_char(unsigned int c) { - /* wait until we can send */ - // P.15 AUX_MU_LSR register shows the data(line) status - // AUX_MU_LSR bit 5 => 0x20 = 00100000 - // bit 5 is set if the transmit FIFO can accept at least one byte. - // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop - // else FIFO can not accept at lease one byte then still wait - do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); - /* write the character to the buffer */ - //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the - //UART FIFOs. - //communicate with(send to) the minicom and print to the screen - *AUX_MU_IO=c; -} - -/** - * Display a string - */ -void uart_send_string(char* s) { - while(*s) { - /* convert newline to carriage return + newline */ - if(*s=='\n') - uart_send_char('\r'); - uart_send_char(*s++); - } -} - -/** - * Receive a character - */ -char uart_get_char() { - char r; - /* wait until something is in the buffer */ - //bit 0 is set if the receive FIFO holds at least 1 symbol. - do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); - /* read it and return */ - r=(char)(*AUX_MU_IO); - /* convert carriage return to newline */ - return r=='\r'?'\n':r; -} - - -/** - * Display a binary value in hexadecimal - */ -void uart_hex(unsigned long long d) { - unsigned long long n; - int c; - uart_send_string("0x"); - for(c=28;c>=0;c-=4) { - // get highest tetrad - n=(d>>c)&0xF; - // 0-9 => '0'-'9', 10-15 => 'A'-'F' - n+=n>9?0x57:0x30; - uart_send_char(n); - } -} - -void uart_enable_interrupt() { - - // Enable RX and TX interrupt for mini UART - uint32_t ier = mmio_read(AUX_MU_IER); - ier |= RX_INTERRUPT_BIT; - //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); - mmio_write(AUX_MU_IER, ier); - - // Enable the mini UART interrupt in the second-level interrupt controller - // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; - uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); - enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 - mmio_write(ENABLE_IRQS_1, enable_irqs1); -} - -void uart_disable_interrupt() { - // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; - uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); - disable_irqs1 |= AUXINIT_BIT_POSTION; - mmio_write(DISABLE_IRQS_1,disable_irqs1); -} - -int uart_async_read(char *buffer) { - if (uart_read_head == uart_read_index) { - // No characters available - return 0; - } else { - buffer[0] = uart_read_buffer[uart_read_head++]; - if (uart_read_head >= UART_BUFFER_SIZE) { - uart_read_head = 0; - } - return 1; - } -} -void uart_async_write(const char *buffer, int length) { - // uart_write_head = 1; - // uart_read_index = 1; - for (int i = 0; i < length; i++) - { - uart_send_string("qq\n"); - uart_write_buffer[uart_write_index++] = buffer[i]; - if (uart_write_head >= UART_BUFFER_SIZE) { - uart_write_head = 0; - } - } - // Trigger TX interrupt - /// uart_send_string("Triiger TX interrupt\n"); - uart_hex(uart_write_index); - uart_hex(uart_write_head); - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); - /// uart_send_string("flag1\n"); - uart_hex(uart_write_index); - uart_hex(uart_write_head); -} - -void uart_async_send(const char *str) { - uart_send_string("in uart asy send ===========================\n"); - int length = utils_strlen(str); - uart_async_write(str, length); -} - - diff --git a/lab3_asy/shell/uart.o b/lab3_asy/shell/uart.o deleted file mode 100644 index f6088c1ce3ee39a9a459387b666066fc2b654f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4712 zcmbtXZ){Ul6hE)8j55Y7V+11V-ey5CSlKeoG*R9_MGPu5Gf_kAy0y54QCQo>>C|;> zL^6%Bx)4JI`JfR=O#EOX<%14EGmRfiMPp*nfkrX#fj@r1IP34cp1WPHn<09V*L&~p zp7T5BopauOul@IKxX))B`EPC}%J<`{aqMr%Pu)k0#TIJ;?CAA~1v|E>n`WP$%X<5( zWly&sq~U^9FB&L3*)iH*@%si;~KT2-?HzW;H!fk&-osY7H_@Xf?xLUh@M66 z9hQ$8S=Wy})@MI&TiM9!<<#w3)M8h=P0XS548opmPyJQAP5DzkIG#(z;-Ud?vM;uC z;D59@`*wnlW^i--1dOhus+vaXrr^M}%rnvV@w=$$E5F!uXu_r(;>;l@BOD*w4%*qs zujSdotg@^ZEAt!;9ot)5;l8>$L>GR}?%F#<){ADm?Lpe)M_m0usvr2P*fP;~^dS4& z2~KOx9*@f!f9ImhF`))7bU9`sy8$tHIUQKLr@%TUu6%La$bar9#2$jJ>v!{S5^c>Q zhie?lW&Jdtxg6AT%~-stjp&X#=tcj$ru#vn7OpwRMA%ok;2Z$&elSQaoReBVZ9-4x z0`N84qFgz~6+|zdb%VJFu;y6C?easohmq5Pd-9(__ov|f`DXY&74YYepN}@hKd)=* z7oWvoAivrwI~zkzmObmfHXD57l5?&f_XOwsH_18Illz1Hj3V!Zyw@P_bpyNh`p7q# zch1o$`i=9x6ZfU^j>k90{J(&2MQ}IgdPMibbyYr`rBnQ$psrWLKZtmJ@WIcS@)JWW z>jOjiTB>P?A(nsh$@leN{06l9nmzyD?`vGk+tuEe>Q}Bi4!xX(+K%8Eo9O$zN4o zdvCCoRMdFbV!_X8dMjlf(lA%%n>DOO=8ZC5hp|KEJ9uoa4DR#ow;uoDWF;>-hTS}Y zC?AZy;UPpS7RKHeY@>`0#^W*%`7jY~-(WejH_rv+;5vhgrHOxd_P1p;s4}kZJTg{7*gU1 zl$y@iv#Au70fVQ^gou+@rR72O3)hVC^J1ZT<|e_b<(5_7a9vn`hv2Gr?i2hi!FLGX z!-|J%4pDuRz?^wp!By`(D|oBms()S*{C&Z_9s;&c@Dq|!uWx|8hbxH7lp_GX!|ACdquK*b`F%wL02MK+Vu3I9h26jb!RfJVqs!La^>38Z|m8zB_TKI z83=$}9+ZAsfKl)24+LLm;D-fYf>HaFCDl*Nqf*a>i%UN-kB)Z0fFGCv z|59)>p05Nq<2j+}a~@P5jcfWkeok;R4&S?5Neok=H z@9!GE$YU=31mqQRE&6bwhV#3cWfpKLwYOg7{Z8TMWqpru&Lny>6pqI- zF$%Y((-cl^=LM_RhnpzezJ1%aL=q~=?U_V)-9wMulFr21w?dDt6CKelsn|AtEB!xl zV2+YpaaJ*-%Ri6`8wU#qwP6lKrT2K)pYg2`*}4O|-%A zt2UTJmz7vBr)j@Y?5mYSF*24^51ct0WM2)+{%!@xsO(i7E^wZ!J{C24S^RT+x+ps} zuE(aD>v~77^8TL?duh{2iczu0f0Zjl#jn7}Fqy7?U(G9NsOORE$F|B|)sN{--)uQ1 rhnIRk@OL3on)Y*mnY9B%uk!|k-)FiQOMIhDZ$Bzu-yOO!=BEAMIq%;P diff --git a/lab3_asy/shell/userprogram/Makefile b/lab3_asy/shell/userprogram/Makefile deleted file mode 100644 index 19cefe3cf..000000000 --- a/lab3_asy/shell/userprogram/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -all: one.img - -one.o: one.S - aarch64-linux-gnu-gcc -c one.S -o one.o - -one.img: one.o - aarch64-linux-gnu-ld one.o -T linker.ld -o one.elf - aarch64-linux-gnu-objcopy -O binary one.elf one.img - -clean: - rm one.o one.elf > /dev/null 2>/dev/null || true diff --git a/lab3_asy/shell/userprogram/linker.ld b/lab3_asy/shell/userprogram/linker.ld deleted file mode 100644 index ab70a30ea..000000000 --- a/lab3_asy/shell/userprogram/linker.ld +++ /dev/null @@ -1,19 +0,0 @@ -SECTIONS -{ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } -} -__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/userprogram/one.S b/lab3_asy/shell/userprogram/one.S deleted file mode 100644 index 4acf6f4dd..000000000 --- a/lab3_asy/shell/userprogram/one.S +++ /dev/null @@ -1,7 +0,0 @@ -.section ".text" -.global _start -_start: - svc 0x1337 -1: - nop - b 1b diff --git a/lab3_asy/shell/userprogram/one.elf b/lab3_asy/shell/userprogram/one.elf deleted file mode 100644 index b13e36ed9627aa5a41acd8767b43259aeddc6b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB diff --git a/lab3_asy/shell/userprogram/one.img b/lab3_asy/shell/userprogram/one.img deleted file mode 100644 index 13bb5c616b672e699f602fb9c67dce4a755fcb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N diff --git a/lab3_asy/shell/userprogram/one.o b/lab3_asy/shell/userprogram/one.o deleted file mode 100644 index c00c28e5b03a97b1c7da93cb70b11273c5c3833a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T diff --git a/lab3_asy/shell/utils.c b/lab3_asy/shell/utils.c deleted file mode 100644 index 8242d820c..000000000 --- a/lab3_asy/shell/utils.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "header/utils.h" -#include "header/allocator.h" - -int utils_string_compare(const char* str1,const char* str2) { - for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ - if(*str1 != *str2) return 0; - else if(*str1 == '\0' && *str2 =='\0') return 1; - } - return 1; -} - -unsigned long utils_atoi(const char *s, int char_size) { - unsigned long num = 0; - for (int i = 0; i < char_size; i++) { - num = num * 16; - if (*s >= '0' && *s <= '9') { - num += (*s - '0'); - } else if (*s >= 'A' && *s <= 'F') { - num += (*s - 'A' + 10); - } else if (*s >= 'a' && *s <= 'f') { - num += (*s - 'a' + 10); - } - s++; - } - return num; -} - -void utils_align(void *size, unsigned int s) { - unsigned long* x = (unsigned long*) size; - unsigned long mask = s-1; - *x = ((*x) + mask) & (~mask); -} - -uint32_t utils_align_up(uint32_t size, int alignment) { - return (size + alignment - 1) & ~(alignment-1); -} - -//with null-terminator -> "hello" return 6 -size_t utils_strlen(const char *s) { - size_t i = 0; - while (s[i]) i++; - return i+1; -} - - -char *utils_strcpy(char* dst, const char *src) { - char *save = dst; - while((*dst++ = *src++)); - return save; -} - - -char *utils_strdup(const char *src) { - size_t len = utils_strlen(src); - char *dst = simple_malloc(len); - if (dst == NULL) { // Check if the memory has been successfully allocated - return NULL; - } - utils_strcpy(dst, src); // Copy the string - return dst; -} - - diff --git a/lab3_asy/shell/utils.o b/lab3_asy/shell/utils.o deleted file mode 100644 index 74670709cc74f02475f1c6c05ac4403bb067de43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Thu, 25 Apr 2024 08:52:01 +0800 Subject: [PATCH 06/24] Create readme.md --- lab3_asy/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab3_asy/readme.md diff --git a/lab3_asy/readme.md b/lab3_asy/readme.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab3_asy/readme.md @@ -0,0 +1 @@ + From 7f0992051b2c53ca256d5eaa38702c63a90cd622 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:52:43 +0800 Subject: [PATCH 07/24] Add files via upload --- lab3_asy/shell/Makefile | 22 +++ lab3_asy/shell/allocator.c | 20 +++ lab3_asy/shell/allocator.o | Bin 0 -> 1744 bytes lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32753 bytes lab3_asy/shell/cpio.c | 96 +++++++++++ lab3_asy/shell/cpio.o | Bin 0 -> 4768 bytes lab3_asy/shell/dtb.c | 163 ++++++++++++++++++ lab3_asy/shell/dtb.o | Bin 0 -> 4880 bytes lab3_asy/shell/except.c | 150 +++++++++++++++++ lab3_asy/shell/except.o | Bin 0 -> 3552 bytes lab3_asy/shell/header/allocator.h | 7 + lab3_asy/shell/header/cpio.h | 39 +++++ lab3_asy/shell/header/dtb.h | 26 +++ lab3_asy/shell/header/gpio.h | 38 +++++ lab3_asy/shell/header/irq.h | 22 +++ lab3_asy/shell/header/mailbox.h | 38 +++++ lab3_asy/shell/header/reboot.h | 8 + lab3_asy/shell/header/shell.h | 2 + lab3_asy/shell/header/tasklist.h | 21 +++ lab3_asy/shell/header/timer.h | 20 +++ lab3_asy/shell/header/uart.h | 39 +++++ lab3_asy/shell/header/utils.h | 25 +++ lab3_asy/shell/initramfs.cpio | Bin 0 -> 1024 bytes lab3_asy/shell/kernel8.elf | Bin 0 -> 82488 bytes lab3_asy/shell/kernel8.img | Bin 0 -> 12016 bytes lab3_asy/shell/linker.ld | 44 +++++ lab3_asy/shell/mailbox.c | 51 ++++++ lab3_asy/shell/mailbox.o | Bin 0 -> 2064 bytes lab3_asy/shell/main.c | 81 +++++++++ lab3_asy/shell/main.o | Bin 0 -> 3808 bytes lab3_asy/shell/reboot.c | 16 ++ lab3_asy/shell/reboot.o | Bin 0 -> 1496 bytes lab3_asy/shell/rootfs/file1.txt | 1 + lab3_asy/shell/rootfs/one.img | Bin 0 -> 16 bytes lab3_asy/shell/rootfs/pack.sh | 2 + lab3_asy/shell/rootfs/thisisfile2.txt | 1 + lab3_asy/shell/shell.c | 141 ++++++++++++++++ lab3_asy/shell/shell.o | Bin 0 -> 7216 bytes lab3_asy/shell/start.S | 163 ++++++++++++++++++ lab3_asy/shell/start.o | Bin 0 -> 7632 bytes lab3_asy/shell/tasklist.c | 67 ++++++++ lab3_asy/shell/tasklist.o | Bin 0 -> 2400 bytes lab3_asy/shell/timer.c | 102 ++++++++++++ lab3_asy/shell/timer.o | Bin 0 -> 3064 bytes lab3_asy/shell/uart.c | 209 ++++++++++++++++++++++++ lab3_asy/shell/uart.o | Bin 0 -> 3856 bytes lab3_asy/shell/userprogram/Makefile | 11 ++ lab3_asy/shell/userprogram/linker.ld | 19 +++ lab3_asy/shell/userprogram/one.S | 7 + lab3_asy/shell/userprogram/one.elf | Bin 0 -> 66352 bytes lab3_asy/shell/userprogram/one.img | Bin 0 -> 16 bytes lab3_asy/shell/userprogram/one.o | Bin 0 -> 728 bytes lab3_asy/shell/utils.c | 63 +++++++ lab3_asy/shell/utils.o | Bin 0 -> 2320 bytes 54 files changed, 1714 insertions(+) create mode 100644 lab3_asy/shell/Makefile create mode 100644 lab3_asy/shell/allocator.c create mode 100644 lab3_asy/shell/allocator.o create mode 100644 lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab3_asy/shell/cpio.c create mode 100644 lab3_asy/shell/cpio.o create mode 100644 lab3_asy/shell/dtb.c create mode 100644 lab3_asy/shell/dtb.o create mode 100644 lab3_asy/shell/except.c create mode 100644 lab3_asy/shell/except.o create mode 100644 lab3_asy/shell/header/allocator.h create mode 100644 lab3_asy/shell/header/cpio.h create mode 100644 lab3_asy/shell/header/dtb.h create mode 100644 lab3_asy/shell/header/gpio.h create mode 100644 lab3_asy/shell/header/irq.h create mode 100644 lab3_asy/shell/header/mailbox.h create mode 100644 lab3_asy/shell/header/reboot.h create mode 100644 lab3_asy/shell/header/shell.h create mode 100644 lab3_asy/shell/header/tasklist.h create mode 100644 lab3_asy/shell/header/timer.h create mode 100644 lab3_asy/shell/header/uart.h create mode 100644 lab3_asy/shell/header/utils.h create mode 100644 lab3_asy/shell/initramfs.cpio create mode 100644 lab3_asy/shell/kernel8.elf create mode 100644 lab3_asy/shell/kernel8.img create mode 100644 lab3_asy/shell/linker.ld create mode 100644 lab3_asy/shell/mailbox.c create mode 100644 lab3_asy/shell/mailbox.o create mode 100644 lab3_asy/shell/main.c create mode 100644 lab3_asy/shell/main.o create mode 100644 lab3_asy/shell/reboot.c create mode 100644 lab3_asy/shell/reboot.o create mode 100644 lab3_asy/shell/rootfs/file1.txt create mode 100644 lab3_asy/shell/rootfs/one.img create mode 100644 lab3_asy/shell/rootfs/pack.sh create mode 100644 lab3_asy/shell/rootfs/thisisfile2.txt create mode 100644 lab3_asy/shell/shell.c create mode 100644 lab3_asy/shell/shell.o create mode 100644 lab3_asy/shell/start.S create mode 100644 lab3_asy/shell/start.o create mode 100644 lab3_asy/shell/tasklist.c create mode 100644 lab3_asy/shell/tasklist.o create mode 100644 lab3_asy/shell/timer.c create mode 100644 lab3_asy/shell/timer.o create mode 100644 lab3_asy/shell/uart.c create mode 100644 lab3_asy/shell/uart.o create mode 100644 lab3_asy/shell/userprogram/Makefile create mode 100644 lab3_asy/shell/userprogram/linker.ld create mode 100644 lab3_asy/shell/userprogram/one.S create mode 100644 lab3_asy/shell/userprogram/one.elf create mode 100644 lab3_asy/shell/userprogram/one.img create mode 100644 lab3_asy/shell/userprogram/one.o create mode 100644 lab3_asy/shell/utils.c create mode 100644 lab3_asy/shell/utils.o diff --git a/lab3_asy/shell/Makefile b/lab3_asy/shell/Makefile new file mode 100644 index 000000000..beea4a7b2 --- /dev/null +++ b/lab3_asy/shell/Makefile @@ -0,0 +1,22 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include +CFLAGS += -I /usr/aarch64-linux-gnu/include +all: kernel8.img + +start.o: start.S + aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o + +%.o: %.c + aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf + aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab3_asy/shell/allocator.c b/lab3_asy/shell/allocator.c new file mode 100644 index 000000000..4ca648ee9 --- /dev/null +++ b/lab3_asy/shell/allocator.c @@ -0,0 +1,20 @@ +#include "header/allocator.h" +#include "header/utils.h" + +#define SIMPLE_MALLOC_BUFFER_SIZE 8192 +static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; +static unsigned long simple_malloc_offset = 0; + +void* simple_malloc(unsigned long size){ + //align to 8 bytes + utils_align(&size,8); + + if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { + //Not enough space left + return (void*) 0; + } + void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; + simple_malloc_offset += size; + + return allocated; +} diff --git a/lab3_asy/shell/allocator.o b/lab3_asy/shell/allocator.o new file mode 100644 index 0000000000000000000000000000000000000000..42047e4bff9d5a846fec68d6bb675751e99ff9b2 GIT binary patch literal 1744 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 OPqI~*e!TdI|Nj8Si!WyY literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/cpio.c b/lab3_asy/shell/cpio.c new file mode 100644 index 000000000..a38879c9c --- /dev/null +++ b/lab3_asy/shell/cpio.c @@ -0,0 +1,96 @@ +#include "header/cpio.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/allocator.h" + +int file_num = 0; +struct file *f = NULL; + +void allocate_file_array() { + if (f == NULL) { + f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); + if (f == NULL) { + uart_send_string("Memory allocation error\n"); + // Handle memory allocation error + } + } +} + +void traverse_file() +{ + allocate_file_array(); + char* addr = (char *)cpio_addr; + + + while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ + + struct cpio_header *header = (struct cpio_header *)addr; + unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); + unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; + unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); + + utils_align(&headerPathname_size, 4); + utils_align(&file_size, 4); + + f[file_num].file_header = header; + f[file_num].filename_size = filename_size; + f[file_num].headerPathname_size = headerPathname_size; + f[file_num].file_size = file_size; + f[file_num].file_content_head = (char*) header + headerPathname_size; + + addr += (headerPathname_size + file_size); + file_num += 1; + } +} + +int findfile(char* filename) { + for(int n=0;n<=file_num;n++) { + if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ + return n; + } + } + return -1; +} + +void cpio_ls() +{ + for(int n=0;n<=file_num;n++) { + uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); + uart_send_string("\n"); + } +} + + +void cpio_cat(char *filename) +{ + int targetfile_num = findfile(filename); + + if(targetfile_num != -1) { + for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) + { + uart_send_char(f[targetfile_num].file_content_head[i]); + } + uart_send_string("\n"); + + } else { + uart_send_string("Can not Find the file\n"); + } + +} + +void cpio_exec_program(char* filename) { + int targetfile_num = findfile(filename); + + char* target = (char*) 0x20000; + for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/dtb.c b/lab3_asy/shell/dtb.c new file mode 100644 index 000000000..523dac1d4 --- /dev/null +++ b/lab3_asy/shell/dtb.c @@ -0,0 +1,163 @@ +#include "header/dtb.h" +#include "header/uart.h" +#include "header/utils.h" +#define UNUSED(x) (void)(x) + + +char* cpio_addr; +int space = 0; +//1. Define the callback function type(fdt_callback) +//2. Create a structure for holding the FDT header information(fdt_header) +//3. Implement helper functions to extract the FDT header information + +uint32_t fdt_u32_le2be (const void *addr) { + const uint8_t *bytes = (const uint8_t *) addr; + uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; + return ret; +} + +void send_space(int n) { + while(n--) uart_send_string(" "); +} + +int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { + uintptr_t end_ptr = cur_ptr + totalsize; + + while(cur_ptr < end_ptr) { + + uint32_t token = fdt_u32_le2be((char *)cur_ptr); + cur_ptr += 4; + + switch(token){ + case FDT_BEGIN_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. + Node name (variable length, NULL-terminated): Specifies the name of the node being opened. + */ + //uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char*)cur_ptr,NULL,0); + cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); + break; + case FDT_END_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_END_NODE token. + */ + //uart_send_string("In FDT_END_NODE;\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_PROP: { + + /* + Token type (4 bytes): Indicates that it's an FDT_PROP token. + Data length (4 bytes): Specifies the length of the property data (len). + Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). + Property data (variable length): Contains the property data itself, the size of which is determined by len. + */ + //uart_send_string("In FDT_PROP \n"); + uint32_t len = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + //second parameter name here is property name not node name + cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); + cur_ptr += utils_align_up(len,4); + break; + + } + case FDT_NOP: + //uart_send_string("In FDT_NOP\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_END: + //uart_send_string("In FDT_END\n"); + cb(token,NULL,NULL,0); + return 0; + default:; + return -1; + } + } + return -1; + +} +//4. Implement the fdt_traverse function: + +int fdt_traverse(fdt_callback cb,void * _dtb){ + uintptr_t dtb_ptr = (uintptr_t) _dtb; + uart_send_string("\ndtb loading at: "); + uart_hex(dtb_ptr); + // uart_send_char('\n'); + uart_send_string("\r\n"); + struct fdt_header* header = (struct fdt_header*) dtb_ptr; + + uint32_t magic = fdt_u32_le2be(&(header->magic)); + + if (magic != 0xd00dfeed){ + + uart_send_string("The header magic is wrong\n"); + return -1; + } + + /* + +-----------------+ + | fdt_header | <- dtb_ptr + +-----------------+ + | reserved memory | + +-----------------+ + | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) + +-----------------+ + | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) + +-----------------+ + */ + + uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); + uint32_t totalsize = fdt_u32_le2be(&header->totalsize); + parse_struct(cb, struct_ptr,strings_ptr,totalsize); + return 1; + +} + +//5. Implement the initramfs_callback function: +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ + UNUSED(size); + if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ + cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); + uart_send_string("cpio address is at: "); + uart_hex((uintptr_t)fdt_u32_le2be(data)); + // uart_send_char('\n'); + uart_send_string("\r\n"); + } +} + +//6. Implement print_dtb callback function: + +void print_dtb(int token, const char* name, const void* data, uint32_t size) { + UNUSED(data); + UNUSED(size); + + switch(token){ + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_space(space); + uart_send_string((char*)name); + uart_send_string("{\n "); + space++; + break; + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if(space >0) send_space(space); + uart_send_string("}\n"); + break; + case FDT_NOP: + break; + case FDT_PROP: + send_space(space); + uart_send_string((char*)name); + break; + case FDT_END: + break; + } +} diff --git a/lab3_asy/shell/dtb.o b/lab3_asy/shell/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9 GIT binary patch literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/except.c b/lab3_asy/shell/except.c new file mode 100644 index 000000000..ac41a8cf8 --- /dev/null +++ b/lab3_asy/shell/except.c @@ -0,0 +1,150 @@ + +#include "header/uart.h" +#include "header/irq.h" +#include "header/shell.h" +#include "header/timer.h" +#include "header/tasklist.h" +#include "header/utils.h" + +#define CNTPSIRQ_BIT_POSITION 0x02 +#define AUXINIT_BIT_POSTION 1<<29 + + +void except_handler_c() { + uart_send_string("In Exception handle\n"); + + //read spsr_el1 + unsigned long long spsr_el1 = 0; + asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); + uart_send_string("spsr_el1: "); + uart_hex(spsr_el1); + uart_send_string("\n"); + + //read elr_el1 + unsigned long long elr_el1 = 0; + asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); + uart_send_string("elr_el1: "); + uart_hex(elr_el1); + uart_send_string("\n"); + + //esr_el1 + unsigned long long esr_el1 = 0; + asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); + uart_hex(esr_el1); + uart_send_string("\n"); + + //ec + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + uart_send_string("ec: "); + uart_hex(ec); + uart_send_string("\n"); + + + while(1){ + + } + +} + +void timer_irq_handler() { + //enable core_0_timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + // Disable interrupts to protect critical section + asm volatile("msr DAIFSet, 0xf"); + + uint64_t current_time; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + + while(timer_head && timer_head->expiry <= current_time) { + timer_t *timer = timer_head; + + //Execute the callback + timer->callback(timer->data); + + // Remove timer from the list + timer_head = timer->next; + if (timer_head) { + timer_head->prev = NULL; + } + + //free timer + + // Reprogram the hardware timer if there are still timers left + if(timer_head) { + asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } else { + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + } + + + //enable interrupt + asm volatile("msr DAIFClr,0xf"); + } + +} + +void uart_irq_handler(){ + // uart_send_string("in uart_irq_handler\n"); + ///uart_hex(uart_write_index); + ///uart_hex(uart_write_head); + ///uart_send_string("\r\n"); + uint32_t iir = mmio_read(AUX_MU_IIR); + + // Check if it is a receive interrupt + if ((iir & 0x06) == 0x04) { + // Read data(8 bytes) and store it in the read buffer + // uart_send_string("in uart_irq_handler_receive\n"); + char data = mmio_read(AUX_MU_IO) & 0xff; + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + // Enable tx interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); + } + + // Check if it is a transmit interrupt + if ((iir & 0x06) == 0x02) { + // uart_send_string("in uart_irq_handler_transmit\n"); + // Send data from the write buffer + if (uart_write_head != uart_write_index) { + /// uart_send_string("in uart_irq_handler_trans_!=\n"); + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + // uart_write_head ++; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + } + else + { + // uart_send_string("in uart_irq_handler_trans_else\n"); + // Disable tx interrupt when there is no data left to send + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + + /* + if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n'){ + uart_read_buffer[uart_read_index-1] = '\0'; + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + // parse_command(uart_read_buffer); + // uart_write_index = 0; + } + */ + } + } + // uart_send_string("out uart_irq_handler\n"); +} + + diff --git a/lab3_asy/shell/except.o b/lab3_asy/shell/except.o new file mode 100644 index 0000000000000000000000000000000000000000..3848a48b50b81e28cc33404b08346c70d215faf9 GIT binary patch literal 3552 zcmbW3UuauZ9LImjO}k9H+NQ0_GM1ZBwF7r)YTd#n?Dn7SWGb|sC==5(xiw*J+TPq^ zW@UCTP>K&Njr!u|6vRb*7&y_wlp#g>B1kp$Ne$wgFLPszfVKX9_nu>ayG=y)gVS@) z=X`(PbM8Io-y@#c_+ z`uQe3T9lmnC8g<;CP$agdSQ|J#5=d?nr$w}n+K!Cl5!{GzH?`G4@rNju{3YYUM+b1 zb88;BbVIJG8|DT9%dL~%!ajgy^|xU0*JqXD)^&sr=sSQ41y#a!DTbJLjf2KK*29_PUR;B=s%t6n|tyP)(gdGmBP9>o$Rj&Yg(bk*zU{TFsT zwN#t0dE57n(*Lgaxu1G|`MJ3M!;kgO94XRa_{iWtf`)zY=Vm2|Qt@U29u?fp3ZbA= zrBDEO+!fAy-OhK}y2^`IV28^^?vEevPHhVX@HSNl1@IKQg7ziAp4Z+7WMM3F&v;5l z6@COc`N({GzmVZwsOa;&(D#Z*miv{iqCZ`Q&sX8^RpFmj;b7ReLQ6nv5?XVj8*^@m z8B4%S+_Yj@Ba@6}Ei;{Y*#Rjd2UdE*Fk@+RTB-#}8S$i};$ybYD`wgNcOAtt)Tn8NN00X~yFflc^6`RS4;p~c1Jxd|e7&K{az(4C}^KJtF5HU*GA zlD7)(_My8=A${7MF0_l9^mt|ejZV>${!;&h;BNn3!KJ_S9dP+be!Pm$FynkZFEY;G zPl|D_pJJTrEy3kFbT0XDjuLfWV?Ofik)8cRk2U#l{w345uz9aC&i$`3em~Q%FwXr~ z1*dtr|M!e@{}SWe|2pH`U*4k{9QU&I$nz|DUW|>4TJm1u3tIN{gcTpf+A^IwC0nL3 z9@i`*XMvWCTXE1vvsuv0N$QY1qD4VVOioM~8I)uuEko;n=EQ-l6;GT(9c3G-*q9lg zFxU$3uBl=gE!q8r(UDOM@Rxvne)ecQh{cCR$HHSo7%qrUFMU609={OD-=T*EcYmSZ zbj>T$Y!BI{ntrdy^KSDam`m%T?;{U6e;tRtg#I~E?_iS^U^c*s0iAHzY} z=DPC#eEye2{x-RIA@cW1ddv08{tMWsw13xkI*I`yr2V5@nJ@Q`*1m0SWH~W^n;5(o nSzU#En#R3%h~T357=A?^7VdY|h+~!Vqs~8UkYc&ibm#vAJTZzg literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/header/allocator.h b/lab3_asy/shell/header/allocator.h new file mode 100644 index 000000000..56f46666f --- /dev/null +++ b/lab3_asy/shell/header/allocator.h @@ -0,0 +1,7 @@ +#ifndef ALLOCATOR_H +#define ALLOCATOR_H + + +void* simple_malloc(unsigned long size); + +#endif diff --git a/lab3_asy/shell/header/cpio.h b/lab3_asy/shell/header/cpio.h new file mode 100644 index 000000000..be0e36b9f --- /dev/null +++ b/lab3_asy/shell/header/cpio.h @@ -0,0 +1,39 @@ +//#define QEMU_CPIO_ADDR (char *)0x8000000; //qemu +//#define RASP_CPIO_ADDR (char *)0x20000000;//rasperrypi + +#define MAX_FILE_NUM 10 + +extern char* cpio_addr; + +void traverse_file(); +void cpio_ls(); +void cpio_cat(char* filename); +void cpio_exec_program(char* filename); + +struct cpio_header { + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; //determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; //determine when two entries refer to the same file. + char c_mode[8]; //specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +}; + + +struct file { + struct cpio_header* file_header; + unsigned long filename_size; + unsigned long headerPathname_size; + unsigned long file_size; + char* file_content_head; +}; + diff --git a/lab3_asy/shell/header/dtb.h b/lab3_asy/shell/header/dtb.h new file mode 100644 index 000000000..16af25520 --- /dev/null +++ b/lab3_asy/shell/header/dtb.h @@ -0,0 +1,26 @@ +#include +// #include +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); + +struct __attribute__((packed)) fdt_header { + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +}; + +int fdt_traverse(fdt_callback cb,void *dtb_ptr); +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); +void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab3_asy/shell/header/gpio.h b/lab3_asy/shell/header/gpio.h new file mode 100644 index 000000000..38ca70635 --- /dev/null +++ b/lab3_asy/shell/header/gpio.h @@ -0,0 +1,38 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +//Page 90, Physical/bus addr diff +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + + +// Helper function to write data to a memory-mapped I/O address +static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { + *reg = data; +} + +// Helper function to read data from a memory-mapped I/O address +static inline uint32_t mmio_read(volatile uint32_t* reg) { + return *reg; +} + +#endif diff --git a/lab3_asy/shell/header/irq.h b/lab3_asy/shell/header/irq.h new file mode 100644 index 000000000..9085cb30c --- /dev/null +++ b/lab3_asy/shell/header/irq.h @@ -0,0 +1,22 @@ +#ifndef IRQ_H +#define IRQ_H + +#include "gpio.h" + + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) + + +#endif + diff --git a/lab3_asy/shell/header/mailbox.h b/lab3_asy/shell/header/mailbox.h new file mode 100644 index 000000000..d13ac3ce9 --- /dev/null +++ b/lab3_asy/shell/header/mailbox.h @@ -0,0 +1,38 @@ +#include "gpio.h" + +extern volatile unsigned int mailbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_GETBOARD 0x00010002 +#define MBOX_TAG_GETARMMEM 0x00010005 +#define MBOX_TAG_LAST 0x00000000 + +int mailbox_call(); +void get_board_revision(); +void get_arm_mem(); + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 diff --git a/lab3_asy/shell/header/reboot.h b/lab3_asy/shell/header/reboot.h new file mode 100644 index 000000000..e1d44aa1b --- /dev/null +++ b/lab3_asy/shell/header/reboot.h @@ -0,0 +1,8 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); diff --git a/lab3_asy/shell/header/shell.h b/lab3_asy/shell/header/shell.h new file mode 100644 index 000000000..9784c1ccb --- /dev/null +++ b/lab3_asy/shell/header/shell.h @@ -0,0 +1,2 @@ +void shell(); +void parse_command(char* buffer); diff --git a/lab3_asy/shell/header/tasklist.h b/lab3_asy/shell/header/tasklist.h new file mode 100644 index 000000000..de876b84c --- /dev/null +++ b/lab3_asy/shell/header/tasklist.h @@ -0,0 +1,21 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +// #include +#include + +typedef void (*task_callback)(); + +typedef struct task { + struct task *prev; + struct task *next; + task_callback callback; + uint64_t priority; +} task_t; + +void execute_tasks(); +void create_task(task_callback callback,uint64_t priority); +void enqueue_task(task_t *new_task); +extern task_t *task_head; + +#endif diff --git a/lab3_asy/shell/header/timer.h b/lab3_asy/shell/header/timer.h new file mode 100644 index 000000000..a9a8c65da --- /dev/null +++ b/lab3_asy/shell/header/timer.h @@ -0,0 +1,20 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +// #include + +typedef void (*timer_callback)(void *data); + +typedef struct timer { + struct timer *prev; // previous timer in the list + struct timer *next; // next timer in the list + timer_callback callback; // the function to call when the timer expires + void *data; // data to be passed to the callback + uint64_t expiry; // the time at which the timer will expire +} timer_t; + +extern timer_t *timer_head; // head of the timer list + +void setTimeout(char *message,uint64_t seconds); +#endif diff --git a/lab3_asy/shell/header/uart.h b/lab3_asy/shell/header/uart.h new file mode 100644 index 000000000..0c3ff1bd8 --- /dev/null +++ b/lab3_asy/shell/header/uart.h @@ -0,0 +1,39 @@ +#ifndef UART_H +#define UART_H + +#include "gpio.h" +#include +#define UART_BUFFER_SIZE 1024 + +void uart_init(); +void uart_send_char(unsigned int c); +char uart_get_char(); +void uart_send_string(char* s); +void uart_hex(unsigned long long d); +void uart_enable_interrupt(); +int uart_async_read(char *buffer); +void uart_async_write(const char *buffer, int length); +void uart_async_send(const char *str); + + +extern char uart_read_buffer[UART_BUFFER_SIZE]; +extern char uart_write_buffer[UART_BUFFER_SIZE]; +extern int uart_read_index; +extern int uart_read_head; +extern int uart_write_index; +extern int uart_write_head; + +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +#endif diff --git a/lab3_asy/shell/header/utils.h b/lab3_asy/shell/header/utils.h new file mode 100644 index 000000000..3ba6dd719 --- /dev/null +++ b/lab3_asy/shell/header/utils.h @@ -0,0 +1,25 @@ +#include +// #include + +#define nop asm volatile("nop") + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + + +int utils_string_compare(const char* i, const char* j); +unsigned long utils_atoi(const char *s, int char_size); +void utils_align(void *size, unsigned int s); +uint32_t utils_align_up(uint32_t size, int alignment); +size_t utils_strlen(const char *s); +char *utils_strcpy(char* dst, const char *src); +char *utils_strdup(const char *src); diff --git a/lab3_asy/shell/initramfs.cpio b/lab3_asy/shell/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..faf47b52fd58348135f4805c9dad3157d9e67fb3 GIT binary patch literal 1024 zcmdT?QBH$E5Z&lsFW{%c0bF-sS>VS6D5fTUHN8NCP&T&E013u;Og(@n!5wS?6Ak=2 z*)Z9emwAtQ%N*t~&KQ$?8H74B!K0;47PBI6l(EI75P=L?hr3TNiU&1`s zDA8;KAM!Al`$DI`_#D^oU>d@^IWzctoQsjFeZpz|Qj<-lD$oZjP~-_+kU@*-%X`!? zr6rJzpJwCAX8pU{0rdw-)nP{n`Ajd~ui^5eZQCn-9dy{CDKH>8;9DU2YF)MX|jY?+f2b$2*~O!yH4)fw!Ie3z6^saG_$e_uFaDh9GC`c_v#{tX}E$c*tH}`Z4LRB1HTNVw>!-DQhlUotT}V6LL?5F412k#Ik=~}%00n0p`4sM~Z}-t5 zpZ`Cy<0yUN5>NW&sowN&%Y5nAuJWgUcWpuX^(BSr-&c=IpITLve)HDx>9=m5kbXOK zQF?Iw#PqxE7pLF9`(x>In<;mufOcfZ1tFsbGHM}XIb_@j87m-TC1k9EjGG|i(~$8Q z$oMQ|tcHx6A>$Uv2?s50atj6$0}=xg0}=y&sTi1kZfNRXO4s@H zynFV->VM$^>woeB>)&;O_5aNU)_?B>*1zlm>z{ss^G10(Mv=M^lUWuLx? zawSBk!uPJqrEmsu`l4WNn14ZP;MYS#JHz*m%LRvq9_Kbl*w5{hz1qF8fJ$v`adz`h zl)N*a_ogp}yk5vVeVZr!PSlqU7t&+gZwl@~pT|AgFw3R-Rk?R&dfXBU=E{gl-@qAz z_X&^tmXG?_@9+!co|s9wS3y4kS~sQYvc743C$6Gg0q_5PQx(mN_wSv!-t`us{gNBg z-9^FvN1*#EKTQhUQ~vED^7X9qQqNvs^~0vXV8UC}Q=g*rgGJQ8{F|Qiao?1_@RJ@l z13j!4x@L#J|AVpVfE*lWzf&USJZ=4L#0&F%};5|0kTo zjNtLpF?c)<8{dW>j7jf=V1LRxxTF+gQv$yb3Z;8NOBB+i5S46r)I;@qy}=yY7Hmom z?$}E%0h^uBkvTV1ne~;-wzi$!{EV^-aweaT{!#X@9YNT^<8pNGESGJwHuXY3+e4%D zAM!KqQ~I96llzvz)}Nmns?WEDb)Mb)kHh{${;4DI|DDSz_YN@NzEm){g!RGh0q7jT z0KV?_dN;i8(-`c44aYIo!KTC@WAHhH0o%v@Jm^nU(&L>N%r$rrXT`xB_o1dp)z@HW z2C;D5S32ABRFn7QOU7m%J04%^odw%C?ho$!Yd@8;Kf`UAk+!d(Z3NE||9D*4Hypy9 zIs-pP`^COyXmBwM&|_@;`&a*H|9G6We^=NshTS#PJK#0``QYDu@XrVTvOZ5=z)x

    ?%dE$s+p$F2JN_6-#K5L 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 literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/kernel8.img b/lab3_asy/shell/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..dd873cef73e7411e86bb78f21eb7e5bec3557803 GIT binary patch literal 12016 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 Jzr)Cy_+RmLk2(MV literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/linker.ld b/lab3_asy/shell/linker.ld new file mode 100644 index 000000000..5018defb6 --- /dev/null +++ b/lab3_asy/shell/linker.ld @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/mailbox.c b/lab3_asy/shell/mailbox.c new file mode 100644 index 000000000..7e0c5d99c --- /dev/null +++ b/lab3_asy/shell/mailbox.c @@ -0,0 +1,51 @@ +#include "header/mailbox.h" + +volatile unsigned int __attribute__((aligned(16))) mailbox[36]; + +int mailbox_call() +{ + unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ){ + /* is it a valid successful response? */ + if(mailbox[1] == MBOX_RESPONSE) + return 1; + } + } + return 0; +} + +void get_board_revision(){ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} + +void get_arm_mem(){ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} diff --git a/lab3_asy/shell/mailbox.o b/lab3_asy/shell/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2118f241e7cf5768d3e64c641e7118db6261bc GIT binary patch literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/main.c b/lab3_asy/shell/main.c new file mode 100644 index 000000000..09914b45e --- /dev/null +++ b/lab3_asy/shell/main.c @@ -0,0 +1,81 @@ +#include "header/uart.h" +#include "header/shell.h" +#include "header/dtb.h" +#include "header/utils.h" +#include "header/cpio.h" +#include "header/timer.h" + +void test_read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + uart_send_string("\r\n"); + break; + } + else + { + uart_send_char(buffer[index]); + } + index++; + } +} + +extern void *_dtb_ptr; +void main() +{ + + uart_init(); + // pre test ////////////////////////// + char buffer[256]; + while(1) + { + uart_send_string("# "); + test_read_command(buffer); + char * input_string = buffer; + if(utils_string_compare(input_string,"in")) + { + break; + } + else + { + // uart_send_hex((uintptr_t) _dtb_addr); + uart_send_string("The instruct is not exist.\n"); + } + } + ///////////////////////////////////////// + + // set up serial console + uart_init(); + + unsigned long el = 0; + asm volatile ("mrs %0, CurrentEL":"=r"(el)); + uart_send_string("Current exception level: "); + uart_hex(el>>2); // CurrentEL store el level at [3:2] + uart_send_string("\r\n"); + + asm volatile("mov %0, sp"::"r"(el)); + uart_send_string("Current stack pointer address: "); + uart_hex(el); + uart_send_string("\r\n"); + + // say hello + fdt_traverse(get_cpio_addr,_dtb_ptr); + traverse_file(); + uart_send_string("Type in `help` to get instruction menu!\n"); + + uart_enable_interrupt(); + + shell(); + /* + while(1){ + asm volatile("nop"); + } + */ + //echo everything back + //shell(); +} + + diff --git a/lab3_asy/shell/main.o b/lab3_asy/shell/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c24ccc3615da8925de5fe98829cd15e359d31223 GIT binary patch literal 3808 zcmbuBUu+ab7{I@~Ed*;Rwf`uzk;PUlMAjB-Jcx#)1$iMvZAnbPY`1q)x_I3?cK1lJ zMr-1mFRh%42_Pgsa8(l?OnfoMs4pfy5TR8QA=UW6gAbb0)F#&YeY^7=&CIv6bMxAvBhSQRF<^@z=7n56mMKO`R#Icfb0J- zSpU-Tc(E1NvosK!nUBNFa!M<O9?wAe1vsl+gMzi3Uf!>y1gVE*=F{$iLv6Z5yAwa#8S)t4ZHSUtCTN6jwTvE31=pSHIBAc{n^UuutzkHj;Pzyx!Yu^cg+7d-FlF_tian zjGn%o5@Q&EhTsVhd--{&nRqbPUbhW&WSHAPhUj^qUcXp#N$WosFT|d^ee1@}dgw#^ zRA2$nLmT=){q^|8U6*$DzrEv~hY!Bnb-we^dk+nq>n=R<%I#Y}e*eSVJh@dB3Q+@p ztW`45Dt<8l8vZJYhLI|X2J6c3hJcjw@N=YDm5T=J%V20<&dE@N`^xOYacjemG199+ zZG?nP4MH!qlTzBK?Im;Dc_n4RfGwqLu|_h&3=Ud1pYy@Pqcwxe3xvPpcHGLF7-HQab>ixN;BUGKx%yQc zl=dwV{;cF%kv|}Hs_LX3jngc7G!D;)?Rlr`kvKfpu1FlV?~ZV`?}^0WywEvD!t-Iy zd7%6>g(kuCh}4Oz>wQ7tYMxIhoaaJ__BTm1&UAs8IQ>zx{4SM5#Qv_rRr|jrr}x#yL8!(y330r8l%z&-&clT4*&sRRfq9)0M_pHg z!nc;9<0VGn?F#RZ`a0~#dtynFQX|gaN`MUS?6_}@fPu$SSdX#hii~CWV!{U_ZTS`$ zBc2C_o23Ss_ZkUovJnzI8}m6Z=&Zy$A{cmi6vpAB$94y|L1`<-%u&}G7p1BFFGWXh zN=5XaH;Ig7D6C4)hLRR4l)D-%$*@^^PRW3!_k%q&4(E>dzz)fyH<3aq(!Ujop~|D! zpqT&FzZZQe<{m7noR^I&Dny;<&+|BhjP$bnNdx}B=P=RyC9$JY{{H0r$%WO)F?f8= zAKfEps2(h;Q6Vz=-xpD*W{n~H`Guhx_&xqD*0cQ^QZfn IDpCJ`0Q9AH_y7O^ literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/reboot.c b/lab3_asy/shell/reboot.c new file mode 100644 index 000000000..048f2d348 --- /dev/null +++ b/lab3_asy/shell/reboot.c @@ -0,0 +1,16 @@ +#include "header/reboot.h" + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab3_asy/shell/reboot.o b/lab3_asy/shell/reboot.o new file mode 100644 index 0000000000000000000000000000000000000000..dda9e282580625dcaef2ab81c697421da43712d2 GIT binary patch literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/rootfs/file1.txt b/lab3_asy/shell/rootfs/file1.txt new file mode 100644 index 000000000..5c275ef57 --- /dev/null +++ b/lab3_asy/shell/rootfs/file1.txt @@ -0,0 +1 @@ +This is file one. diff --git a/lab3_asy/shell/rootfs/one.img b/lab3_asy/shell/rootfs/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/rootfs/pack.sh b/lab3_asy/shell/rootfs/pack.sh new file mode 100644 index 000000000..d837d685d --- /dev/null +++ b/lab3_asy/shell/rootfs/pack.sh @@ -0,0 +1,2 @@ +find . | cpio -o -H newc > ../initramfs.cpio + diff --git a/lab3_asy/shell/rootfs/thisisfile2.txt b/lab3_asy/shell/rootfs/thisisfile2.txt new file mode 100644 index 000000000..0a8a2c0d7 --- /dev/null +++ b/lab3_asy/shell/rootfs/thisisfile2.txt @@ -0,0 +1 @@ +Here is file two with longer size. diff --git a/lab3_asy/shell/shell.c b/lab3_asy/shell/shell.c new file mode 100644 index 000000000..c7d0d2bd9 --- /dev/null +++ b/lab3_asy/shell/shell.c @@ -0,0 +1,141 @@ +#include "header/shell.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/mailbox.h" +#include "header/reboot.h" +#include "header/cpio.h" +#include "header/allocator.h" +#include "header/dtb.h" +#include "header/irq.h" +#include "header/timer.h" +#define BUFFER_MAX_SIZE 256u + + +extern void *_dtb_ptr; + +void async_read_command(char* buffer) { + int index = 0; + char tmp[1]; + + while (1) { + if (uart_async_read(tmp) > 0) { + buffer[index] = tmp[0]; + // uart_send_char(tmp[0]); + if (tmp[0] == '\r' || tmp[0] == '\n' || tmp[0] == '\0') { + buffer[index] = '\0'; + break; + } + index++; + } + } + // uart_send_string("out read_commandppppppppppppppp\n"); +} + + +void parse_command(char* buffer){ + // uart_send_string("in parse command\n"); + char* input_string = buffer; + char* parameter[5]; //5 is the available parameter length + int para_idx = 0; + int input_string_len = utils_strlen(input_string); + for(int i=0; i < input_string_len; i++){ + if(*(input_string+i) == ' '){ + *(input_string+i) = '\0'; + parameter[para_idx++] = (input_string+i+1); + } + } + + if(utils_string_compare(input_string,"help")) { + uart_async_send("help :print this help menu\n"); + uart_async_send("hello :print Hello World!\n"); + uart_async_send("info :Get the hardware's information\n"); + uart_async_send("reboot :reboot the device\n"); + uart_async_send("ls :list the file\n"); + uart_async_send("cat :print file content\n"); + uart_async_send("malloc :give dynamic memory space\n"); + uart_async_send("dtb :print device tree\n"); + uart_async_send("exec :execute user program\n"); + } else if (utils_string_compare(input_string,"hello")) { + // uart_send_string("Hello World!\n"); + uart_async_send("Hello World!\n"); + } else if (utils_string_compare(input_string,"info")) { + get_board_revision(); + uart_async_send("My board revision is: "); + uart_hex(mailbox[5]); + uart_async_send("\n"); + get_arm_mem(); + uart_async_send("My ARM memory base address is: "); + uart_hex(mailbox[5]); + uart_async_send("\n"); + uart_async_send("My ARM memory size is: "); + uart_hex(mailbox[6]); + uart_async_send("\n"); + } else if (utils_string_compare(input_string,"reboot")) { + uart_async_send("Rebooting....\n"); + reset(1000); + } else if (utils_string_compare(input_string,"ls")) { + cpio_ls(); + } else if (utils_string_compare(input_string,"cat")){ + //uart_send_string("Filename: "); + //char filename[BUFFER_MAX_SIZE]; + //read_command(filename); + //cpio_cat(filename); + cpio_cat(parameter[0]); + } else if (utils_string_compare(input_string,"malloc")){ + char *a = simple_malloc(sizeof("9876")); + char *b = simple_malloc(sizeof("345")); + a[0] = '9'; + a[1] = '8'; + a[2] = '7'; + a[3] = '6'; + a[4] = '\0'; + b[0] = '3'; + b[1] = '4'; + b[2] = '5'; + b[3] = '\0'; + uart_async_send(a); + uart_async_send("\n"); + uart_async_send(b); + uart_async_send("\n"); + } else if (utils_string_compare(input_string,"dtb")) { + fdt_traverse(print_dtb,_dtb_ptr); + } else if (utils_string_compare(input_string,"exec")) { + //uart_send_string("Program name: "); + //char buffer[BUFFER_MAX_SIZE]; + //read_command(buffer); + cpio_exec_program(parameter[0]); + } else if (utils_string_compare(input_string,"timer")) { + + setTimeout("hello world1",3); + setTimeout("hello world2",6); + setTimeout("hello world3",9); + + } else if (utils_string_compare(input_string,"settimeout")) { + char *message = (char *)parameter[0]; + size_t second_str_len = utils_strlen(parameter[1]); + uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); + setTimeout(message,seconds); + } else { + uart_async_send("The instruction "); + uart_async_send(input_string); + uart_async_send(" is not exist.\n"); + } + // uart_send_string("out parse command\n"); +} + + +void shell(){ + while(1) { + // uart_send_string("in shell\n"); + char buffer[BUFFER_MAX_SIZE]; + uart_send_string("# "); + async_read_command(buffer); + // uart_send_string("testyyyyyyyyyyyyyyyyyyyyyyy\n"); + parse_command(buffer); + // uart_send_string("out shell\n"); + } + +} + + + diff --git a/lab3_asy/shell/shell.o b/lab3_asy/shell/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..13891dfbc2dc87acae4334f07976b538b934e81c GIT binary patch literal 7216 zcmcJTe`p-X702J{&X#1!j$`eVimcEUO3!4MQW%EQmvLyY9l95WI;;`h1SG>IN-GU!%&erMU*65nnDEiA1ZdhE>_g{ zcHcXVM%q#W9oUVwwxBK!}k3Lru3W1~${2tb7LIIXr*2*!j7=!K52rJ`P zFRz4Q>h|%_<=Y>_)SWQQecA-~o+?lLbgvP9uM%#WL-Xmq0H=Pvx;p&P$FYNzaP!GS?P-hPm=OMF z2z|kMPLh9Z08^xSEeze5PvYg({~u+V8|ki$zcb6@G;i<&p!d`r3qS zx+Zqdse!5T!?7!sFg$_n)3O#+R_z09s&OdqUavvEvHu%<$Ia8NYJ2neet9U!J{E$f z^!bwp^{YHWd%%lR^M4z&QUl#HP=1%@bsP6bnai{n_tpMr$b9wHp}+s}S9YQXuDrYp z4qnqalj`rRu0EpsW}t7xXpZDl8^rDbUX+WkdY>6yPjx=J zO$BvL-|uSN-`48hc%kyUJdW6HSc4hVy7TA$%QByjFb-74z5hJT%da=jsWGMb;I%Fe z)J~koqqgRi@!wSM#b%1Z4`FH=<0mnbF(v;u#t{2K+R7FsukS6|nY?Sb>5OAggORiH zrESzqcG-d$3{b`RX2H&;+Wcn7C?LY_=*D^V!8 z^}T-X8KmO zc{7(uqWigmJ!UvXv#OtR6QbjfYq++BgIJ>$_NL#GYZ)cSvW=o$7_rTqKZG}b^k1Jk zO^@PpY|Ka$aMp&6vvF{;M#kwi0K`FT?;AQM9wki2GR#!Uwj7KQ8Ln@4GG{EG`*8vo z^5T}sk3=z{Xx5=o0WdCJ?#~|p=jYXFCRA`UIm^b}^WS)pmaL1oQa_;8ze07#a;a;f zSiO+S9lf+L6g)Ek*5pJ7O2=F4p#+-#WeJ(9a@6 zAAa!OUvBPz32cf{JEn7C{OQ{TngUk+9OMMLk{tyNZJ&zY9I%Lt0nVJjj7a!|Czi+yYKybqI1|OCGTHVYd z4AiKchPn-mKp3`e;13|# zrOek`cVzqUl0Bk!qD@QoV&|j9kpd~7!E zZv*(10RE={z7W9w7QjCV;P`Oe)XxZRwaxs006DGKGH+e)K0%F#0_?$|6Dpd7_EBh0 zf$5CplX2TJQ}JXWmoxJzD4Dh!U*k|TZO2+`bu(Efj^|a@%0o#icz%)vnp$dq$3nfF znaL&!qcCE*aqlR{;ryfAH%(i9n`!6b_+Y^&8J>}lEM^LEI)uFfp2|)pSIk;*K9A#g z9>?F`Ns=uN^N+ zdoYgM{i65F$F|4m-jZ~c3r%RR-i6nh(|V{}&Nb3k*Om4WCDD;P{ict-btN6)i_A&q zK`vAFK9@zOgXfcbf>d#GutM-e` zW!$q|f1h(1S9m2r=a$0NaqlzN_Yc(glb3O4*shMbj4Qm6xxRmzHJw@3Y0-3qw<xWeZZ9d%t60{CJ8uP~Q!7kJzy z<}$AETZ)dlUU!(&xwKoE?_GuOQMkOS^l0`G{vSwOwcp8{*0EL5X=X0|FJe2TR_5Zr zaD%zNUfqiR7kvruw@1^juzpO_7k)TEe^Ap|Vx3`4NBFlCoktaaPG~xJStq6G2u}y- zjA}Y^j=ZGl2ro0I_^bX*XgV#t-tyih@fSYH_Imth6t4a+eN*B1t+|@6GuQo@XD<7p zgZ;U|T>KHfpy;dj(P99vX!o+vM%zi`E8Oyn50&~~)^R$#~D{DqwYt)5k z%5+VLCL9N%c7ZBn-WBbED7~)XhdPMjS0XEV9}U{duT_!t#te(eq*zE^v|Ce z*cGR`?%jpdV)TQlo#W)!*8le-MrRP2#PCv62M4=_bNZe~$o{&95^pn>==e#DSbxf3rny~QtsP@n7(_v9Q_t#dv`R*pSwb`bvLUKk`Q(o4PFUC$COk pmw{{WKoO~wEK literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/start.S b/lab3_asy/shell/start.S new file mode 100644 index 000000000..4f9f5ba36 --- /dev/null +++ b/lab3_asy/shell/start.S @@ -0,0 +1,163 @@ + +.section ".text.kernel" + +.global _start + + + +_start: + ldr x1, =_dtb_ptr //put _dtb_ptr into register1 + str x0, [x1] //store dtb address from x0 to _dtb_ptr + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + ldr x1, =_start + bl from_el2_to_el1 + mov sp, x1 + + + /* set exception vector table */ + adr x0, exception_vector_table + msr vbar_el1, x0 // vbar -> Vector Base Address Register + + //bl core_timer_enable + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + //bl core_timer_enable + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b + +from_el2_to_el1: + mov x0,#(1<<31) + msr hcr_el2,x0 + mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable + msr spsr_el2,x0 // spsr -> saved program status register + msr elr_el2,lr // lr->link register elr->Eeception Link Register + eret +/* +core_timer_enable: + //mov x0,1 + //msr cntp_ctl_el0, x0 //enable + //mrs x0, cntfrq_el0 + //mov x3,5 + //mul x0, x0, x3 + //msr cntp_tval_el0,x0 // set expired time + //mov x0,2 + //ldr x1, =CORE0_TIMER_IRQ_CTRL + //str w0,[x1] //unmask timer interrupt + //ret +*/ +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + + +exception_handler: + save_all + bl except_handler_c + load_all + eret + +irq_exception_handler: + save_all + bl uart_irq_handler + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + b exception_handler // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + +.global _dtb_ptr //define a global variable _dtb_ptr +.section .data //_dtb_ptr is in data section +_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 + diff --git a/lab3_asy/shell/start.o b/lab3_asy/shell/start.o new file mode 100644 index 0000000000000000000000000000000000000000..2a7d92cb0cfce21c71794f218a84f99e20ce9226 GIT binary patch literal 7632 zcmeHM&1(}u6o1LCrqzBcG_=L0P^gGTDt=L<-B$adwpzVdy)2t%HNiBgn^kLtwum<` zt@PA`T5kg$JP1Nh{TD36gQp-OA|g^m+ETl|+3YmyB)#;|QP_dqdGnk1e!rPFvjfRY zcK7%AeLi5t2X7(YVkp3Leco1VQ-M+_$%CHdWx&gTmjN#WUIx4j{5KisoPwbc!0J4l z&NRu&Qw`va8j>=WW!274!cZB&YzM#$PN)hNgPBgmA`=jN1aQ3LF|2gSaOI_CoxuLt zWsCuMy#&<_nHRCCB~ThN?f7J+=kF~^ewPgZ`B>>ApKAT&bE8DQw8-S^(Ou-*somsz zM}Yk3Eg{R7OUch`d&n|95esocp5S1-s9!K+XLPn@b-YW2X<-?)NNR` zJEc`jXYIFG{SSim7X<6i3D$omSbsvWew$$ZI>Gt}1nY0Ci#>l91nbWU)*lzFe?zc- zn_zwXO}*_R6}>3{kicJ*Q^KBNMFP11&fP&2;yFZyK`tU_w`GWN_ zRhX{K;mp5;!>?j=Rgv)@vGKw@oMiso)yaU3oE_!jv17C1DI!A&DI zqUwobs+q#772?JnRUaGHN6mODsm8QqG@%>N90fIMM$}Q$fPC*geb`JHs;Na1I;d(S zomSJPW|+*5kLxg^#gk45V^fFWE_$g{iV4{BI%vNEYH%Sc9Gg~sj$MyvF9{2c-PekA>&X zkDPYlR|^nw9J0=U0~ky910P?C7(aJ}037`%b|e4d=TG-`vG_sf{priority < task_head->priority) { + new_task->next = task_head; + new_task->prev = NULL; + if (task_head) { + task_head->prev = new_task; + } + task_head = new_task; + } else { + // Find the correct position in the list + task_t *current = task_head; + while (current->next && current->next->priority <= new_task->priority) { + current = current->next; + } + + // Insert the new task + new_task->next = current->next; + new_task->prev = current; + if (current->next) { + current->next->prev = new_task; + } + current->next = new_task; + } + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, uint64_t priority) { + + task_t* task = simple_malloc(sizeof(task_t)); + if(!task) { + return; + } + + task->callback = callback; + task->priority = priority; + + enqueue_task(task); +} + +void execute_tasks() { + + uart_send_string("in exe \n"); + while (task_head) { + task_head->callback(); + task_head = task_head->next; + if (task_head) { + task_head->prev = NULL; + } + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + //simple_free(task); + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts +} + diff --git a/lab3_asy/shell/tasklist.o b/lab3_asy/shell/tasklist.o new file mode 100644 index 0000000000000000000000000000000000000000..146e1ff6ec4c330e30a5635b9d93189864fe84b2 GIT binary patch literal 2400 zcmbW1Pe>F|7{I^T8O!{a|DwonCt1QM2Uk2;1dUp0AQhUB5bciZl;ZAcJF{RJ=_TmU zLD6gBvGvqpB~KC2!9$0r^j3N35C}oop&@MhzS;M5dd_y}TV~$(e&3(>&HLWIsq;M- z0+Iw=BzO)xGfn~2Jv+MYsydWI8GODhuLb~S+Cg_D8M1Pj?u77}0%fB?f~!FVGAe+B zF-{JBU&@iS2G<_gkkS4{mKKjHx?|*WOUgaSOe;Hn3X3K7E0;SMMEf@!wM62XuG88Si);p;SvN;1I5qkCd^Dgt z(-LHZs=Nxtx&v@_jTm5k(SZ96*&u!geKYa(-?=6Frp;2_p|vRgNK!Q?Otl1{tF!a8 z+SossPTFZT9M)R3=B9AkordqXv}nz(#~H?2ppsrF(%oKAChDcSvY^Wjb9Ihjq*HWB+AAv9R2*SA+Pf6=XS-mVU5N|EL)2~ zXaYh*U?y*;&9oUI1H@9MVKdztNsPzMNWzH6$6|n|HkM{43(`i)j#y@LC}P>Ek>o9) z=*X~X46(ZSPS;@TxK1WsN4>xsS)9lpFer}=y=jQ`7>rTQp2641g z`Ei(QDKlvU zd4Np=pyJoRadw4wGe_zl#qxOGKUzjy tn?i~iTw!&TBBOgkjHmq-dxr?#GB`*RkBHkscY|O2GOK^s6HBTX{|9Ma^KAeC literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/timer.c b/lab3_asy/shell/timer.c new file mode 100644 index 000000000..7e84400b9 --- /dev/null +++ b/lab3_asy/shell/timer.c @@ -0,0 +1,102 @@ +#include "header/timer.h" +#include "header/allocator.h" +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +timer_t *timer_head = NULL; + +void add_timer(timer_t *new_timer) { + + timer_t *current = timer_head; + + // Disable interrupts to protect the critical section + asm volatile("msr DAIFSet, 0xf"); + // Special case: the list is empty or the new timer is the earliest + if (!timer_head || new_timer->expiry < timer_head->expiry) { + new_timer->next = timer_head; + new_timer->prev = NULL; + if (timer_head) { + timer_head->prev = new_timer; + } + timer_head = new_timer; + + // Reprogram the hardware timer + asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); + return; + } + + // Find the correct position in the list + while (current->next && current->next->expiry < new_timer->expiry) { + current = current->next; + } + + // Insert the new timer + new_timer->next = current->next; + new_timer->prev = current; + if (current->next) { + current->next->prev = new_timer; + } + current->next = new_timer; + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + + +void create_timer(timer_callback callback, void* data, uint64_t after) { + //Allocate memory for the timer + timer_t* timer = simple_malloc(sizeof(timer_t)); + if(!timer) { + return; + } + + //Set the callback and data + timer->callback = callback; + timer->data = data; + + //Calculate the expiry time + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); + timer->expiry = current_time + after * cntfrq; + //Add the time to the list + add_timer(timer); +} + + +void print_message(void *data) { + char *message = data; + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); + uint64_t seconds = current_time / cntfrq; + + uart_send_string("Timeout message: "); + uart_send_string(message); + uart_send_string(" occurs at "); + uart_hex(seconds); + uart_send_string("\n"); +} + +void setTimeout(char *message,uint64_t seconds) { + + char *message_copy = utils_strdup(message); + + if(!message_copy){ + return; + } + + if (!timer_head) { + //enable core_timer_interrupt + unsigned int value = 2; + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt + *address = value; + } + + create_timer(print_message,message_copy,seconds); +} + diff --git a/lab3_asy/shell/timer.o b/lab3_asy/shell/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..2073fbde9b7685a25c77b303f1959a2feaf6cbc6 GIT binary patch literal 3064 zcmbW2O>7%Q6oB7)o#LixNSjn30?nq1P(gHMhe$+$!#YtZNKpw*DuINsH}*D;u;a+P zmI8@LihAggs^J1^4?V>>aR{OuKvlW+R0y}03UMokK!}77k$G?Sy=JnpCB#_c_vYL8 zGxKI?=Ie5LrL~MeU`aNJ&yb`IQ3uOF*iR$dCPD(`Y=iyZF7fUSoaRjIHl* z0UIYKjM^!zgMqz2(ft*zai`m<8(mP}UHp;O*&~d`G&frB{(2g!K28iawkf`eInN zJ2~_cWAwm1QqB0}0>l?i8oeETU?F)n#PA-;bf| ziCPl-gwg;$Aert=-Z*r#ZS;D4)g1dGHs1d5!6rGUkBqSfLuht|eU?I>y#729V9Pun&+Q)Ar@b$^*P06*~t5c^FuL`O55Ekm1V$Rkspkd~YtF@dJD? z6M}-b0B$~?QJ#>icy8eFz@IJ67rji$Ef&i;@V$VqA5??cqEAus)p<~knS$r$0iMTs zQR~Ka=%>I^6yQXJ4>0dV-pM+NS6c8SbBQnalkN{Si7$LO#1M_|Xq?W1w6|E1_@{Y1 z!BXN2pJM)8Wd2#^6h}YZSR&OxS+?yAfN52Ri`lhfCiO6)+{iT>u|1S2Id=er$PI1gZF<>eFFGsle%RC%>PP)7= z#C(MF%lk#R_=$X*{pGpHOaF2GAF_YcyujeL1Y{}m7yLdd&Gv7LKZ#j3r2Qjb@t6Ih xbwqQMi^Urvbv%NM?q$@UzRS_QLj*}aKg%@Gn$%6uF;trQPjI4w7_yA|{|i80T(tlI literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/uart.c b/lab3_asy/shell/uart.c new file mode 100644 index 000000000..55bf7f956 --- /dev/null +++ b/lab3_asy/shell/uart.c @@ -0,0 +1,209 @@ +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +#define RX_INTERRUPT_BIT 0x01 +#define TX_INTERRUPT_BIT 0x02 + +#define AUXINIT_BIT_POSTION 1<<29 + +char uart_read_buffer[UART_BUFFER_SIZE]; +char uart_write_buffer[UART_BUFFER_SIZE]; +int uart_read_head = 0; +int uart_read_index = 0; +int uart_write_index = 0; +int uart_write_head = 0; + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + // P.104 Since I need UART 1 Transmit/Receive Data -> TXD1/RXD1 + // p.102 I find These two in GPIO 14/15 Fun5 + // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 + // That's why I need GPFSEL1 + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 + r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 + *GPFSEL1 = r; // from here activate Trasmitter&Receiver + + //Since We've set alt5, we want to disable basic input/output + //To achieve this, we need diable pull-up and pull-dwon + *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down + //Wait 150 cycles + //this provides the required set-up time for the control signal + r=150; while(r--) { asm volatile("nop"); } + // GPIO control 54 pins + // GPPUDCLK0 controls 0-31 pins + // GPPUDCLK1 controls 32-53 pins + // set 14,15 bits = 1 which means we will modify these two bits + // trigger: set pins to 1 and wait for one clock + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + + + r=1000; while(r--) { asm volatile("nop"); } + + /* initialize UART */ + *AUX_ENABLE |=1; + //P.9: If set the mini UART is enabled. The UART will + //immediately start receiving data, especially if the + //UART1_RX line is low. + //If clear the mini UART is disabled. That also disables + //any mini UART register access + *AUX_MU_CNTL = 0; + //P.17 If this bit is set the mini UART receiver is enabled. + //If this bit is clear the mini UART receiver is disabled + //Prevent data exchange in initialization process + *AUX_MU_IER = 0; + //Set AUX_MU_IER_REG to 0. + //Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; + //P.14: 00 : the UART works in 7-bit mode + //11(3) : the UART works in 8-bit mode + //Cause 8 bits can use in ASCII, Unicode, Char + *AUX_MU_MCR = 0; + //Don’t need auto flow control. + //AUX_MU_MCR is for basic serial communication. Don't be too smart + *AUX_MU_BAUD = 270; + //set BAUD rate to 115200(transmit speed) + //so we need set AUX_MU_BAUD to 270 to meet the goal + *AUX_MU_IIR = 0xc6; + // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 + // Writing with bit 1 set will clear the receive FIFO + // Writing with bit 2 set will clear the transmit FIFO + // Both bits always read as 1 as the FIFOs are always enabled + /* map UART1 to GPIO pins */ + *AUX_MU_CNTL = 3; // enable Transmitter,Receiver + +} + + +/** + * Send a character + */ +void uart_send_char(unsigned int c) { + /* wait until we can send */ + // P.15 AUX_MU_LSR register shows the data(line) status + // AUX_MU_LSR bit 5 => 0x20 = 00100000 + // bit 5 is set if the transmit FIFO can accept at least one byte. + // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop + // else FIFO can not accept at lease one byte then still wait + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the + //UART FIFOs. + //communicate with(send to) the minicom and print to the screen + *AUX_MU_IO=c; +} + +/** + * Display a string + */ +void uart_send_string(char* s) { + while(*s) { + /* convert newline to carriage return + newline */ + if(*s=='\n') + uart_send_char('\r'); + uart_send_char(*s++); + } +} + +/** + * Receive a character + */ +char uart_get_char() { + char r; + /* wait until something is in the buffer */ + //bit 0 is set if the receive FIFO holds at least 1 symbol. + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + /* convert carriage return to newline */ + return r=='\r'?'\n':r; +} + + +/** + * Display a binary value in hexadecimal + */ +void uart_hex(unsigned long long d) { + unsigned long long n; + int c; + uart_send_string("0x"); + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x57:0x30; + uart_send_char(n); + } +} + +void uart_enable_interrupt() { + + // Enable RX and TX interrupt for mini UART + uint32_t ier = mmio_read(AUX_MU_IER); + ier |= RX_INTERRUPT_BIT; + //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); + mmio_write(AUX_MU_IER, ier); + + // Enable the mini UART interrupt in the second-level interrupt controller + // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; + uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); + enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 + mmio_write(ENABLE_IRQS_1, enable_irqs1); +} + +void uart_disable_interrupt() { + // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; + uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); + disable_irqs1 |= AUXINIT_BIT_POSTION; + mmio_write(DISABLE_IRQS_1,disable_irqs1); +} + +int uart_async_read(char *buffer) { + // uart_send_string("in uart_async_read\n"); + if (uart_read_head == uart_read_index) { + // No characters available + return 0; + } else { + // uart_send_string("flag \n"); + buffer[0] = uart_read_buffer[uart_read_head++]; + if (uart_read_head >= UART_BUFFER_SIZE) { + uart_read_head = 0; + } + return 1; + } +} +void uart_async_write(const char *buffer, int length) { + // uart_write_head = 1; + // uart_read_index = 1; + for (int i = 0; i < length; i++) + { + // uart_send_string("qq\n"); + uart_write_buffer[uart_write_index++] = buffer[i]; + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + } + // Trigger TX interrupt + /// uart_send_string("Triiger TX interrupt\n"); + /// uart_hex(uart_write_index); + /// uart_hex(uart_write_head); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); + /// uart_send_string("flag1\n"); + /// uart_hex(uart_write_index); + /// uart_hex(uart_write_head); +} + +void uart_async_send(const char *str) { + // uart_send_string("in uart asy send ===========================\n"); + int length = utils_strlen(str); + uart_async_write(str, length); +} + + diff --git a/lab3_asy/shell/uart.o b/lab3_asy/shell/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..e16ca5d25c6769be1f4ad24fbc62bfd36b665e22 GIT binary patch literal 3856 zcmbtXU2IfU5T3jDwk*(=rPM$K?G{!*BWt&*r1;X?mLE+}VN(({#O?mvvJLIh?%s{X zqTN!6ruBgeA%@7$1BRc(ga;C-F+xQRF+Pwr8WRN(i9X;1&=)b5b>`j~SkAVIi6^-` zGv7Hg^PMwu&+ZPc+qmANX&^&`PvC(iD8S{p4|LN}O{jzl*bTY-aCI*4xpCr-j*kI* z!WXJ@;TAB*18^)|m#C_)1LLU{fbl_mYW@26U_jqQq0p`^KtK2(tf3$IES+W^-pV=i z%{*7^KMW&ztzsm<4E^iy+3Ow2zcYIz-+{TGKzju~<#R^zNVlN_{VB$B#Ei<3{CU)4 zkP8RU2K2d(wjcFhP<~aH3-3jFaZxU;qaAS%J1iO z8klP|4>ZzR1LtTx<@rdlXfYtRRwp?ih)sey@; zly5i2)LIWZv9xO^?wG_0YhdD9;tZfSAP476huRM2X^o0YF5->nKlU4P51_AUnBzwQ zw&(B+Tm3MWGhjZ&@?$MqFD05{0Be@wy2wBC`d$QRre~Z@`Z}UAremog%sxx5BxK-OU z$ax|@FZNgY%?Uh*A>6;)546|X`+KE5O$~g0ifS-97w%5tp72}_)FP)<$O(IGUmQ7k zkkdBg)PbBdE`hI{7ZEer_S8j=AQ+C!L3I!X3^{YZz#|*vQ&=9O|e3D@RA35RB-VB4$ z|G2ieqSnC{xiI|6lGZ)VdY}k1S>IZOwX@#HatX>L>%Amfs(gn%N3_?jUa2CJV!ulY z4#`2-hYkWDTnIbE*d~^QeaZSRmVT5!vhKuasq!B-j_9rXJ@KnozH@T&bcvw5(}3HB zk_iO#X>V4-vGUUl9V4m3>j0Fcbm&l40=n1sOn7O03ZTQR8RB@MreucJyR6hH9m-V* z=tANP248#{(kB+`l-Fcj zdWCv{aD304A^q|m<7XI`o;l2TJ(tqy8^k`whk8sMpCT|H>+9pAlS+KUxR(LJe_~v0 zkvADf;S9n5M$3sW0LuzI7sBsXOy;xEv>l8?pdSJWAS2S1>atxeW2F+2cruzUGBb9% zE49r9wpn)3bkgc~VJj7lbz2z6w$kZrF9%C>Wu}9pnVqS4ByB}GyKBFZ?y@a6nhOvW z$l6`qnFuoIwo>k-vo4an@9o-Msf2K$z{uobTU{T^c6M64NymW!Jj;{ZPYX~MclBAu zA5rjgj4wtx&n=DfDg8uoGvEhiz>m#7rymlRy?gP#>#?gI#BcJ|oO7)m?s%A{y%t2-LBt$rJViKrcgU@Vh?V0s4` zv^*4Sf?#|{Pmh(tC8-^@72NRBmQ@)$8sCoV$lFRrI@8e}y3PLI@S{7Hv literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/Makefile b/lab3_asy/shell/userprogram/Makefile new file mode 100644 index 000000000..19cefe3cf --- /dev/null +++ b/lab3_asy/shell/userprogram/Makefile @@ -0,0 +1,11 @@ +all: one.img + +one.o: one.S + aarch64-linux-gnu-gcc -c one.S -o one.o + +one.img: one.o + aarch64-linux-gnu-ld one.o -T linker.ld -o one.elf + aarch64-linux-gnu-objcopy -O binary one.elf one.img + +clean: + rm one.o one.elf > /dev/null 2>/dev/null || true diff --git a/lab3_asy/shell/userprogram/linker.ld b/lab3_asy/shell/userprogram/linker.ld new file mode 100644 index 000000000..ab70a30ea --- /dev/null +++ b/lab3_asy/shell/userprogram/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/userprogram/one.S b/lab3_asy/shell/userprogram/one.S new file mode 100644 index 000000000..4acf6f4dd --- /dev/null +++ b/lab3_asy/shell/userprogram/one.S @@ -0,0 +1,7 @@ +.section ".text" +.global _start +_start: + svc 0x1337 +1: + nop + b 1b diff --git a/lab3_asy/shell/userprogram/one.elf b/lab3_asy/shell/userprogram/one.elf new file mode 100644 index 0000000000000000000000000000000000000000..b13e36ed9627aa5a41acd8767b43259aeddc6b32 GIT binary patch literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/one.img b/lab3_asy/shell/userprogram/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/userprogram/one.o b/lab3_asy/shell/userprogram/one.o new file mode 100644 index 0000000000000000000000000000000000000000..c00c28e5b03a97b1c7da93cb70b11273c5c3833a GIT binary patch literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T literal 0 HcmV?d00001 diff --git a/lab3_asy/shell/utils.c b/lab3_asy/shell/utils.c new file mode 100644 index 000000000..8242d820c --- /dev/null +++ b/lab3_asy/shell/utils.c @@ -0,0 +1,63 @@ +#include "header/utils.h" +#include "header/allocator.h" + +int utils_string_compare(const char* str1,const char* str2) { + for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ + if(*str1 != *str2) return 0; + else if(*str1 == '\0' && *str2 =='\0') return 1; + } + return 1; +} + +unsigned long utils_atoi(const char *s, int char_size) { + unsigned long num = 0; + for (int i = 0; i < char_size; i++) { + num = num * 16; + if (*s >= '0' && *s <= '9') { + num += (*s - '0'); + } else if (*s >= 'A' && *s <= 'F') { + num += (*s - 'A' + 10); + } else if (*s >= 'a' && *s <= 'f') { + num += (*s - 'a' + 10); + } + s++; + } + return num; +} + +void utils_align(void *size, unsigned int s) { + unsigned long* x = (unsigned long*) size; + unsigned long mask = s-1; + *x = ((*x) + mask) & (~mask); +} + +uint32_t utils_align_up(uint32_t size, int alignment) { + return (size + alignment - 1) & ~(alignment-1); +} + +//with null-terminator -> "hello" return 6 +size_t utils_strlen(const char *s) { + size_t i = 0; + while (s[i]) i++; + return i+1; +} + + +char *utils_strcpy(char* dst, const char *src) { + char *save = dst; + while((*dst++ = *src++)); + return save; +} + + +char *utils_strdup(const char *src) { + size_t len = utils_strlen(src); + char *dst = simple_malloc(len); + if (dst == NULL) { // Check if the memory has been successfully allocated + return NULL; + } + utils_strcpy(dst, src); // Copy the string + return dst; +} + + diff --git a/lab3_asy/shell/utils.o b/lab3_asy/shell/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..74670709cc74f02475f1c6c05ac4403bb067de43 GIT binary patch literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Thu, 25 Apr 2024 12:46:05 +0800 Subject: [PATCH 08/24] Delete lab3_asy directory --- lab3_asy/readme.md | 1 - lab3_asy/shell/Makefile | 22 --- lab3_asy/shell/allocator.c | 20 --- lab3_asy/shell/allocator.o | Bin 1744 -> 0 bytes lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb | Bin 32753 -> 0 bytes lab3_asy/shell/cpio.c | 96 ----------- lab3_asy/shell/cpio.o | Bin 4768 -> 0 bytes lab3_asy/shell/dtb.c | 163 ------------------ lab3_asy/shell/dtb.o | Bin 4880 -> 0 bytes lab3_asy/shell/except.c | 150 ----------------- lab3_asy/shell/except.o | Bin 3552 -> 0 bytes lab3_asy/shell/header/allocator.h | 7 - lab3_asy/shell/header/cpio.h | 39 ----- lab3_asy/shell/header/dtb.h | 26 --- lab3_asy/shell/header/gpio.h | 38 ----- lab3_asy/shell/header/irq.h | 22 --- lab3_asy/shell/header/mailbox.h | 38 ----- lab3_asy/shell/header/reboot.h | 8 - lab3_asy/shell/header/shell.h | 2 - lab3_asy/shell/header/tasklist.h | 21 --- lab3_asy/shell/header/timer.h | 20 --- lab3_asy/shell/header/uart.h | 39 ----- lab3_asy/shell/header/utils.h | 25 --- lab3_asy/shell/initramfs.cpio | Bin 1024 -> 0 bytes lab3_asy/shell/kernel8.elf | Bin 82488 -> 0 bytes lab3_asy/shell/kernel8.img | Bin 12016 -> 0 bytes lab3_asy/shell/linker.ld | 44 ----- lab3_asy/shell/mailbox.c | 51 ------ lab3_asy/shell/mailbox.o | Bin 2064 -> 0 bytes lab3_asy/shell/main.c | 81 --------- lab3_asy/shell/main.o | Bin 3808 -> 0 bytes lab3_asy/shell/reboot.c | 16 -- lab3_asy/shell/reboot.o | Bin 1496 -> 0 bytes lab3_asy/shell/rootfs/file1.txt | 1 - lab3_asy/shell/rootfs/one.img | Bin 16 -> 0 bytes lab3_asy/shell/rootfs/pack.sh | 2 - lab3_asy/shell/rootfs/thisisfile2.txt | 1 - lab3_asy/shell/shell.c | 141 ---------------- lab3_asy/shell/shell.o | Bin 7216 -> 0 bytes lab3_asy/shell/start.S | 163 ------------------ lab3_asy/shell/start.o | Bin 7632 -> 0 bytes lab3_asy/shell/tasklist.c | 67 -------- lab3_asy/shell/tasklist.o | Bin 2400 -> 0 bytes lab3_asy/shell/timer.c | 102 ------------ lab3_asy/shell/timer.o | Bin 3064 -> 0 bytes lab3_asy/shell/uart.c | 209 ------------------------ lab3_asy/shell/uart.o | Bin 3856 -> 0 bytes lab3_asy/shell/userprogram/Makefile | 11 -- lab3_asy/shell/userprogram/linker.ld | 19 --- lab3_asy/shell/userprogram/one.S | 7 - lab3_asy/shell/userprogram/one.elf | Bin 66352 -> 0 bytes lab3_asy/shell/userprogram/one.img | Bin 16 -> 0 bytes lab3_asy/shell/userprogram/one.o | Bin 728 -> 0 bytes lab3_asy/shell/utils.c | 63 ------- lab3_asy/shell/utils.o | Bin 2320 -> 0 bytes 55 files changed, 1715 deletions(-) delete mode 100644 lab3_asy/readme.md delete mode 100644 lab3_asy/shell/Makefile delete mode 100644 lab3_asy/shell/allocator.c delete mode 100644 lab3_asy/shell/allocator.o delete mode 100644 lab3_asy/shell/bcm2710-rpi-3-b-plus.dtb delete mode 100644 lab3_asy/shell/cpio.c delete mode 100644 lab3_asy/shell/cpio.o delete mode 100644 lab3_asy/shell/dtb.c delete mode 100644 lab3_asy/shell/dtb.o delete mode 100644 lab3_asy/shell/except.c delete mode 100644 lab3_asy/shell/except.o delete mode 100644 lab3_asy/shell/header/allocator.h delete mode 100644 lab3_asy/shell/header/cpio.h delete mode 100644 lab3_asy/shell/header/dtb.h delete mode 100644 lab3_asy/shell/header/gpio.h delete mode 100644 lab3_asy/shell/header/irq.h delete mode 100644 lab3_asy/shell/header/mailbox.h delete mode 100644 lab3_asy/shell/header/reboot.h delete mode 100644 lab3_asy/shell/header/shell.h delete mode 100644 lab3_asy/shell/header/tasklist.h delete mode 100644 lab3_asy/shell/header/timer.h delete mode 100644 lab3_asy/shell/header/uart.h delete mode 100644 lab3_asy/shell/header/utils.h delete mode 100644 lab3_asy/shell/initramfs.cpio delete mode 100644 lab3_asy/shell/kernel8.elf delete mode 100644 lab3_asy/shell/kernel8.img delete mode 100644 lab3_asy/shell/linker.ld delete mode 100644 lab3_asy/shell/mailbox.c delete mode 100644 lab3_asy/shell/mailbox.o delete mode 100644 lab3_asy/shell/main.c delete mode 100644 lab3_asy/shell/main.o delete mode 100644 lab3_asy/shell/reboot.c delete mode 100644 lab3_asy/shell/reboot.o delete mode 100644 lab3_asy/shell/rootfs/file1.txt delete mode 100644 lab3_asy/shell/rootfs/one.img delete mode 100644 lab3_asy/shell/rootfs/pack.sh delete mode 100644 lab3_asy/shell/rootfs/thisisfile2.txt delete mode 100644 lab3_asy/shell/shell.c delete mode 100644 lab3_asy/shell/shell.o delete mode 100644 lab3_asy/shell/start.S delete mode 100644 lab3_asy/shell/start.o delete mode 100644 lab3_asy/shell/tasklist.c delete mode 100644 lab3_asy/shell/tasklist.o delete mode 100644 lab3_asy/shell/timer.c delete mode 100644 lab3_asy/shell/timer.o delete mode 100644 lab3_asy/shell/uart.c delete mode 100644 lab3_asy/shell/uart.o delete mode 100644 lab3_asy/shell/userprogram/Makefile delete mode 100644 lab3_asy/shell/userprogram/linker.ld delete mode 100644 lab3_asy/shell/userprogram/one.S delete mode 100644 lab3_asy/shell/userprogram/one.elf delete mode 100644 lab3_asy/shell/userprogram/one.img delete mode 100644 lab3_asy/shell/userprogram/one.o delete mode 100644 lab3_asy/shell/utils.c delete mode 100644 lab3_asy/shell/utils.o diff --git a/lab3_asy/readme.md b/lab3_asy/readme.md deleted file mode 100644 index 8b1378917..000000000 --- a/lab3_asy/readme.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lab3_asy/shell/Makefile b/lab3_asy/shell/Makefile deleted file mode 100644 index beea4a7b2..000000000 --- a/lab3_asy/shell/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -SRCS = $(wildcard *.c) -OBJS = $(SRCS:.c=.o) -CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include -CFLAGS += -I /usr/aarch64-linux-gnu/include -all: kernel8.img - -start.o: start.S - aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o - -%.o: %.c - aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ - -kernel8.img: start.o $(OBJS) - aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf - aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img - -clean: - rm kernel8.elf *.o >/dev/null 2>/dev/null || true - -run: - qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab3_asy/shell/allocator.c b/lab3_asy/shell/allocator.c deleted file mode 100644 index 4ca648ee9..000000000 --- a/lab3_asy/shell/allocator.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "header/allocator.h" -#include "header/utils.h" - -#define SIMPLE_MALLOC_BUFFER_SIZE 8192 -static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; -static unsigned long simple_malloc_offset = 0; - -void* simple_malloc(unsigned long size){ - //align to 8 bytes - utils_align(&size,8); - - if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { - //Not enough space left - return (void*) 0; - } - void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; - simple_malloc_offset += size; - - return allocated; -} diff --git a/lab3_asy/shell/allocator.o b/lab3_asy/shell/allocator.o deleted file mode 100644 index 42047e4bff9d5a846fec68d6bb675751e99ff9b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1744 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 OPqI~*e!TdI|Nj8Si!WyY diff --git a/lab3_asy/shell/cpio.c b/lab3_asy/shell/cpio.c deleted file mode 100644 index a38879c9c..000000000 --- a/lab3_asy/shell/cpio.c +++ /dev/null @@ -1,96 +0,0 @@ -#include "header/cpio.h" -#include "header/uart.h" -#include "header/utils.h" -#include "header/allocator.h" - -int file_num = 0; -struct file *f = NULL; - -void allocate_file_array() { - if (f == NULL) { - f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); - if (f == NULL) { - uart_send_string("Memory allocation error\n"); - // Handle memory allocation error - } - } -} - -void traverse_file() -{ - allocate_file_array(); - char* addr = (char *)cpio_addr; - - - while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ - - struct cpio_header *header = (struct cpio_header *)addr; - unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); - unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; - unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); - - utils_align(&headerPathname_size, 4); - utils_align(&file_size, 4); - - f[file_num].file_header = header; - f[file_num].filename_size = filename_size; - f[file_num].headerPathname_size = headerPathname_size; - f[file_num].file_size = file_size; - f[file_num].file_content_head = (char*) header + headerPathname_size; - - addr += (headerPathname_size + file_size); - file_num += 1; - } -} - -int findfile(char* filename) { - for(int n=0;n<=file_num;n++) { - if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ - return n; - } - } - return -1; -} - -void cpio_ls() -{ - for(int n=0;n<=file_num;n++) { - uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); - uart_send_string("\n"); - } -} - - -void cpio_cat(char *filename) -{ - int targetfile_num = findfile(filename); - - if(targetfile_num != -1) { - for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) - { - uart_send_char(f[targetfile_num].file_content_head[i]); - } - uart_send_string("\n"); - - } else { - uart_send_string("Can not Find the file\n"); - } - -} - -void cpio_exec_program(char* filename) { - int targetfile_num = findfile(filename); - - char* target = (char*) 0x20000; - for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J diff --git a/lab3_asy/shell/dtb.c b/lab3_asy/shell/dtb.c deleted file mode 100644 index 523dac1d4..000000000 --- a/lab3_asy/shell/dtb.c +++ /dev/null @@ -1,163 +0,0 @@ -#include "header/dtb.h" -#include "header/uart.h" -#include "header/utils.h" -#define UNUSED(x) (void)(x) - - -char* cpio_addr; -int space = 0; -//1. Define the callback function type(fdt_callback) -//2. Create a structure for holding the FDT header information(fdt_header) -//3. Implement helper functions to extract the FDT header information - -uint32_t fdt_u32_le2be (const void *addr) { - const uint8_t *bytes = (const uint8_t *) addr; - uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; - return ret; -} - -void send_space(int n) { - while(n--) uart_send_string(" "); -} - -int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { - uintptr_t end_ptr = cur_ptr + totalsize; - - while(cur_ptr < end_ptr) { - - uint32_t token = fdt_u32_le2be((char *)cur_ptr); - cur_ptr += 4; - - switch(token){ - case FDT_BEGIN_NODE: - /* - Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. - Node name (variable length, NULL-terminated): Specifies the name of the node being opened. - */ - //uart_send_string("In FDT_BEGIN_NODE\n"); - cb(token, (char*)cur_ptr,NULL,0); - cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); - break; - case FDT_END_NODE: - /* - Token type (4 bytes): Indicates that it's an FDT_END_NODE token. - */ - //uart_send_string("In FDT_END_NODE;\n"); - cb(token,NULL,NULL,0); - break; - - case FDT_PROP: { - - /* - Token type (4 bytes): Indicates that it's an FDT_PROP token. - Data length (4 bytes): Specifies the length of the property data (len). - Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). - Property data (variable length): Contains the property data itself, the size of which is determined by len. - */ - //uart_send_string("In FDT_PROP \n"); - uint32_t len = fdt_u32_le2be((char*)cur_ptr); - cur_ptr += 4; - uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); - cur_ptr += 4; - //second parameter name here is property name not node name - cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); - cur_ptr += utils_align_up(len,4); - break; - - } - case FDT_NOP: - //uart_send_string("In FDT_NOP\n"); - cb(token,NULL,NULL,0); - break; - - case FDT_END: - //uart_send_string("In FDT_END\n"); - cb(token,NULL,NULL,0); - return 0; - default:; - return -1; - } - } - return -1; - -} -//4. Implement the fdt_traverse function: - -int fdt_traverse(fdt_callback cb,void * _dtb){ - uintptr_t dtb_ptr = (uintptr_t) _dtb; - uart_send_string("\ndtb loading at: "); - uart_hex(dtb_ptr); - // uart_send_char('\n'); - uart_send_string("\r\n"); - struct fdt_header* header = (struct fdt_header*) dtb_ptr; - - uint32_t magic = fdt_u32_le2be(&(header->magic)); - - if (magic != 0xd00dfeed){ - - uart_send_string("The header magic is wrong\n"); - return -1; - } - - /* - +-----------------+ - | fdt_header | <- dtb_ptr - +-----------------+ - | reserved memory | - +-----------------+ - | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) - +-----------------+ - | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) - +-----------------+ - */ - - uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); - uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); - uint32_t totalsize = fdt_u32_le2be(&header->totalsize); - parse_struct(cb, struct_ptr,strings_ptr,totalsize); - return 1; - -} - -//5. Implement the initramfs_callback function: -void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ - UNUSED(size); - if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ - cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); - uart_send_string("cpio address is at: "); - uart_hex((uintptr_t)fdt_u32_le2be(data)); - // uart_send_char('\n'); - uart_send_string("\r\n"); - } -} - -//6. Implement print_dtb callback function: - -void print_dtb(int token, const char* name, const void* data, uint32_t size) { - UNUSED(data); - UNUSED(size); - - switch(token){ - case FDT_BEGIN_NODE: - uart_send_string("\n"); - send_space(space); - uart_send_string((char*)name); - uart_send_string("{\n "); - space++; - break; - case FDT_END_NODE: - uart_send_string("\n"); - space--; - if(space >0) send_space(space); - uart_send_string("}\n"); - break; - case FDT_NOP: - break; - case FDT_PROP: - send_space(space); - uart_send_string((char*)name); - break; - case FDT_END: - break; - } -} diff --git a/lab3_asy/shell/dtb.o b/lab3_asy/shell/dtb.o deleted file mode 100644 index 52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h diff --git a/lab3_asy/shell/except.c b/lab3_asy/shell/except.c deleted file mode 100644 index ac41a8cf8..000000000 --- a/lab3_asy/shell/except.c +++ /dev/null @@ -1,150 +0,0 @@ - -#include "header/uart.h" -#include "header/irq.h" -#include "header/shell.h" -#include "header/timer.h" -#include "header/tasklist.h" -#include "header/utils.h" - -#define CNTPSIRQ_BIT_POSITION 0x02 -#define AUXINIT_BIT_POSTION 1<<29 - - -void except_handler_c() { - uart_send_string("In Exception handle\n"); - - //read spsr_el1 - unsigned long long spsr_el1 = 0; - asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); - uart_send_string("spsr_el1: "); - uart_hex(spsr_el1); - uart_send_string("\n"); - - //read elr_el1 - unsigned long long elr_el1 = 0; - asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); - uart_send_string("elr_el1: "); - uart_hex(elr_el1); - uart_send_string("\n"); - - //esr_el1 - unsigned long long esr_el1 = 0; - asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); - uart_hex(esr_el1); - uart_send_string("\n"); - - //ec - unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) - uart_send_string("ec: "); - uart_hex(ec); - uart_send_string("\n"); - - - while(1){ - - } - -} - -void timer_irq_handler() { - //enable core_0_timer - unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; - *address = 2; - - asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); - // Disable interrupts to protect critical section - asm volatile("msr DAIFSet, 0xf"); - - uint64_t current_time; - asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); - - while(timer_head && timer_head->expiry <= current_time) { - timer_t *timer = timer_head; - - //Execute the callback - timer->callback(timer->data); - - // Remove timer from the list - timer_head = timer->next; - if (timer_head) { - timer_head->prev = NULL; - } - - //free timer - - // Reprogram the hardware timer if there are still timers left - if(timer_head) { - asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); - asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); - } else { - asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); - } - - - //enable interrupt - asm volatile("msr DAIFClr,0xf"); - } - -} - -void uart_irq_handler(){ - // uart_send_string("in uart_irq_handler\n"); - ///uart_hex(uart_write_index); - ///uart_hex(uart_write_head); - ///uart_send_string("\r\n"); - uint32_t iir = mmio_read(AUX_MU_IIR); - - // Check if it is a receive interrupt - if ((iir & 0x06) == 0x04) { - // Read data(8 bytes) and store it in the read buffer - // uart_send_string("in uart_irq_handler_receive\n"); - char data = mmio_read(AUX_MU_IO) & 0xff; - uart_read_buffer[uart_read_index++] = data; - if (uart_read_index >= UART_BUFFER_SIZE) { - uart_read_index = 0; - } - - // Enqueue the received data into the write buffer - uart_write_buffer[uart_write_index++] = data; - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - - // Enable tx interrupt - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); - } - - // Check if it is a transmit interrupt - if ((iir & 0x06) == 0x02) { - // uart_send_string("in uart_irq_handler_transmit\n"); - // Send data from the write buffer - if (uart_write_head != uart_write_index) { - /// uart_send_string("in uart_irq_handler_trans_!=\n"); - mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); - // uart_write_head ++; - if (uart_write_index >= UART_BUFFER_SIZE) { - uart_write_index = 0; - } - } - else - { - // uart_send_string("in uart_irq_handler_trans_else\n"); - // Disable tx interrupt when there is no data left to send - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); - - /* - if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n'){ - uart_read_buffer[uart_read_index-1] = '\0'; - uart_read_index = 0; - uart_write_index = 0; - uart_write_head = 0; - // parse_command(uart_read_buffer); - // uart_write_index = 0; - } - */ - } - } - // uart_send_string("out uart_irq_handler\n"); -} - - diff --git a/lab3_asy/shell/except.o b/lab3_asy/shell/except.o deleted file mode 100644 index 3848a48b50b81e28cc33404b08346c70d215faf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3552 zcmbW3UuauZ9LImjO}k9H+NQ0_GM1ZBwF7r)YTd#n?Dn7SWGb|sC==5(xiw*J+TPq^ zW@UCTP>K&Njr!u|6vRb*7&y_wlp#g>B1kp$Ne$wgFLPszfVKX9_nu>ayG=y)gVS@) z=X`(PbM8Io-y@#c_+ z`uQe3T9lmnC8g<;CP$agdSQ|J#5=d?nr$w}n+K!Cl5!{GzH?`G4@rNju{3YYUM+b1 zb88;BbVIJG8|DT9%dL~%!ajgy^|xU0*JqXD)^&sr=sSQ41y#a!DTbJLjf2KK*29_PUR;B=s%t6n|tyP)(gdGmBP9>o$Rj&Yg(bk*zU{TFsT zwN#t0dE57n(*Lgaxu1G|`MJ3M!;kgO94XRa_{iWtf`)zY=Vm2|Qt@U29u?fp3ZbA= zrBDEO+!fAy-OhK}y2^`IV28^^?vEevPHhVX@HSNl1@IKQg7ziAp4Z+7WMM3F&v;5l z6@COc`N({GzmVZwsOa;&(D#Z*miv{iqCZ`Q&sX8^RpFmj;b7ReLQ6nv5?XVj8*^@m z8B4%S+_Yj@Ba@6}Ei;{Y*#Rjd2UdE*Fk@+RTB-#}8S$i};$ybYD`wgNcOAtt)Tn8NN00X~yFflc^6`RS4;p~c1Jxd|e7&K{az(4C}^KJtF5HU*GA zlD7)(_My8=A${7MF0_l9^mt|ejZV>${!;&h;BNn3!KJ_S9dP+be!Pm$FynkZFEY;G zPl|D_pJJTrEy3kFbT0XDjuLfWV?Ofik)8cRk2U#l{w345uz9aC&i$`3em~Q%FwXr~ z1*dtr|M!e@{}SWe|2pH`U*4k{9QU&I$nz|DUW|>4TJm1u3tIN{gcTpf+A^IwC0nL3 z9@i`*XMvWCTXE1vvsuv0N$QY1qD4VVOioM~8I)uuEko;n=EQ-l6;GT(9c3G-*q9lg zFxU$3uBl=gE!q8r(UDOM@Rxvne)ecQh{cCR$HHSo7%qrUFMU609={OD-=T*EcYmSZ zbj>T$Y!BI{ntrdy^KSDam`m%T?;{U6e;tRtg#I~E?_iS^U^c*s0iAHzY} z=DPC#eEye2{x-RIA@cW1ddv08{tMWsw13xkI*I`yr2V5@nJ@Q`*1m0SWH~W^n;5(o nSzU#En#R3%h~T357=A?^7VdY|h+~!Vqs~8UkYc&ibm#vAJTZzg diff --git a/lab3_asy/shell/header/allocator.h b/lab3_asy/shell/header/allocator.h deleted file mode 100644 index 56f46666f..000000000 --- a/lab3_asy/shell/header/allocator.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef ALLOCATOR_H -#define ALLOCATOR_H - - -void* simple_malloc(unsigned long size); - -#endif diff --git a/lab3_asy/shell/header/cpio.h b/lab3_asy/shell/header/cpio.h deleted file mode 100644 index be0e36b9f..000000000 --- a/lab3_asy/shell/header/cpio.h +++ /dev/null @@ -1,39 +0,0 @@ -//#define QEMU_CPIO_ADDR (char *)0x8000000; //qemu -//#define RASP_CPIO_ADDR (char *)0x20000000;//rasperrypi - -#define MAX_FILE_NUM 10 - -extern char* cpio_addr; - -void traverse_file(); -void cpio_ls(); -void cpio_cat(char* filename); -void cpio_exec_program(char* filename); - -struct cpio_header { - // uses 8-byte hexadecimal fields for all numbers - char c_magic[6]; //determine whether this archive is written with little-endian or big-endian integers. - char c_ino[8]; //determine when two entries refer to the same file. - char c_mode[8]; //specifies both the regular permissions and the file type. - char c_uid[8]; // numeric user id - char c_gid[8]; // numeric group id - char c_nlink[8]; // number of links to this file. - char c_mtime[8]; // Modification time of the file - char c_filesize[8]; // size of the file - char c_devmajor[8]; - char c_devminor[8]; - char c_rdevmajor[8]; - char c_rdevminor[8]; - char c_namesize[8]; // number of bytes in the pathname - char c_check[8]; // always set to zero by writers and ignored by readers. -}; - - -struct file { - struct cpio_header* file_header; - unsigned long filename_size; - unsigned long headerPathname_size; - unsigned long file_size; - char* file_content_head; -}; - diff --git a/lab3_asy/shell/header/dtb.h b/lab3_asy/shell/header/dtb.h deleted file mode 100644 index 16af25520..000000000 --- a/lab3_asy/shell/header/dtb.h +++ /dev/null @@ -1,26 +0,0 @@ -#include -// #include -#define FDT_BEGIN_NODE 0x00000001 -#define FDT_END_NODE 0x00000002 -#define FDT_PROP 0x00000003 -#define FDT_NOP 0x00000004 -#define FDT_END 0x00000009 - -typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); - -struct __attribute__((packed)) fdt_header { - uint32_t magic; // contain the value 0xd00dfeed (big-endian). - uint32_t totalsize; // in byte - uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header - uint32_t off_dt_strings; - uint32_t off_mem_rsvmap; - uint32_t version; - uint32_t last_comp_version; - uint32_t boot_cpuid_phys; - uint32_t size_dt_strings; // the length in bytes of the strings block section - uint32_t size_dt_struct; -}; - -int fdt_traverse(fdt_callback cb,void *dtb_ptr); -void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); -void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab3_asy/shell/header/gpio.h b/lab3_asy/shell/header/gpio.h deleted file mode 100644 index 38ca70635..000000000 --- a/lab3_asy/shell/header/gpio.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef GPIO_H -#define GPIO_H - -#include -//Page 90, Physical/bus addr diff -#define MMIO_BASE 0x3F000000 - -#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) -#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) -#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) -#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) -#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) -#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) -#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) -#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) -#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) -#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) -#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) -#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) -#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) -#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) -#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) -#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) -#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) -#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) - - -// Helper function to write data to a memory-mapped I/O address -static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { - *reg = data; -} - -// Helper function to read data from a memory-mapped I/O address -static inline uint32_t mmio_read(volatile uint32_t* reg) { - return *reg; -} - -#endif diff --git a/lab3_asy/shell/header/irq.h b/lab3_asy/shell/header/irq.h deleted file mode 100644 index 9085cb30c..000000000 --- a/lab3_asy/shell/header/irq.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef IRQ_H -#define IRQ_H - -#include "gpio.h" - - -#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) -#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) -#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) -#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) -#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) -#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) -#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) -#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) -#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) -#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) -#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) -#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) - - -#endif - diff --git a/lab3_asy/shell/header/mailbox.h b/lab3_asy/shell/header/mailbox.h deleted file mode 100644 index d13ac3ce9..000000000 --- a/lab3_asy/shell/header/mailbox.h +++ /dev/null @@ -1,38 +0,0 @@ -#include "gpio.h" - -extern volatile unsigned int mailbox[36]; - -#define MBOX_REQUEST 0 - -/* channels */ -#define MBOX_CH_POWER 0 -#define MBOX_CH_FB 1 -#define MBOX_CH_VUART 2 -#define MBOX_CH_VCHIQ 3 -#define MBOX_CH_LEDS 4 -#define MBOX_CH_BTNS 5 -#define MBOX_CH_TOUCH 6 -#define MBOX_CH_COUNT 7 -#define MBOX_CH_PROP 8 - -/* tags */ -#define TAG_REQUEST_CODE 0x00000000 -#define MBOX_TAG_GETSERIAL 0x00010004 -#define MBOX_TAG_GETBOARD 0x00010002 -#define MBOX_TAG_GETARMMEM 0x00010005 -#define MBOX_TAG_LAST 0x00000000 - -int mailbox_call(); -void get_board_revision(); -void get_arm_mem(); - -#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) -#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) -#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) -#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) -#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) -#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) -#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) -#define MBOX_RESPONSE 0x80000000 -#define MBOX_FULL 0x80000000 -#define MBOX_EMPTY 0x40000000 diff --git a/lab3_asy/shell/header/reboot.h b/lab3_asy/shell/header/reboot.h deleted file mode 100644 index e1d44aa1b..000000000 --- a/lab3_asy/shell/header/reboot.h +++ /dev/null @@ -1,8 +0,0 @@ -#define PM_PASSWORD 0x5a000000 -#define PM_RSTC 0x3F10001c -#define PM_WDOG 0x3F100024 - - -void set(long addr, unsigned int value); -void reset(int tick); -void cancel_reset(); diff --git a/lab3_asy/shell/header/shell.h b/lab3_asy/shell/header/shell.h deleted file mode 100644 index 9784c1ccb..000000000 --- a/lab3_asy/shell/header/shell.h +++ /dev/null @@ -1,2 +0,0 @@ -void shell(); -void parse_command(char* buffer); diff --git a/lab3_asy/shell/header/tasklist.h b/lab3_asy/shell/header/tasklist.h deleted file mode 100644 index de876b84c..000000000 --- a/lab3_asy/shell/header/tasklist.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TASKLIST_H -#define TASKLIST_H - -// #include -#include - -typedef void (*task_callback)(); - -typedef struct task { - struct task *prev; - struct task *next; - task_callback callback; - uint64_t priority; -} task_t; - -void execute_tasks(); -void create_task(task_callback callback,uint64_t priority); -void enqueue_task(task_t *new_task); -extern task_t *task_head; - -#endif diff --git a/lab3_asy/shell/header/timer.h b/lab3_asy/shell/header/timer.h deleted file mode 100644 index a9a8c65da..000000000 --- a/lab3_asy/shell/header/timer.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -#include -// #include - -typedef void (*timer_callback)(void *data); - -typedef struct timer { - struct timer *prev; // previous timer in the list - struct timer *next; // next timer in the list - timer_callback callback; // the function to call when the timer expires - void *data; // data to be passed to the callback - uint64_t expiry; // the time at which the timer will expire -} timer_t; - -extern timer_t *timer_head; // head of the timer list - -void setTimeout(char *message,uint64_t seconds); -#endif diff --git a/lab3_asy/shell/header/uart.h b/lab3_asy/shell/header/uart.h deleted file mode 100644 index 0c3ff1bd8..000000000 --- a/lab3_asy/shell/header/uart.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef UART_H -#define UART_H - -#include "gpio.h" -#include -#define UART_BUFFER_SIZE 1024 - -void uart_init(); -void uart_send_char(unsigned int c); -char uart_get_char(); -void uart_send_string(char* s); -void uart_hex(unsigned long long d); -void uart_enable_interrupt(); -int uart_async_read(char *buffer); -void uart_async_write(const char *buffer, int length); -void uart_async_send(const char *str); - - -extern char uart_read_buffer[UART_BUFFER_SIZE]; -extern char uart_write_buffer[UART_BUFFER_SIZE]; -extern int uart_read_index; -extern int uart_read_head; -extern int uart_write_index; -extern int uart_write_head; - -#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) -#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) -#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) -#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) -#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) -#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) -#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) -#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) -#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) -#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) -#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) -#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) - -#endif diff --git a/lab3_asy/shell/header/utils.h b/lab3_asy/shell/header/utils.h deleted file mode 100644 index 3ba6dd719..000000000 --- a/lab3_asy/shell/header/utils.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -// #include - -#define nop asm volatile("nop") - -#ifdef _cplusplus -#define NULL 0 -#else -#define NULL (void*)0 -#endif - -#ifndef __SIZE_TYPE__ -#define __SIZE_TYPE__ long unsigned int -#endif -// #if !(defined (__GNUG__) && defined (size_t)) -typedef __SIZE_TYPE__ size_t; - - -int utils_string_compare(const char* i, const char* j); -unsigned long utils_atoi(const char *s, int char_size); -void utils_align(void *size, unsigned int s); -uint32_t utils_align_up(uint32_t size, int alignment); -size_t utils_strlen(const char *s); -char *utils_strcpy(char* dst, const char *src); -char *utils_strdup(const char *src); diff --git a/lab3_asy/shell/initramfs.cpio b/lab3_asy/shell/initramfs.cpio deleted file mode 100644 index faf47b52fd58348135f4805c9dad3157d9e67fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmdT?QBH$E5Z&lsFW{%c0bF-sS>VS6D5fTUHN8NCP&T&E013u;Og(@n!5wS?6Ak=2 z*)Z9emwAtQ%N*t~&KQ$?8H74B!K0;47PBI6l(EI75P=L?hr3TNiU&1`s zDA8;KAM!Al`$DI`_#D^oU>d@^IWzctoQsjFeZpz|Qj<-lD$oZjP~-_+kU@*-%X`!? zr6rJzpJwCAX8pU{0rdw-)nP{n`Ajd~ui^5eZQCn-9dy{CDKH>8;9DU2YF)MX|jY?+f2b$2*~O!yH4)fw!Ie3z6^saG_$e_uFaDh9GC`c_v#{tX}E$c*tH}`Z4LRB1HTNVw>!-DQhlUotT}V6LL?5F412k#Ik=~}%00n0p`4sM~Z}-t5 zpZ`Cy<0yUN5>NW&sowN&%Y5nAuJWgUcWpuX^(BSr-&c=IpITLve)HDx>9=m5kbXOK zQF?Iw#PqxE7pLF9`(x>In<;mufOcfZ1tFsbGHM}XIb_@j87m-TC1k9EjGG|i(~$8Q z$oMQ|tcHx6A>$Uv2?s50atj6$0}=xg0}=y&sTi1kZfNRXO4s@H zynFV->VM$^>woeB>)&;O_5aNU)_?B>*1zlm>z{ss^G10(Mv=M^lUWuLx? zawSBk!uPJqrEmsu`l4WNn14ZP;MYS#JHz*m%LRvq9_Kbl*w5{hz1qF8fJ$v`adz`h zl)N*a_ogp}yk5vVeVZr!PSlqU7t&+gZwl@~pT|AgFw3R-Rk?R&dfXBU=E{gl-@qAz z_X&^tmXG?_@9+!co|s9wS3y4kS~sQYvc743C$6Gg0q_5PQx(mN_wSv!-t`us{gNBg z-9^FvN1*#EKTQhUQ~vED^7X9qQqNvs^~0vXV8UC}Q=g*rgGJQ8{F|Qiao?1_@RJ@l z13j!4x@L#J|AVpVfE*lWzf&USJZ=4L#0&F%};5|0kTo zjNtLpF?c)<8{dW>j7jf=V1LRxxTF+gQv$yb3Z;8NOBB+i5S46r)I;@qy}=yY7Hmom z?$}E%0h^uBkvTV1ne~;-wzi$!{EV^-aweaT{!#X@9YNT^<8pNGESGJwHuXY3+e4%D zAM!KqQ~I96llzvz)}Nmns?WEDb)Mb)kHh{${;4DI|DDSz_YN@NzEm){g!RGh0q7jT z0KV?_dN;i8(-`c44aYIo!KTC@WAHhH0o%v@Jm^nU(&L>N%r$rrXT`xB_o1dp)z@HW z2C;D5S32ABRFn7QOU7m%J04%^odw%C?ho$!Yd@8;Kf`UAk+!d(Z3NE||9D*4Hypy9 zIs-pP`^COyXmBwM&|_@;`&a*H|9G6We^=NshTS#PJK#0``QYDu@XrVTvOZ5=z)x

    ?%dE$s+p$F2JN_6-#K5L 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 diff --git a/lab3_asy/shell/kernel8.img b/lab3_asy/shell/kernel8.img deleted file mode 100644 index dd873cef73e7411e86bb78f21eb7e5bec3557803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12016 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 Jzr)Cy_+RmLk2(MV diff --git a/lab3_asy/shell/linker.ld b/lab3_asy/shell/linker.ld deleted file mode 100644 index 5018defb6..000000000 --- a/lab3_asy/shell/linker.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2018 bzt (bztsrc@github) - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - -SECTIONS -{ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } -} -__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/mailbox.c b/lab3_asy/shell/mailbox.c deleted file mode 100644 index 7e0c5d99c..000000000 --- a/lab3_asy/shell/mailbox.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "header/mailbox.h" - -volatile unsigned int __attribute__((aligned(16))) mailbox[36]; - -int mailbox_call() -{ - unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); - /* wait until we can write to the mailbox */ - do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); - /* write the address of our message to the mailbox with channel identifier */ - *MBOX_WRITE = r; - /* now wait for the response */ - while(1) { - /* is there a response? */ - do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); - /* is it a response to our message? */ - if(r == *MBOX_READ){ - /* is it a valid successful response? */ - if(mailbox[1] == MBOX_RESPONSE) - return 1; - } - } - return 0; -} - -void get_board_revision(){ - mailbox[0] = 7 * 4; // buffer size in bytes - mailbox[1] = MBOX_REQUEST; - // tags begin - mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier - mailbox[3] = 4; // maximum of request and response value buffer's length. - mailbox[4] = TAG_REQUEST_CODE; - mailbox[5] = 0; // value buffer - // tags end - mailbox[6] = MBOX_TAG_LAST; - mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. -} - -void get_arm_mem(){ - mailbox[0] = 8 * 4; // buffer size in bytes - mailbox[1] = MBOX_REQUEST; - // tags begin - mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier - mailbox[3] = 8; // maximum of request and response value buffer's length. - mailbox[4] = TAG_REQUEST_CODE; - mailbox[5] = 0; // value buffer - mailbox[6] = 0; // value buffer - // tags end - mailbox[7] = MBOX_TAG_LAST; - mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. -} diff --git a/lab3_asy/shell/mailbox.o b/lab3_asy/shell/mailbox.o deleted file mode 100644 index 8e2118f241e7cf5768d3e64c641e7118db6261bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< diff --git a/lab3_asy/shell/main.c b/lab3_asy/shell/main.c deleted file mode 100644 index 09914b45e..000000000 --- a/lab3_asy/shell/main.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "header/uart.h" -#include "header/shell.h" -#include "header/dtb.h" -#include "header/utils.h" -#include "header/cpio.h" -#include "header/timer.h" - -void test_read_command(char* buffer) { - int index = 0; - while(1) { - buffer[index] = uart_get_char(); - if(buffer[index] == '\n') { - buffer[index] = '\0'; - buffer[index+1] = '\n'; - uart_send_string("\r\n"); - break; - } - else - { - uart_send_char(buffer[index]); - } - index++; - } -} - -extern void *_dtb_ptr; -void main() -{ - - uart_init(); - // pre test ////////////////////////// - char buffer[256]; - while(1) - { - uart_send_string("# "); - test_read_command(buffer); - char * input_string = buffer; - if(utils_string_compare(input_string,"in")) - { - break; - } - else - { - // uart_send_hex((uintptr_t) _dtb_addr); - uart_send_string("The instruct is not exist.\n"); - } - } - ///////////////////////////////////////// - - // set up serial console - uart_init(); - - unsigned long el = 0; - asm volatile ("mrs %0, CurrentEL":"=r"(el)); - uart_send_string("Current exception level: "); - uart_hex(el>>2); // CurrentEL store el level at [3:2] - uart_send_string("\r\n"); - - asm volatile("mov %0, sp"::"r"(el)); - uart_send_string("Current stack pointer address: "); - uart_hex(el); - uart_send_string("\r\n"); - - // say hello - fdt_traverse(get_cpio_addr,_dtb_ptr); - traverse_file(); - uart_send_string("Type in `help` to get instruction menu!\n"); - - uart_enable_interrupt(); - - shell(); - /* - while(1){ - asm volatile("nop"); - } - */ - //echo everything back - //shell(); -} - - diff --git a/lab3_asy/shell/main.o b/lab3_asy/shell/main.o deleted file mode 100644 index c24ccc3615da8925de5fe98829cd15e359d31223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3808 zcmbuBUu+ab7{I@~Ed*;Rwf`uzk;PUlMAjB-Jcx#)1$iMvZAnbPY`1q)x_I3?cK1lJ zMr-1mFRh%42_Pgsa8(l?OnfoMs4pfy5TR8QA=UW6gAbb0)F#&YeY^7=&CIv6bMxAvBhSQRF<^@z=7n56mMKO`R#Icfb0J- zSpU-Tc(E1NvosK!nUBNFa!M<O9?wAe1vsl+gMzi3Uf!>y1gVE*=F{$iLv6Z5yAwa#8S)t4ZHSUtCTN6jwTvE31=pSHIBAc{n^UuutzkHj;Pzyx!Yu^cg+7d-FlF_tian zjGn%o5@Q&EhTsVhd--{&nRqbPUbhW&WSHAPhUj^qUcXp#N$WosFT|d^ee1@}dgw#^ zRA2$nLmT=){q^|8U6*$DzrEv~hY!Bnb-we^dk+nq>n=R<%I#Y}e*eSVJh@dB3Q+@p ztW`45Dt<8l8vZJYhLI|X2J6c3hJcjw@N=YDm5T=J%V20<&dE@N`^xOYacjemG199+ zZG?nP4MH!qlTzBK?Im;Dc_n4RfGwqLu|_h&3=Ud1pYy@Pqcwxe3xvPpcHGLF7-HQab>ixN;BUGKx%yQc zl=dwV{;cF%kv|}Hs_LX3jngc7G!D;)?Rlr`kvKfpu1FlV?~ZV`?}^0WywEvD!t-Iy zd7%6>g(kuCh}4Oz>wQ7tYMxIhoaaJ__BTm1&UAs8IQ>zx{4SM5#Qv_rRr|jrr}x#yL8!(y330r8l%z&-&clT4*&sRRfq9)0M_pHg z!nc;9<0VGn?F#RZ`a0~#dtynFQX|gaN`MUS?6_}@fPu$SSdX#hii~CWV!{U_ZTS`$ zBc2C_o23Ss_ZkUovJnzI8}m6Z=&Zy$A{cmi6vpAB$94y|L1`<-%u&}G7p1BFFGWXh zN=5XaH;Ig7D6C4)hLRR4l)D-%$*@^^PRW3!_k%q&4(E>dzz)fyH<3aq(!Ujop~|D! zpqT&FzZZQe<{m7noR^I&Dny;<&+|BhjP$bnNdx}B=P=RyC9$JY{{H0r$%WO)F?f8= zAKfEps2(h;Q6Vz=-xpD*W{n~H`Guhx_&xqD*0cQ^QZfn IDpCJ`0Q9AH_y7O^ diff --git a/lab3_asy/shell/reboot.c b/lab3_asy/shell/reboot.c deleted file mode 100644 index 048f2d348..000000000 --- a/lab3_asy/shell/reboot.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "header/reboot.h" - -void set(long addr, unsigned int value) { - volatile unsigned int* point = (unsigned int*)addr; - *point = value; -} - -void reset(int tick) { // reboot after watchdog timer expire - set(PM_RSTC, PM_PASSWORD | 0x20); // full reset - set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick -} - -void cancel_reset() { - set(PM_RSTC, PM_PASSWORD | 0); // full reset - set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick -} diff --git a/lab3_asy/shell/reboot.o b/lab3_asy/shell/reboot.o deleted file mode 100644 index dda9e282580625dcaef2ab81c697421da43712d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* diff --git a/lab3_asy/shell/rootfs/file1.txt b/lab3_asy/shell/rootfs/file1.txt deleted file mode 100644 index 5c275ef57..000000000 --- a/lab3_asy/shell/rootfs/file1.txt +++ /dev/null @@ -1 +0,0 @@ -This is file one. diff --git a/lab3_asy/shell/rootfs/one.img b/lab3_asy/shell/rootfs/one.img deleted file mode 100644 index 13bb5c616b672e699f602fb9c67dce4a755fcb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N diff --git a/lab3_asy/shell/rootfs/pack.sh b/lab3_asy/shell/rootfs/pack.sh deleted file mode 100644 index d837d685d..000000000 --- a/lab3_asy/shell/rootfs/pack.sh +++ /dev/null @@ -1,2 +0,0 @@ -find . | cpio -o -H newc > ../initramfs.cpio - diff --git a/lab3_asy/shell/rootfs/thisisfile2.txt b/lab3_asy/shell/rootfs/thisisfile2.txt deleted file mode 100644 index 0a8a2c0d7..000000000 --- a/lab3_asy/shell/rootfs/thisisfile2.txt +++ /dev/null @@ -1 +0,0 @@ -Here is file two with longer size. diff --git a/lab3_asy/shell/shell.c b/lab3_asy/shell/shell.c deleted file mode 100644 index c7d0d2bd9..000000000 --- a/lab3_asy/shell/shell.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "header/shell.h" -#include "header/uart.h" -#include "header/utils.h" -#include "header/mailbox.h" -#include "header/reboot.h" -#include "header/cpio.h" -#include "header/allocator.h" -#include "header/dtb.h" -#include "header/irq.h" -#include "header/timer.h" -#define BUFFER_MAX_SIZE 256u - - -extern void *_dtb_ptr; - -void async_read_command(char* buffer) { - int index = 0; - char tmp[1]; - - while (1) { - if (uart_async_read(tmp) > 0) { - buffer[index] = tmp[0]; - // uart_send_char(tmp[0]); - if (tmp[0] == '\r' || tmp[0] == '\n' || tmp[0] == '\0') { - buffer[index] = '\0'; - break; - } - index++; - } - } - // uart_send_string("out read_commandppppppppppppppp\n"); -} - - -void parse_command(char* buffer){ - // uart_send_string("in parse command\n"); - char* input_string = buffer; - char* parameter[5]; //5 is the available parameter length - int para_idx = 0; - int input_string_len = utils_strlen(input_string); - for(int i=0; i < input_string_len; i++){ - if(*(input_string+i) == ' '){ - *(input_string+i) = '\0'; - parameter[para_idx++] = (input_string+i+1); - } - } - - if(utils_string_compare(input_string,"help")) { - uart_async_send("help :print this help menu\n"); - uart_async_send("hello :print Hello World!\n"); - uart_async_send("info :Get the hardware's information\n"); - uart_async_send("reboot :reboot the device\n"); - uart_async_send("ls :list the file\n"); - uart_async_send("cat :print file content\n"); - uart_async_send("malloc :give dynamic memory space\n"); - uart_async_send("dtb :print device tree\n"); - uart_async_send("exec :execute user program\n"); - } else if (utils_string_compare(input_string,"hello")) { - // uart_send_string("Hello World!\n"); - uart_async_send("Hello World!\n"); - } else if (utils_string_compare(input_string,"info")) { - get_board_revision(); - uart_async_send("My board revision is: "); - uart_hex(mailbox[5]); - uart_async_send("\n"); - get_arm_mem(); - uart_async_send("My ARM memory base address is: "); - uart_hex(mailbox[5]); - uart_async_send("\n"); - uart_async_send("My ARM memory size is: "); - uart_hex(mailbox[6]); - uart_async_send("\n"); - } else if (utils_string_compare(input_string,"reboot")) { - uart_async_send("Rebooting....\n"); - reset(1000); - } else if (utils_string_compare(input_string,"ls")) { - cpio_ls(); - } else if (utils_string_compare(input_string,"cat")){ - //uart_send_string("Filename: "); - //char filename[BUFFER_MAX_SIZE]; - //read_command(filename); - //cpio_cat(filename); - cpio_cat(parameter[0]); - } else if (utils_string_compare(input_string,"malloc")){ - char *a = simple_malloc(sizeof("9876")); - char *b = simple_malloc(sizeof("345")); - a[0] = '9'; - a[1] = '8'; - a[2] = '7'; - a[3] = '6'; - a[4] = '\0'; - b[0] = '3'; - b[1] = '4'; - b[2] = '5'; - b[3] = '\0'; - uart_async_send(a); - uart_async_send("\n"); - uart_async_send(b); - uart_async_send("\n"); - } else if (utils_string_compare(input_string,"dtb")) { - fdt_traverse(print_dtb,_dtb_ptr); - } else if (utils_string_compare(input_string,"exec")) { - //uart_send_string("Program name: "); - //char buffer[BUFFER_MAX_SIZE]; - //read_command(buffer); - cpio_exec_program(parameter[0]); - } else if (utils_string_compare(input_string,"timer")) { - - setTimeout("hello world1",3); - setTimeout("hello world2",6); - setTimeout("hello world3",9); - - } else if (utils_string_compare(input_string,"settimeout")) { - char *message = (char *)parameter[0]; - size_t second_str_len = utils_strlen(parameter[1]); - uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); - setTimeout(message,seconds); - } else { - uart_async_send("The instruction "); - uart_async_send(input_string); - uart_async_send(" is not exist.\n"); - } - // uart_send_string("out parse command\n"); -} - - -void shell(){ - while(1) { - // uart_send_string("in shell\n"); - char buffer[BUFFER_MAX_SIZE]; - uart_send_string("# "); - async_read_command(buffer); - // uart_send_string("testyyyyyyyyyyyyyyyyyyyyyyy\n"); - parse_command(buffer); - // uart_send_string("out shell\n"); - } - -} - - - diff --git a/lab3_asy/shell/shell.o b/lab3_asy/shell/shell.o deleted file mode 100644 index 13891dfbc2dc87acae4334f07976b538b934e81c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7216 zcmcJTe`p-X702J{&X#1!j$`eVimcEUO3!4MQW%EQmvLyY9l95WI;;`h1SG>IN-GU!%&erMU*65nnDEiA1ZdhE>_g{ zcHcXVM%q#W9oUVwwxBK!}k3Lru3W1~${2tb7LIIXr*2*!j7=!K52rJ`P zFRz4Q>h|%_<=Y>_)SWQQecA-~o+?lLbgvP9uM%#WL-Xmq0H=Pvx;p&P$FYNzaP!GS?P-hPm=OMF z2z|kMPLh9Z08^xSEeze5PvYg({~u+V8|ki$zcb6@G;i<&p!d`r3qS zx+Zqdse!5T!?7!sFg$_n)3O#+R_z09s&OdqUavvEvHu%<$Ia8NYJ2neet9U!J{E$f z^!bwp^{YHWd%%lR^M4z&QUl#HP=1%@bsP6bnai{n_tpMr$b9wHp}+s}S9YQXuDrYp z4qnqalj`rRu0EpsW}t7xXpZDl8^rDbUX+WkdY>6yPjx=J zO$BvL-|uSN-`48hc%kyUJdW6HSc4hVy7TA$%QByjFb-74z5hJT%da=jsWGMb;I%Fe z)J~koqqgRi@!wSM#b%1Z4`FH=<0mnbF(v;u#t{2K+R7FsukS6|nY?Sb>5OAggORiH zrESzqcG-d$3{b`RX2H&;+Wcn7C?LY_=*D^V!8 z^}T-X8KmO zc{7(uqWigmJ!UvXv#OtR6QbjfYq++BgIJ>$_NL#GYZ)cSvW=o$7_rTqKZG}b^k1Jk zO^@PpY|Ka$aMp&6vvF{;M#kwi0K`FT?;AQM9wki2GR#!Uwj7KQ8Ln@4GG{EG`*8vo z^5T}sk3=z{Xx5=o0WdCJ?#~|p=jYXFCRA`UIm^b}^WS)pmaL1oQa_;8ze07#a;a;f zSiO+S9lf+L6g)Ek*5pJ7O2=F4p#+-#WeJ(9a@6 zAAa!OUvBPz32cf{JEn7C{OQ{TngUk+9OMMLk{tyNZJ&zY9I%Lt0nVJjj7a!|Czi+yYKybqI1|OCGTHVYd z4AiKchPn-mKp3`e;13|# zrOek`cVzqUl0Bk!qD@QoV&|j9kpd~7!E zZv*(10RE={z7W9w7QjCV;P`Oe)XxZRwaxs006DGKGH+e)K0%F#0_?$|6Dpd7_EBh0 zf$5CplX2TJQ}JXWmoxJzD4Dh!U*k|TZO2+`bu(Efj^|a@%0o#icz%)vnp$dq$3nfF znaL&!qcCE*aqlR{;ryfAH%(i9n`!6b_+Y^&8J>}lEM^LEI)uFfp2|)pSIk;*K9A#g z9>?F`Ns=uN^N+ zdoYgM{i65F$F|4m-jZ~c3r%RR-i6nh(|V{}&Nb3k*Om4WCDD;P{ict-btN6)i_A&q zK`vAFK9@zOgXfcbf>d#GutM-e` zW!$q|f1h(1S9m2r=a$0NaqlzN_Yc(glb3O4*shMbj4Qm6xxRmzHJw@3Y0-3qw<xWeZZ9d%t60{CJ8uP~Q!7kJzy z<}$AETZ)dlUU!(&xwKoE?_GuOQMkOS^l0`G{vSwOwcp8{*0EL5X=X0|FJe2TR_5Zr zaD%zNUfqiR7kvruw@1^juzpO_7k)TEe^Ap|Vx3`4NBFlCoktaaPG~xJStq6G2u}y- zjA}Y^j=ZGl2ro0I_^bX*XgV#t-tyih@fSYH_Imth6t4a+eN*B1t+|@6GuQo@XD<7p zgZ;U|T>KHfpy;dj(P99vX!o+vM%zi`E8Oyn50&~~)^R$#~D{DqwYt)5k z%5+VLCL9N%c7ZBn-WBbED7~)XhdPMjS0XEV9}U{duT_!t#te(eq*zE^v|Ce z*cGR`?%jpdV)TQlo#W)!*8le-MrRP2#PCv62M4=_bNZe~$o{&95^pn>==e#DSbxf3rny~QtsP@n7(_v9Q_t#dv`R*pSwb`bvLUKk`Q(o4PFUC$COk pmw{{WKoO~wEK diff --git a/lab3_asy/shell/start.S b/lab3_asy/shell/start.S deleted file mode 100644 index 4f9f5ba36..000000000 --- a/lab3_asy/shell/start.S +++ /dev/null @@ -1,163 +0,0 @@ - -.section ".text.kernel" - -.global _start - - - -_start: - ldr x1, =_dtb_ptr //put _dtb_ptr into register1 - str x0, [x1] //store dtb address from x0 to _dtb_ptr - // read cpu id, stop slave cores - mrs x1, mpidr_el1 - and x1, x1, #3 - cbz x1, 2f - // cpu id > 0, stop -1: wfe - b 1b -2: // cpu id == 0 - - ldr x1, =_start - bl from_el2_to_el1 - mov sp, x1 - - - /* set exception vector table */ - adr x0, exception_vector_table - msr vbar_el1, x0 // vbar -> Vector Base Address Register - - //bl core_timer_enable - - // clear bss - ldr x1, =__bss_start - ldr w2, =__bss_size - -3: cbz w2, 4f - str xzr, [x1], #8 - sub w2, w2, #1 - cbnz w2, 3b - //bl core_timer_enable - // jump to C code, should not return -4: bl main - // for failsafe, halt this core too - b 1b - -from_el2_to_el1: - mov x0,#(1<<31) - msr hcr_el2,x0 - mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable - msr spsr_el2,x0 // spsr -> saved program status register - msr elr_el2,lr // lr->link register elr->Eeception Link Register - eret -/* -core_timer_enable: - //mov x0,1 - //msr cntp_ctl_el0, x0 //enable - //mrs x0, cntfrq_el0 - //mov x3,5 - //mul x0, x0, x3 - //msr cntp_tval_el0,x0 // set expired time - //mov x0,2 - //ldr x1, =CORE0_TIMER_IRQ_CTRL - //str w0,[x1] //unmask timer interrupt - //ret -*/ -// save general registers to stack -.macro save_all - sub sp, sp, 32 * 8 - stp x0, x1, [sp ,16 * 0] - stp x2, x3, [sp ,16 * 1] - stp x4, x5, [sp ,16 * 2] - stp x6, x7, [sp ,16 * 3] - stp x8, x9, [sp ,16 * 4] - stp x10, x11, [sp ,16 * 5] - stp x12, x13, [sp ,16 * 6] - stp x14, x15, [sp ,16 * 7] - stp x16, x17, [sp ,16 * 8] - stp x18, x19, [sp ,16 * 9] - stp x20, x21, [sp ,16 * 10] - stp x22, x23, [sp ,16 * 11] - stp x24, x25, [sp ,16 * 12] - stp x26, x27, [sp ,16 * 13] - stp x28, x29, [sp ,16 * 14] - str x30, [sp, 16 * 15] -.endm - -// load general registers from stack -.macro load_all - ldp x0, x1, [sp ,16 * 0] - ldp x2, x3, [sp ,16 * 1] - ldp x4, x5, [sp ,16 * 2] - ldp x6, x7, [sp ,16 * 3] - ldp x8, x9, [sp ,16 * 4] - ldp x10, x11, [sp ,16 * 5] - ldp x12, x13, [sp ,16 * 6] - ldp x14, x15, [sp ,16 * 7] - ldp x16, x17, [sp ,16 * 8] - ldp x18, x19, [sp ,16 * 9] - ldp x20, x21, [sp ,16 * 10] - ldp x22, x23, [sp ,16 * 11] - ldp x24, x25, [sp ,16 * 12] - ldp x26, x27, [sp ,16 * 13] - ldp x28, x29, [sp ,16 * 14] - ldr x30, [sp, 16 * 15] - add sp, sp, 32 * 8 -.endm - - - -exception_handler: - save_all - bl except_handler_c - load_all - eret - -irq_exception_handler: - save_all - bl uart_irq_handler - load_all - eret - -.align 11 // vector table should be aligned to 0x800 -.global exception_vector_table -exception_vector_table: - b exception_handler // branch to a handler function. - .align 7 // entry size is 0x80, .align will pad 0 - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b irq_exception_handler - .align 7 - b irq_exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b irq_exception_handler - .align 7 - b irq_exception_handler - .align 7 - b exception_handler - .align 7 - - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - b exception_handler - .align 7 - -.global _dtb_ptr //define a global variable _dtb_ptr -.section .data //_dtb_ptr is in data section -_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 - diff --git a/lab3_asy/shell/start.o b/lab3_asy/shell/start.o deleted file mode 100644 index 2a7d92cb0cfce21c71794f218a84f99e20ce9226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7632 zcmeHM&1(}u6o1LCrqzBcG_=L0P^gGTDt=L<-B$adwpzVdy)2t%HNiBgn^kLtwum<` zt@PA`T5kg$JP1Nh{TD36gQp-OA|g^m+ETl|+3YmyB)#;|QP_dqdGnk1e!rPFvjfRY zcK7%AeLi5t2X7(YVkp3Leco1VQ-M+_$%CHdWx&gTmjN#WUIx4j{5KisoPwbc!0J4l z&NRu&Qw`va8j>=WW!274!cZB&YzM#$PN)hNgPBgmA`=jN1aQ3LF|2gSaOI_CoxuLt zWsCuMy#&<_nHRCCB~ThN?f7J+=kF~^ewPgZ`B>>ApKAT&bE8DQw8-S^(Ou-*somsz zM}Yk3Eg{R7OUch`d&n|95esocp5S1-s9!K+XLPn@b-YW2X<-?)NNR` zJEc`jXYIFG{SSim7X<6i3D$omSbsvWew$$ZI>Gt}1nY0Ci#>l91nbWU)*lzFe?zc- zn_zwXO}*_R6}>3{kicJ*Q^KBNMFP11&fP&2;yFZyK`tU_w`GWN_ zRhX{K;mp5;!>?j=Rgv)@vGKw@oMiso)yaU3oE_!jv17C1DI!A&DI zqUwobs+q#772?JnRUaGHN6mODsm8QqG@%>N90fIMM$}Q$fPC*geb`JHs;Na1I;d(S zomSJPW|+*5kLxg^#gk45V^fFWE_$g{iV4{BI%vNEYH%Sc9Gg~sj$MyvF9{2c-PekA>&X zkDPYlR|^nw9J0=U0~ky910P?C7(aJ}037`%b|e4d=TG-`vG_sf{priority < task_head->priority) { - new_task->next = task_head; - new_task->prev = NULL; - if (task_head) { - task_head->prev = new_task; - } - task_head = new_task; - } else { - // Find the correct position in the list - task_t *current = task_head; - while (current->next && current->next->priority <= new_task->priority) { - current = current->next; - } - - // Insert the new task - new_task->next = current->next; - new_task->prev = current; - if (current->next) { - current->next->prev = new_task; - } - current->next = new_task; - } - - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); -} - -void create_task(task_callback callback, uint64_t priority) { - - task_t* task = simple_malloc(sizeof(task_t)); - if(!task) { - return; - } - - task->callback = callback; - task->priority = priority; - - enqueue_task(task); -} - -void execute_tasks() { - - uart_send_string("in exe \n"); - while (task_head) { - task_head->callback(); - task_head = task_head->next; - if (task_head) { - task_head->prev = NULL; - } - asm volatile("msr DAIFSet, 0xf"); // Disable interrupts - //simple_free(task); - } - - asm volatile("msr DAIFClr, 0xf"); // Enable interrupts -} - diff --git a/lab3_asy/shell/tasklist.o b/lab3_asy/shell/tasklist.o deleted file mode 100644 index 146e1ff6ec4c330e30a5635b9d93189864fe84b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 zcmbW1Pe>F|7{I^T8O!{a|DwonCt1QM2Uk2;1dUp0AQhUB5bciZl;ZAcJF{RJ=_TmU zLD6gBvGvqpB~KC2!9$0r^j3N35C}oop&@MhzS;M5dd_y}TV~$(e&3(>&HLWIsq;M- z0+Iw=BzO)xGfn~2Jv+MYsydWI8GODhuLb~S+Cg_D8M1Pj?u77}0%fB?f~!FVGAe+B zF-{JBU&@iS2G<_gkkS4{mKKjHx?|*WOUgaSOe;Hn3X3K7E0;SMMEf@!wM62XuG88Si);p;SvN;1I5qkCd^Dgt z(-LHZs=Nxtx&v@_jTm5k(SZ96*&u!geKYa(-?=6Frp;2_p|vRgNK!Q?Otl1{tF!a8 z+SossPTFZT9M)R3=B9AkordqXv}nz(#~H?2ppsrF(%oKAChDcSvY^Wjb9Ihjq*HWB+AAv9R2*SA+Pf6=XS-mVU5N|EL)2~ zXaYh*U?y*;&9oUI1H@9MVKdztNsPzMNWzH6$6|n|HkM{43(`i)j#y@LC}P>Ek>o9) z=*X~X46(ZSPS;@TxK1WsN4>xsS)9lpFer}=y=jQ`7>rTQp2641g z`Ei(QDKlvU zd4Np=pyJoRadw4wGe_zl#qxOGKUzjy tn?i~iTw!&TBBOgkjHmq-dxr?#GB`*RkBHkscY|O2GOK^s6HBTX{|9Ma^KAeC diff --git a/lab3_asy/shell/timer.c b/lab3_asy/shell/timer.c deleted file mode 100644 index 7e84400b9..000000000 --- a/lab3_asy/shell/timer.c +++ /dev/null @@ -1,102 +0,0 @@ -#include "header/timer.h" -#include "header/allocator.h" -#include "header/uart.h" -#include "header/irq.h" -#include "header/utils.h" - -timer_t *timer_head = NULL; - -void add_timer(timer_t *new_timer) { - - timer_t *current = timer_head; - - // Disable interrupts to protect the critical section - asm volatile("msr DAIFSet, 0xf"); - // Special case: the list is empty or the new timer is the earliest - if (!timer_head || new_timer->expiry < timer_head->expiry) { - new_timer->next = timer_head; - new_timer->prev = NULL; - if (timer_head) { - timer_head->prev = new_timer; - } - timer_head = new_timer; - - // Reprogram the hardware timer - asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); - asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); - - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); - return; - } - - // Find the correct position in the list - while (current->next && current->next->expiry < new_timer->expiry) { - current = current->next; - } - - // Insert the new timer - new_timer->next = current->next; - new_timer->prev = current; - if (current->next) { - current->next->prev = new_timer; - } - current->next = new_timer; - // Enable interrupts - asm volatile("msr DAIFClr, 0xf"); -} - - -void create_timer(timer_callback callback, void* data, uint64_t after) { - //Allocate memory for the timer - timer_t* timer = simple_malloc(sizeof(timer_t)); - if(!timer) { - return; - } - - //Set the callback and data - timer->callback = callback; - timer->data = data; - - //Calculate the expiry time - uint64_t current_time, cntfrq; - asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); - asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); - timer->expiry = current_time + after * cntfrq; - //Add the time to the list - add_timer(timer); -} - - -void print_message(void *data) { - char *message = data; - uint64_t current_time, cntfrq; - asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); - asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); - uint64_t seconds = current_time / cntfrq; - - uart_send_string("Timeout message: "); - uart_send_string(message); - uart_send_string(" occurs at "); - uart_hex(seconds); - uart_send_string("\n"); -} - -void setTimeout(char *message,uint64_t seconds) { - - char *message_copy = utils_strdup(message); - - if(!message_copy){ - return; - } - - if (!timer_head) { - //enable core_timer_interrupt - unsigned int value = 2; - unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt - *address = value; - } - - create_timer(print_message,message_copy,seconds); -} - diff --git a/lab3_asy/shell/timer.o b/lab3_asy/shell/timer.o deleted file mode 100644 index 2073fbde9b7685a25c77b303f1959a2feaf6cbc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3064 zcmbW2O>7%Q6oB7)o#LixNSjn30?nq1P(gHMhe$+$!#YtZNKpw*DuINsH}*D;u;a+P zmI8@LihAggs^J1^4?V>>aR{OuKvlW+R0y}03UMokK!}77k$G?Sy=JnpCB#_c_vYL8 zGxKI?=Ie5LrL~MeU`aNJ&yb`IQ3uOF*iR$dCPD(`Y=iyZF7fUSoaRjIHl* z0UIYKjM^!zgMqz2(ft*zai`m<8(mP}UHp;O*&~d`G&frB{(2g!K28iawkf`eInN zJ2~_cWAwm1QqB0}0>l?i8oeETU?F)n#PA-;bf| ziCPl-gwg;$Aert=-Z*r#ZS;D4)g1dGHs1d5!6rGUkBqSfLuht|eU?I>y#729V9Pun&+Q)Ar@b$^*P06*~t5c^FuL`O55Ekm1V$Rkspkd~YtF@dJD? z6M}-b0B$~?QJ#>icy8eFz@IJ67rji$Ef&i;@V$VqA5??cqEAus)p<~knS$r$0iMTs zQR~Ka=%>I^6yQXJ4>0dV-pM+NS6c8SbBQnalkN{Si7$LO#1M_|Xq?W1w6|E1_@{Y1 z!BXN2pJM)8Wd2#^6h}YZSR&OxS+?yAfN52Ri`lhfCiO6)+{iT>u|1S2Id=er$PI1gZF<>eFFGsle%RC%>PP)7= z#C(MF%lk#R_=$X*{pGpHOaF2GAF_YcyujeL1Y{}m7yLdd&Gv7LKZ#j3r2Qjb@t6Ih xbwqQMi^Urvbv%NM?q$@UzRS_QLj*}aKg%@Gn$%6uF;trQPjI4w7_yA|{|i80T(tlI diff --git a/lab3_asy/shell/uart.c b/lab3_asy/shell/uart.c deleted file mode 100644 index 55bf7f956..000000000 --- a/lab3_asy/shell/uart.c +++ /dev/null @@ -1,209 +0,0 @@ -#include "header/uart.h" -#include "header/irq.h" -#include "header/utils.h" - -#define RX_INTERRUPT_BIT 0x01 -#define TX_INTERRUPT_BIT 0x02 - -#define AUXINIT_BIT_POSTION 1<<29 - -char uart_read_buffer[UART_BUFFER_SIZE]; -char uart_write_buffer[UART_BUFFER_SIZE]; -int uart_read_head = 0; -int uart_read_index = 0; -int uart_write_index = 0; -int uart_write_head = 0; - -/** - * Set baud rate and characteristics (115200 8N1) and map to GPIO - */ -void uart_init() -{ - register unsigned int r; - // P.104 Since I need UART 1 Transmit/Receive Data -> TXD1/RXD1 - // p.102 I find These two in GPIO 14/15 Fun5 - // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 - // That's why I need GPFSEL1 - r=*GPFSEL1; - r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 - r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 - *GPFSEL1 = r; // from here activate Trasmitter&Receiver - - //Since We've set alt5, we want to disable basic input/output - //To achieve this, we need diable pull-up and pull-dwon - *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down - //Wait 150 cycles - //this provides the required set-up time for the control signal - r=150; while(r--) { asm volatile("nop"); } - // GPIO control 54 pins - // GPPUDCLK0 controls 0-31 pins - // GPPUDCLK1 controls 32-53 pins - // set 14,15 bits = 1 which means we will modify these two bits - // trigger: set pins to 1 and wait for one clock - *GPPUDCLK0 = (1<<14)|(1<<15); - r=150; while(r--) { asm volatile("nop"); } - *GPPUDCLK0 = 0; // flush GPIO setup - - - r=1000; while(r--) { asm volatile("nop"); } - - /* initialize UART */ - *AUX_ENABLE |=1; - //P.9: If set the mini UART is enabled. The UART will - //immediately start receiving data, especially if the - //UART1_RX line is low. - //If clear the mini UART is disabled. That also disables - //any mini UART register access - *AUX_MU_CNTL = 0; - //P.17 If this bit is set the mini UART receiver is enabled. - //If this bit is clear the mini UART receiver is disabled - //Prevent data exchange in initialization process - *AUX_MU_IER = 0; - //Set AUX_MU_IER_REG to 0. - //Disable interrupt because currently you don’t need interrupt. - *AUX_MU_LCR = 3; - //P.14: 00 : the UART works in 7-bit mode - //11(3) : the UART works in 8-bit mode - //Cause 8 bits can use in ASCII, Unicode, Char - *AUX_MU_MCR = 0; - //Don’t need auto flow control. - //AUX_MU_MCR is for basic serial communication. Don't be too smart - *AUX_MU_BAUD = 270; - //set BAUD rate to 115200(transmit speed) - //so we need set AUX_MU_BAUD to 270 to meet the goal - *AUX_MU_IIR = 0xc6; - // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 - // Writing with bit 1 set will clear the receive FIFO - // Writing with bit 2 set will clear the transmit FIFO - // Both bits always read as 1 as the FIFOs are always enabled - /* map UART1 to GPIO pins */ - *AUX_MU_CNTL = 3; // enable Transmitter,Receiver - -} - - -/** - * Send a character - */ -void uart_send_char(unsigned int c) { - /* wait until we can send */ - // P.15 AUX_MU_LSR register shows the data(line) status - // AUX_MU_LSR bit 5 => 0x20 = 00100000 - // bit 5 is set if the transmit FIFO can accept at least one byte. - // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop - // else FIFO can not accept at lease one byte then still wait - do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); - /* write the character to the buffer */ - //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the - //UART FIFOs. - //communicate with(send to) the minicom and print to the screen - *AUX_MU_IO=c; -} - -/** - * Display a string - */ -void uart_send_string(char* s) { - while(*s) { - /* convert newline to carriage return + newline */ - if(*s=='\n') - uart_send_char('\r'); - uart_send_char(*s++); - } -} - -/** - * Receive a character - */ -char uart_get_char() { - char r; - /* wait until something is in the buffer */ - //bit 0 is set if the receive FIFO holds at least 1 symbol. - do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); - /* read it and return */ - r=(char)(*AUX_MU_IO); - /* convert carriage return to newline */ - return r=='\r'?'\n':r; -} - - -/** - * Display a binary value in hexadecimal - */ -void uart_hex(unsigned long long d) { - unsigned long long n; - int c; - uart_send_string("0x"); - for(c=28;c>=0;c-=4) { - // get highest tetrad - n=(d>>c)&0xF; - // 0-9 => '0'-'9', 10-15 => 'A'-'F' - n+=n>9?0x57:0x30; - uart_send_char(n); - } -} - -void uart_enable_interrupt() { - - // Enable RX and TX interrupt for mini UART - uint32_t ier = mmio_read(AUX_MU_IER); - ier |= RX_INTERRUPT_BIT; - //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); - mmio_write(AUX_MU_IER, ier); - - // Enable the mini UART interrupt in the second-level interrupt controller - // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; - uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); - enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 - mmio_write(ENABLE_IRQS_1, enable_irqs1); -} - -void uart_disable_interrupt() { - // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; - uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); - disable_irqs1 |= AUXINIT_BIT_POSTION; - mmio_write(DISABLE_IRQS_1,disable_irqs1); -} - -int uart_async_read(char *buffer) { - // uart_send_string("in uart_async_read\n"); - if (uart_read_head == uart_read_index) { - // No characters available - return 0; - } else { - // uart_send_string("flag \n"); - buffer[0] = uart_read_buffer[uart_read_head++]; - if (uart_read_head >= UART_BUFFER_SIZE) { - uart_read_head = 0; - } - return 1; - } -} -void uart_async_write(const char *buffer, int length) { - // uart_write_head = 1; - // uart_read_index = 1; - for (int i = 0; i < length; i++) - { - // uart_send_string("qq\n"); - uart_write_buffer[uart_write_index++] = buffer[i]; - if (uart_write_head >= UART_BUFFER_SIZE) { - uart_write_head = 0; - } - } - // Trigger TX interrupt - /// uart_send_string("Triiger TX interrupt\n"); - /// uart_hex(uart_write_index); - /// uart_hex(uart_write_head); - mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); - /// uart_send_string("flag1\n"); - /// uart_hex(uart_write_index); - /// uart_hex(uart_write_head); -} - -void uart_async_send(const char *str) { - // uart_send_string("in uart asy send ===========================\n"); - int length = utils_strlen(str); - uart_async_write(str, length); -} - - diff --git a/lab3_asy/shell/uart.o b/lab3_asy/shell/uart.o deleted file mode 100644 index e16ca5d25c6769be1f4ad24fbc62bfd36b665e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3856 zcmbtXU2IfU5T3jDwk*(=rPM$K?G{!*BWt&*r1;X?mLE+}VN(({#O?mvvJLIh?%s{X zqTN!6ruBgeA%@7$1BRc(ga;C-F+xQRF+Pwr8WRN(i9X;1&=)b5b>`j~SkAVIi6^-` zGv7Hg^PMwu&+ZPc+qmANX&^&`PvC(iD8S{p4|LN}O{jzl*bTY-aCI*4xpCr-j*kI* z!WXJ@;TAB*18^)|m#C_)1LLU{fbl_mYW@26U_jqQq0p`^KtK2(tf3$IES+W^-pV=i z%{*7^KMW&ztzsm<4E^iy+3Ow2zcYIz-+{TGKzju~<#R^zNVlN_{VB$B#Ei<3{CU)4 zkP8RU2K2d(wjcFhP<~aH3-3jFaZxU;qaAS%J1iO z8klP|4>ZzR1LtTx<@rdlXfYtRRwp?ih)sey@; zly5i2)LIWZv9xO^?wG_0YhdD9;tZfSAP476huRM2X^o0YF5->nKlU4P51_AUnBzwQ zw&(B+Tm3MWGhjZ&@?$MqFD05{0Be@wy2wBC`d$QRre~Z@`Z}UAremog%sxx5BxK-OU z$ax|@FZNgY%?Uh*A>6;)546|X`+KE5O$~g0ifS-97w%5tp72}_)FP)<$O(IGUmQ7k zkkdBg)PbBdE`hI{7ZEer_S8j=AQ+C!L3I!X3^{YZz#|*vQ&=9O|e3D@RA35RB-VB4$ z|G2ieqSnC{xiI|6lGZ)VdY}k1S>IZOwX@#HatX>L>%Amfs(gn%N3_?jUa2CJV!ulY z4#`2-hYkWDTnIbE*d~^QeaZSRmVT5!vhKuasq!B-j_9rXJ@KnozH@T&bcvw5(}3HB zk_iO#X>V4-vGUUl9V4m3>j0Fcbm&l40=n1sOn7O03ZTQR8RB@MreucJyR6hH9m-V* z=tANP248#{(kB+`l-Fcj zdWCv{aD304A^q|m<7XI`o;l2TJ(tqy8^k`whk8sMpCT|H>+9pAlS+KUxR(LJe_~v0 zkvADf;S9n5M$3sW0LuzI7sBsXOy;xEv>l8?pdSJWAS2S1>atxeW2F+2cruzUGBb9% zE49r9wpn)3bkgc~VJj7lbz2z6w$kZrF9%C>Wu}9pnVqS4ByB}GyKBFZ?y@a6nhOvW z$l6`qnFuoIwo>k-vo4an@9o-Msf2K$z{uobTU{T^c6M64NymW!Jj;{ZPYX~MclBAu zA5rjgj4wtx&n=DfDg8uoGvEhiz>m#7rymlRy?gP#>#?gI#BcJ|oO7)m?s%A{y%t2-LBt$rJViKrcgU@Vh?V0s4` zv^*4Sf?#|{Pmh(tC8-^@72NRBmQ@)$8sCoV$lFRrI@8e}y3PLI@S{7Hv diff --git a/lab3_asy/shell/userprogram/Makefile b/lab3_asy/shell/userprogram/Makefile deleted file mode 100644 index 19cefe3cf..000000000 --- a/lab3_asy/shell/userprogram/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -all: one.img - -one.o: one.S - aarch64-linux-gnu-gcc -c one.S -o one.o - -one.img: one.o - aarch64-linux-gnu-ld one.o -T linker.ld -o one.elf - aarch64-linux-gnu-objcopy -O binary one.elf one.img - -clean: - rm one.o one.elf > /dev/null 2>/dev/null || true diff --git a/lab3_asy/shell/userprogram/linker.ld b/lab3_asy/shell/userprogram/linker.ld deleted file mode 100644 index ab70a30ea..000000000 --- a/lab3_asy/shell/userprogram/linker.ld +++ /dev/null @@ -1,19 +0,0 @@ -SECTIONS -{ - . = 0x80000; - .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } - PROVIDE(_data = .); - .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } - .bss (NOLOAD) : { - . = ALIGN(16); - __bss_start = .; - *(.bss .bss.*) - *(COMMON) - __bss_end = .; - } - _end = .; - - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } -} -__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_asy/shell/userprogram/one.S b/lab3_asy/shell/userprogram/one.S deleted file mode 100644 index 4acf6f4dd..000000000 --- a/lab3_asy/shell/userprogram/one.S +++ /dev/null @@ -1,7 +0,0 @@ -.section ".text" -.global _start -_start: - svc 0x1337 -1: - nop - b 1b diff --git a/lab3_asy/shell/userprogram/one.elf b/lab3_asy/shell/userprogram/one.elf deleted file mode 100644 index b13e36ed9627aa5a41acd8767b43259aeddc6b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB diff --git a/lab3_asy/shell/userprogram/one.img b/lab3_asy/shell/userprogram/one.img deleted file mode 100644 index 13bb5c616b672e699f602fb9c67dce4a755fcb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N diff --git a/lab3_asy/shell/userprogram/one.o b/lab3_asy/shell/userprogram/one.o deleted file mode 100644 index c00c28e5b03a97b1c7da93cb70b11273c5c3833a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T diff --git a/lab3_asy/shell/utils.c b/lab3_asy/shell/utils.c deleted file mode 100644 index 8242d820c..000000000 --- a/lab3_asy/shell/utils.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "header/utils.h" -#include "header/allocator.h" - -int utils_string_compare(const char* str1,const char* str2) { - for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ - if(*str1 != *str2) return 0; - else if(*str1 == '\0' && *str2 =='\0') return 1; - } - return 1; -} - -unsigned long utils_atoi(const char *s, int char_size) { - unsigned long num = 0; - for (int i = 0; i < char_size; i++) { - num = num * 16; - if (*s >= '0' && *s <= '9') { - num += (*s - '0'); - } else if (*s >= 'A' && *s <= 'F') { - num += (*s - 'A' + 10); - } else if (*s >= 'a' && *s <= 'f') { - num += (*s - 'a' + 10); - } - s++; - } - return num; -} - -void utils_align(void *size, unsigned int s) { - unsigned long* x = (unsigned long*) size; - unsigned long mask = s-1; - *x = ((*x) + mask) & (~mask); -} - -uint32_t utils_align_up(uint32_t size, int alignment) { - return (size + alignment - 1) & ~(alignment-1); -} - -//with null-terminator -> "hello" return 6 -size_t utils_strlen(const char *s) { - size_t i = 0; - while (s[i]) i++; - return i+1; -} - - -char *utils_strcpy(char* dst, const char *src) { - char *save = dst; - while((*dst++ = *src++)); - return save; -} - - -char *utils_strdup(const char *src) { - size_t len = utils_strlen(src); - char *dst = simple_malloc(len); - if (dst == NULL) { // Check if the memory has been successfully allocated - return NULL; - } - utils_strcpy(dst, src); // Copy the string - return dst; -} - - diff --git a/lab3_asy/shell/utils.o b/lab3_asy/shell/utils.o deleted file mode 100644 index 74670709cc74f02475f1c6c05ac4403bb067de43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Thu, 25 Apr 2024 13:03:02 +0800 Subject: [PATCH 09/24] Create ReadMe.md --- lab_asyn/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab_asyn/ReadMe.md diff --git a/lab_asyn/ReadMe.md b/lab_asyn/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab_asyn/ReadMe.md @@ -0,0 +1 @@ + From d12b444d8f22289b728fb691ca3338f680d8ff42 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:04:14 +0800 Subject: [PATCH 10/24] Add files via upload --- lab_asyn/shell/Makefile | 22 +++ lab_asyn/shell/allocator.c | 20 +++ lab_asyn/shell/allocator.o | Bin 0 -> 1744 bytes lab_asyn/shell/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32753 bytes lab_asyn/shell/cpio.c | 96 +++++++++++ lab_asyn/shell/cpio.o | Bin 0 -> 4768 bytes lab_asyn/shell/dtb.c | 163 ++++++++++++++++++ lab_asyn/shell/dtb.o | Bin 0 -> 4880 bytes lab_asyn/shell/except.c | 166 +++++++++++++++++++ lab_asyn/shell/except.o | Bin 0 -> 4520 bytes lab_asyn/shell/header/allocator.h | 7 + lab_asyn/shell/header/cpio.h | 39 +++++ lab_asyn/shell/header/dtb.h | 26 +++ lab_asyn/shell/header/gpio.h | 38 +++++ lab_asyn/shell/header/irq.h | 22 +++ lab_asyn/shell/header/mailbox.h | 38 +++++ lab_asyn/shell/header/reboot.h | 8 + lab_asyn/shell/header/shell.h | 2 + lab_asyn/shell/header/tasklist.h | 21 +++ lab_asyn/shell/header/timer.h | 20 +++ lab_asyn/shell/header/uart.h | 39 +++++ lab_asyn/shell/header/utils.h | 25 +++ lab_asyn/shell/initramfs.cpio | Bin 0 -> 1024 bytes lab_asyn/shell/kernel8.elf | Bin 0 -> 82936 bytes lab_asyn/shell/kernel8.img | Bin 0 -> 12464 bytes lab_asyn/shell/linker.ld | 44 +++++ lab_asyn/shell/mailbox.c | 51 ++++++ lab_asyn/shell/mailbox.o | Bin 0 -> 2064 bytes lab_asyn/shell/main.c | 81 +++++++++ lab_asyn/shell/main.o | Bin 0 -> 3808 bytes lab_asyn/shell/reboot.c | 16 ++ lab_asyn/shell/reboot.o | Bin 0 -> 1496 bytes lab_asyn/shell/rootfs/file1.txt | 1 + lab_asyn/shell/rootfs/one.img | Bin 0 -> 16 bytes lab_asyn/shell/rootfs/pack.sh | 2 + lab_asyn/shell/rootfs/thisisfile2.txt | 1 + lab_asyn/shell/shell.c | 141 ++++++++++++++++ lab_asyn/shell/shell.o | Bin 0 -> 7344 bytes lab_asyn/shell/start.S | 163 ++++++++++++++++++ lab_asyn/shell/start.o | Bin 0 -> 7632 bytes lab_asyn/shell/tasklist.c | 67 ++++++++ lab_asyn/shell/tasklist.o | Bin 0 -> 2400 bytes lab_asyn/shell/timer.c | 102 ++++++++++++ lab_asyn/shell/timer.o | Bin 0 -> 3064 bytes lab_asyn/shell/uart.c | 211 ++++++++++++++++++++++++ lab_asyn/shell/uart.o | Bin 0 -> 4000 bytes lab_asyn/shell/userprogram/Makefile | 11 ++ lab_asyn/shell/userprogram/linker.ld | 19 +++ lab_asyn/shell/userprogram/one.S | 7 + lab_asyn/shell/userprogram/one.elf | Bin 0 -> 66352 bytes lab_asyn/shell/userprogram/one.img | Bin 0 -> 16 bytes lab_asyn/shell/userprogram/one.o | Bin 0 -> 728 bytes lab_asyn/shell/utils.c | 63 +++++++ lab_asyn/shell/utils.o | Bin 0 -> 2320 bytes 54 files changed, 1732 insertions(+) create mode 100644 lab_asyn/shell/Makefile create mode 100644 lab_asyn/shell/allocator.c create mode 100644 lab_asyn/shell/allocator.o create mode 100644 lab_asyn/shell/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab_asyn/shell/cpio.c create mode 100644 lab_asyn/shell/cpio.o create mode 100644 lab_asyn/shell/dtb.c create mode 100644 lab_asyn/shell/dtb.o create mode 100644 lab_asyn/shell/except.c create mode 100644 lab_asyn/shell/except.o create mode 100644 lab_asyn/shell/header/allocator.h create mode 100644 lab_asyn/shell/header/cpio.h create mode 100644 lab_asyn/shell/header/dtb.h create mode 100644 lab_asyn/shell/header/gpio.h create mode 100644 lab_asyn/shell/header/irq.h create mode 100644 lab_asyn/shell/header/mailbox.h create mode 100644 lab_asyn/shell/header/reboot.h create mode 100644 lab_asyn/shell/header/shell.h create mode 100644 lab_asyn/shell/header/tasklist.h create mode 100644 lab_asyn/shell/header/timer.h create mode 100644 lab_asyn/shell/header/uart.h create mode 100644 lab_asyn/shell/header/utils.h create mode 100644 lab_asyn/shell/initramfs.cpio create mode 100644 lab_asyn/shell/kernel8.elf create mode 100644 lab_asyn/shell/kernel8.img create mode 100644 lab_asyn/shell/linker.ld create mode 100644 lab_asyn/shell/mailbox.c create mode 100644 lab_asyn/shell/mailbox.o create mode 100644 lab_asyn/shell/main.c create mode 100644 lab_asyn/shell/main.o create mode 100644 lab_asyn/shell/reboot.c create mode 100644 lab_asyn/shell/reboot.o create mode 100644 lab_asyn/shell/rootfs/file1.txt create mode 100644 lab_asyn/shell/rootfs/one.img create mode 100644 lab_asyn/shell/rootfs/pack.sh create mode 100644 lab_asyn/shell/rootfs/thisisfile2.txt create mode 100644 lab_asyn/shell/shell.c create mode 100644 lab_asyn/shell/shell.o create mode 100644 lab_asyn/shell/start.S create mode 100644 lab_asyn/shell/start.o create mode 100644 lab_asyn/shell/tasklist.c create mode 100644 lab_asyn/shell/tasklist.o create mode 100644 lab_asyn/shell/timer.c create mode 100644 lab_asyn/shell/timer.o create mode 100644 lab_asyn/shell/uart.c create mode 100644 lab_asyn/shell/uart.o create mode 100644 lab_asyn/shell/userprogram/Makefile create mode 100644 lab_asyn/shell/userprogram/linker.ld create mode 100644 lab_asyn/shell/userprogram/one.S create mode 100644 lab_asyn/shell/userprogram/one.elf create mode 100644 lab_asyn/shell/userprogram/one.img create mode 100644 lab_asyn/shell/userprogram/one.o create mode 100644 lab_asyn/shell/utils.c create mode 100644 lab_asyn/shell/utils.o diff --git a/lab_asyn/shell/Makefile b/lab_asyn/shell/Makefile new file mode 100644 index 000000000..beea4a7b2 --- /dev/null +++ b/lab_asyn/shell/Makefile @@ -0,0 +1,22 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include +CFLAGS += -I /usr/aarch64-linux-gnu/include +all: kernel8.img + +start.o: start.S + aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o + +%.o: %.c + aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf + aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab_asyn/shell/allocator.c b/lab_asyn/shell/allocator.c new file mode 100644 index 000000000..4ca648ee9 --- /dev/null +++ b/lab_asyn/shell/allocator.c @@ -0,0 +1,20 @@ +#include "header/allocator.h" +#include "header/utils.h" + +#define SIMPLE_MALLOC_BUFFER_SIZE 8192 +static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; +static unsigned long simple_malloc_offset = 0; + +void* simple_malloc(unsigned long size){ + //align to 8 bytes + utils_align(&size,8); + + if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { + //Not enough space left + return (void*) 0; + } + void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; + simple_malloc_offset += size; + + return allocated; +} diff --git a/lab_asyn/shell/allocator.o b/lab_asyn/shell/allocator.o new file mode 100644 index 0000000000000000000000000000000000000000..42047e4bff9d5a846fec68d6bb675751e99ff9b2 GIT binary patch literal 1744 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 OPqI~*e!TdI|Nj8Si!WyY literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/cpio.c b/lab_asyn/shell/cpio.c new file mode 100644 index 000000000..a38879c9c --- /dev/null +++ b/lab_asyn/shell/cpio.c @@ -0,0 +1,96 @@ +#include "header/cpio.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/allocator.h" + +int file_num = 0; +struct file *f = NULL; + +void allocate_file_array() { + if (f == NULL) { + f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); + if (f == NULL) { + uart_send_string("Memory allocation error\n"); + // Handle memory allocation error + } + } +} + +void traverse_file() +{ + allocate_file_array(); + char* addr = (char *)cpio_addr; + + + while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ + + struct cpio_header *header = (struct cpio_header *)addr; + unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); + unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; + unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); + + utils_align(&headerPathname_size, 4); + utils_align(&file_size, 4); + + f[file_num].file_header = header; + f[file_num].filename_size = filename_size; + f[file_num].headerPathname_size = headerPathname_size; + f[file_num].file_size = file_size; + f[file_num].file_content_head = (char*) header + headerPathname_size; + + addr += (headerPathname_size + file_size); + file_num += 1; + } +} + +int findfile(char* filename) { + for(int n=0;n<=file_num;n++) { + if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ + return n; + } + } + return -1; +} + +void cpio_ls() +{ + for(int n=0;n<=file_num;n++) { + uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); + uart_send_string("\n"); + } +} + + +void cpio_cat(char *filename) +{ + int targetfile_num = findfile(filename); + + if(targetfile_num != -1) { + for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) + { + uart_send_char(f[targetfile_num].file_content_head[i]); + } + uart_send_string("\n"); + + } else { + uart_send_string("Can not Find the file\n"); + } + +} + +void cpio_exec_program(char* filename) { + int targetfile_num = findfile(filename); + + char* target = (char*) 0x20000; + for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/dtb.c b/lab_asyn/shell/dtb.c new file mode 100644 index 000000000..523dac1d4 --- /dev/null +++ b/lab_asyn/shell/dtb.c @@ -0,0 +1,163 @@ +#include "header/dtb.h" +#include "header/uart.h" +#include "header/utils.h" +#define UNUSED(x) (void)(x) + + +char* cpio_addr; +int space = 0; +//1. Define the callback function type(fdt_callback) +//2. Create a structure for holding the FDT header information(fdt_header) +//3. Implement helper functions to extract the FDT header information + +uint32_t fdt_u32_le2be (const void *addr) { + const uint8_t *bytes = (const uint8_t *) addr; + uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; + return ret; +} + +void send_space(int n) { + while(n--) uart_send_string(" "); +} + +int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { + uintptr_t end_ptr = cur_ptr + totalsize; + + while(cur_ptr < end_ptr) { + + uint32_t token = fdt_u32_le2be((char *)cur_ptr); + cur_ptr += 4; + + switch(token){ + case FDT_BEGIN_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. + Node name (variable length, NULL-terminated): Specifies the name of the node being opened. + */ + //uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char*)cur_ptr,NULL,0); + cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); + break; + case FDT_END_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_END_NODE token. + */ + //uart_send_string("In FDT_END_NODE;\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_PROP: { + + /* + Token type (4 bytes): Indicates that it's an FDT_PROP token. + Data length (4 bytes): Specifies the length of the property data (len). + Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). + Property data (variable length): Contains the property data itself, the size of which is determined by len. + */ + //uart_send_string("In FDT_PROP \n"); + uint32_t len = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + //second parameter name here is property name not node name + cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); + cur_ptr += utils_align_up(len,4); + break; + + } + case FDT_NOP: + //uart_send_string("In FDT_NOP\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_END: + //uart_send_string("In FDT_END\n"); + cb(token,NULL,NULL,0); + return 0; + default:; + return -1; + } + } + return -1; + +} +//4. Implement the fdt_traverse function: + +int fdt_traverse(fdt_callback cb,void * _dtb){ + uintptr_t dtb_ptr = (uintptr_t) _dtb; + uart_send_string("\ndtb loading at: "); + uart_hex(dtb_ptr); + // uart_send_char('\n'); + uart_send_string("\r\n"); + struct fdt_header* header = (struct fdt_header*) dtb_ptr; + + uint32_t magic = fdt_u32_le2be(&(header->magic)); + + if (magic != 0xd00dfeed){ + + uart_send_string("The header magic is wrong\n"); + return -1; + } + + /* + +-----------------+ + | fdt_header | <- dtb_ptr + +-----------------+ + | reserved memory | + +-----------------+ + | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) + +-----------------+ + | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) + +-----------------+ + */ + + uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); + uint32_t totalsize = fdt_u32_le2be(&header->totalsize); + parse_struct(cb, struct_ptr,strings_ptr,totalsize); + return 1; + +} + +//5. Implement the initramfs_callback function: +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ + UNUSED(size); + if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ + cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); + uart_send_string("cpio address is at: "); + uart_hex((uintptr_t)fdt_u32_le2be(data)); + // uart_send_char('\n'); + uart_send_string("\r\n"); + } +} + +//6. Implement print_dtb callback function: + +void print_dtb(int token, const char* name, const void* data, uint32_t size) { + UNUSED(data); + UNUSED(size); + + switch(token){ + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_space(space); + uart_send_string((char*)name); + uart_send_string("{\n "); + space++; + break; + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if(space >0) send_space(space); + uart_send_string("}\n"); + break; + case FDT_NOP: + break; + case FDT_PROP: + send_space(space); + uart_send_string((char*)name); + break; + case FDT_END: + break; + } +} diff --git a/lab_asyn/shell/dtb.o b/lab_asyn/shell/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9 GIT binary patch literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/except.c b/lab_asyn/shell/except.c new file mode 100644 index 000000000..54f355426 --- /dev/null +++ b/lab_asyn/shell/except.c @@ -0,0 +1,166 @@ + +#include "header/uart.h" +#include "header/irq.h" +#include "header/shell.h" +#include "header/timer.h" +#include "header/tasklist.h" +#include "header/utils.h" + +#define CNTPSIRQ_BIT_POSITION 0x02 +#define AUXINIT_BIT_POSTION 1<<29 + + +void except_handler_c() { + uart_send_string("In Exception handle\n"); + + //read spsr_el1 + unsigned long long spsr_el1 = 0; + asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); + uart_send_string("spsr_el1: "); + uart_hex(spsr_el1); + uart_send_string("\n"); + + //read elr_el1 + unsigned long long elr_el1 = 0; + asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); + uart_send_string("elr_el1: "); + uart_hex(elr_el1); + uart_send_string("\n"); + + //esr_el1 + unsigned long long esr_el1 = 0; + asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); + uart_hex(esr_el1); + uart_send_string("\n"); + + //ec + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + uart_send_string("ec: "); + uart_hex(ec); + uart_send_string("\n"); + + + while(1){ + + } + +} + +void timer_irq_handler() { + //enable core_0_timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + // Disable interrupts to protect critical section + asm volatile("msr DAIFSet, 0xf"); + + uint64_t current_time; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + + while(timer_head && timer_head->expiry <= current_time) { + timer_t *timer = timer_head; + + //Execute the callback + timer->callback(timer->data); + + // Remove timer from the list + timer_head = timer->next; + if (timer_head) { + timer_head->prev = NULL; + } + + //free timer + + // Reprogram the hardware timer if there are still timers left + if(timer_head) { + asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } else { + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + } + + + //enable interrupt + asm volatile("msr DAIFClr,0xf"); + } + +} + +void uart_irq_handler(){ + // uart_send_string("in uart_irq_handler\n"); + ///uart_hex(uart_write_index); + ///uart_hex(uart_write_head); + ///uart_send_string("\r\n"); + uint32_t iir = mmio_read(AUX_MU_IIR); + + // IF Receive Interrupt + if ((iir & 0x06) == 0x04) { + // Read data(8 bytes) and store it in the read buffer + uart_send_string("in uart_irq_handler_receive\n"); + char data = mmio_read(AUX_MU_IO) & 0xff; + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer for echo + uart_write_buffer[uart_write_index++] = data; + // uart_send_string(&data); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + // Enable tx interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); + } + + // IF Transmit Interrupt + if ((iir & 0x06) == 0x02) { + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + uart_send_string("in uart_irq_handler_transmit\n"); + // uart_hex(uart_write_index); + // uart_hex(uart_write_head); + // Send data from the write buffer + if (uart_write_head != uart_write_index) { + uart_send_string("in uart_irq_handler_trans idx!=\n"); + char data = uart_write_buffer[uart_write_head]; + // uart_send_char(data); + // uart_send_string("\r\n"); + // mmio_write(AUX_MU_IO, 0); + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + *AUX_MU_IO = (unsigned int) data; + uart_send_string("\r\n"); + uart_write_head++; + // mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + // uart_write_head ++; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + } + else + { + uart_send_string("in uart_irq_handler_trans idx=\n"); + uart_send_string("----------------------------------\n"); + // Disable tx interrupt when there is no data left to send + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + // mmio_write(AUX_MU_IO, 0); + + /* + if(uart_read_buffer[uart_read_index-1] == '\r' || uart_read_buffer[uart_read_index-1] == '\n'){ + uart_read_buffer[uart_read_index-1] = '\0'; + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + // parse_command(uart_read_buffer); + // uart_write_index = 0; + } + */ + } + } + // uart_send_string("out uart_irq_handler\n"); +} + + diff --git a/lab_asyn/shell/except.o b/lab_asyn/shell/except.o new file mode 100644 index 0000000000000000000000000000000000000000..7fbb0e527c56b795482dacc3c867d7778afab799 GIT binary patch literal 4520 zcmbW3e{54#6vt2dx={wqu?-=N&^NN^NThCaLIaq+{XjMYYM>Yl#I9=}wqfhGw$tJW zj>JSl{A0_C`UgLhXk>;zNWjPvFpCniKMhdi55dLohl&27k_DSE=Q;143x~H=jc2*L z_k7;>o^$Sf@7=z)w`_af?Q(%K7kmj1Jw*Xxr4Pr3H8fxeEQXoEug1_F#x^pe!N}d6 zF7mS#Mj)p+`BPfO=M}atn{vYl`NSLN=qfF)u2=2|AlndsRmM?#|}1={+rDGlN&oOlYASu<+>BnZe6r`kl|LdI5}a@c7DoWzauS3_+h4 z`a1!FGlSn)dfH>!%TBDph1%%~$T!`8tpDsn2+~?`53KuveRc>n1K23$$8KZ131GjD zI;o-YY4_0h;gX|QQJ1gAI^40YfKS(Q)O4IXG5hp-mzS=?FkQ!fg!U18yq`v%_OBD; zAI1hASla1^ajI#15d^0zjQlC|Y29iK6o+Eae9ayY7h_+9ErK<;tz1Ta4d#kt{&&&; zmTD`4rC#)#psfE>^lQ$YTG@iW3pueTQQxu(%Bzu|o~#XgJ-If3&+~W`+Z5^md<|1L zR(0UL9X~%iyWF}bSf}E$J~=*&bnurL*ZNYyrN0j{4?O zaKG|>>+M^)8`rMmxz&l180pZyqW~?Xbtj5X7Il=|zEuj% zi<-0AsHg3iJC7X5Y@ae2Jx_s^*#o3+6yOju-G;nPVE@={S#RfN!$H z=suT=^=A2cHTLQmkW(58@J+}mj+$@Xe`MPW=y$WejhAfQe`N6j`U3^{(E|K<0e-ds z2h%zg{1K>$LQRI<2d{PnthYU7CZeHKIvG#AZiASafpombOv;0RNz4pKZIw7AZ183> zo;E`d1-2hgL@}I|$Oc^l`}UbhnNGL3y1-K^l1XkdF%BM>`3CkQ@JvUXz?Pm{z zpwT-{rsAmgUAHKJilcZ9b7ven3&>QQTHA#>?ny7-&qn4dzS3_NdRb>1a}{63ZFj^` zd|QDyLBVA`dj*$yV}eV4pWsrTX0GZq*w1jU)~onI=Fa_mM{t?kFVqz^vOtHZV#>h2bq&z@?oLJZ=MHc{Sct1)~ojGL)NSHDt?@~bG;uir@S)$ zCxXj*E;3hnk8nkon5(>sPcV1py~3RKLA@gsN}W$skL16xUgbT zfKA$N4tQTe9IN_i4w-?C#&y`F1!+^zs6J_Gp6WaBq8dxx5YLy4#!l^P%;d95IyHZi z9AT<{gZ=~6r2_gcQV2-#w6&iM +// #include +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); + +struct __attribute__((packed)) fdt_header { + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +}; + +int fdt_traverse(fdt_callback cb,void *dtb_ptr); +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); +void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab_asyn/shell/header/gpio.h b/lab_asyn/shell/header/gpio.h new file mode 100644 index 000000000..38ca70635 --- /dev/null +++ b/lab_asyn/shell/header/gpio.h @@ -0,0 +1,38 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +//Page 90, Physical/bus addr diff +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + + +// Helper function to write data to a memory-mapped I/O address +static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { + *reg = data; +} + +// Helper function to read data from a memory-mapped I/O address +static inline uint32_t mmio_read(volatile uint32_t* reg) { + return *reg; +} + +#endif diff --git a/lab_asyn/shell/header/irq.h b/lab_asyn/shell/header/irq.h new file mode 100644 index 000000000..9085cb30c --- /dev/null +++ b/lab_asyn/shell/header/irq.h @@ -0,0 +1,22 @@ +#ifndef IRQ_H +#define IRQ_H + +#include "gpio.h" + + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) + + +#endif + diff --git a/lab_asyn/shell/header/mailbox.h b/lab_asyn/shell/header/mailbox.h new file mode 100644 index 000000000..d13ac3ce9 --- /dev/null +++ b/lab_asyn/shell/header/mailbox.h @@ -0,0 +1,38 @@ +#include "gpio.h" + +extern volatile unsigned int mailbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_GETBOARD 0x00010002 +#define MBOX_TAG_GETARMMEM 0x00010005 +#define MBOX_TAG_LAST 0x00000000 + +int mailbox_call(); +void get_board_revision(); +void get_arm_mem(); + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 diff --git a/lab_asyn/shell/header/reboot.h b/lab_asyn/shell/header/reboot.h new file mode 100644 index 000000000..e1d44aa1b --- /dev/null +++ b/lab_asyn/shell/header/reboot.h @@ -0,0 +1,8 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); diff --git a/lab_asyn/shell/header/shell.h b/lab_asyn/shell/header/shell.h new file mode 100644 index 000000000..9784c1ccb --- /dev/null +++ b/lab_asyn/shell/header/shell.h @@ -0,0 +1,2 @@ +void shell(); +void parse_command(char* buffer); diff --git a/lab_asyn/shell/header/tasklist.h b/lab_asyn/shell/header/tasklist.h new file mode 100644 index 000000000..de876b84c --- /dev/null +++ b/lab_asyn/shell/header/tasklist.h @@ -0,0 +1,21 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +// #include +#include + +typedef void (*task_callback)(); + +typedef struct task { + struct task *prev; + struct task *next; + task_callback callback; + uint64_t priority; +} task_t; + +void execute_tasks(); +void create_task(task_callback callback,uint64_t priority); +void enqueue_task(task_t *new_task); +extern task_t *task_head; + +#endif diff --git a/lab_asyn/shell/header/timer.h b/lab_asyn/shell/header/timer.h new file mode 100644 index 000000000..a9a8c65da --- /dev/null +++ b/lab_asyn/shell/header/timer.h @@ -0,0 +1,20 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +// #include + +typedef void (*timer_callback)(void *data); + +typedef struct timer { + struct timer *prev; // previous timer in the list + struct timer *next; // next timer in the list + timer_callback callback; // the function to call when the timer expires + void *data; // data to be passed to the callback + uint64_t expiry; // the time at which the timer will expire +} timer_t; + +extern timer_t *timer_head; // head of the timer list + +void setTimeout(char *message,uint64_t seconds); +#endif diff --git a/lab_asyn/shell/header/uart.h b/lab_asyn/shell/header/uart.h new file mode 100644 index 000000000..0c3ff1bd8 --- /dev/null +++ b/lab_asyn/shell/header/uart.h @@ -0,0 +1,39 @@ +#ifndef UART_H +#define UART_H + +#include "gpio.h" +#include +#define UART_BUFFER_SIZE 1024 + +void uart_init(); +void uart_send_char(unsigned int c); +char uart_get_char(); +void uart_send_string(char* s); +void uart_hex(unsigned long long d); +void uart_enable_interrupt(); +int uart_async_read(char *buffer); +void uart_async_write(const char *buffer, int length); +void uart_async_send(const char *str); + + +extern char uart_read_buffer[UART_BUFFER_SIZE]; +extern char uart_write_buffer[UART_BUFFER_SIZE]; +extern int uart_read_index; +extern int uart_read_head; +extern int uart_write_index; +extern int uart_write_head; + +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +#endif diff --git a/lab_asyn/shell/header/utils.h b/lab_asyn/shell/header/utils.h new file mode 100644 index 000000000..3ba6dd719 --- /dev/null +++ b/lab_asyn/shell/header/utils.h @@ -0,0 +1,25 @@ +#include +// #include + +#define nop asm volatile("nop") + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + + +int utils_string_compare(const char* i, const char* j); +unsigned long utils_atoi(const char *s, int char_size); +void utils_align(void *size, unsigned int s); +uint32_t utils_align_up(uint32_t size, int alignment); +size_t utils_strlen(const char *s); +char *utils_strcpy(char* dst, const char *src); +char *utils_strdup(const char *src); diff --git a/lab_asyn/shell/initramfs.cpio b/lab_asyn/shell/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..faf47b52fd58348135f4805c9dad3157d9e67fb3 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/kernel8.img b/lab_asyn/shell/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..b2bad916e5d494e1c4ee8c1d80c746ad2fdecfbd GIT binary patch literal 12464 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 literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/linker.ld b/lab_asyn/shell/linker.ld new file mode 100644 index 000000000..5018defb6 --- /dev/null +++ b/lab_asyn/shell/linker.ld @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab_asyn/shell/mailbox.c b/lab_asyn/shell/mailbox.c new file mode 100644 index 000000000..7e0c5d99c --- /dev/null +++ b/lab_asyn/shell/mailbox.c @@ -0,0 +1,51 @@ +#include "header/mailbox.h" + +volatile unsigned int __attribute__((aligned(16))) mailbox[36]; + +int mailbox_call() +{ + unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ){ + /* is it a valid successful response? */ + if(mailbox[1] == MBOX_RESPONSE) + return 1; + } + } + return 0; +} + +void get_board_revision(){ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} + +void get_arm_mem(){ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} diff --git a/lab_asyn/shell/mailbox.o b/lab_asyn/shell/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2118f241e7cf5768d3e64c641e7118db6261bc GIT binary patch literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/main.c b/lab_asyn/shell/main.c new file mode 100644 index 000000000..09914b45e --- /dev/null +++ b/lab_asyn/shell/main.c @@ -0,0 +1,81 @@ +#include "header/uart.h" +#include "header/shell.h" +#include "header/dtb.h" +#include "header/utils.h" +#include "header/cpio.h" +#include "header/timer.h" + +void test_read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + uart_send_string("\r\n"); + break; + } + else + { + uart_send_char(buffer[index]); + } + index++; + } +} + +extern void *_dtb_ptr; +void main() +{ + + uart_init(); + // pre test ////////////////////////// + char buffer[256]; + while(1) + { + uart_send_string("# "); + test_read_command(buffer); + char * input_string = buffer; + if(utils_string_compare(input_string,"in")) + { + break; + } + else + { + // uart_send_hex((uintptr_t) _dtb_addr); + uart_send_string("The instruct is not exist.\n"); + } + } + ///////////////////////////////////////// + + // set up serial console + uart_init(); + + unsigned long el = 0; + asm volatile ("mrs %0, CurrentEL":"=r"(el)); + uart_send_string("Current exception level: "); + uart_hex(el>>2); // CurrentEL store el level at [3:2] + uart_send_string("\r\n"); + + asm volatile("mov %0, sp"::"r"(el)); + uart_send_string("Current stack pointer address: "); + uart_hex(el); + uart_send_string("\r\n"); + + // say hello + fdt_traverse(get_cpio_addr,_dtb_ptr); + traverse_file(); + uart_send_string("Type in `help` to get instruction menu!\n"); + + uart_enable_interrupt(); + + shell(); + /* + while(1){ + asm volatile("nop"); + } + */ + //echo everything back + //shell(); +} + + diff --git a/lab_asyn/shell/main.o b/lab_asyn/shell/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c24ccc3615da8925de5fe98829cd15e359d31223 GIT binary patch literal 3808 zcmbuBUu+ab7{I@~Ed*;Rwf`uzk;PUlMAjB-Jcx#)1$iMvZAnbPY`1q)x_I3?cK1lJ zMr-1mFRh%42_Pgsa8(l?OnfoMs4pfy5TR8QA=UW6gAbb0)F#&YeY^7=&CIv6bMxAvBhSQRF<^@z=7n56mMKO`R#Icfb0J- zSpU-Tc(E1NvosK!nUBNFa!M<O9?wAe1vsl+gMzi3Uf!>y1gVE*=F{$iLv6Z5yAwa#8S)t4ZHSUtCTN6jwTvE31=pSHIBAc{n^UuutzkHj;Pzyx!Yu^cg+7d-FlF_tian zjGn%o5@Q&EhTsVhd--{&nRqbPUbhW&WSHAPhUj^qUcXp#N$WosFT|d^ee1@}dgw#^ zRA2$nLmT=){q^|8U6*$DzrEv~hY!Bnb-we^dk+nq>n=R<%I#Y}e*eSVJh@dB3Q+@p ztW`45Dt<8l8vZJYhLI|X2J6c3hJcjw@N=YDm5T=J%V20<&dE@N`^xOYacjemG199+ zZG?nP4MH!qlTzBK?Im;Dc_n4RfGwqLu|_h&3=Ud1pYy@Pqcwxe3xvPpcHGLF7-HQab>ixN;BUGKx%yQc zl=dwV{;cF%kv|}Hs_LX3jngc7G!D;)?Rlr`kvKfpu1FlV?~ZV`?}^0WywEvD!t-Iy zd7%6>g(kuCh}4Oz>wQ7tYMxIhoaaJ__BTm1&UAs8IQ>zx{4SM5#Qv_rRr|jrr}x#yL8!(y330r8l%z&-&clT4*&sRRfq9)0M_pHg z!nc;9<0VGn?F#RZ`a0~#dtynFQX|gaN`MUS?6_}@fPu$SSdX#hii~CWV!{U_ZTS`$ zBc2C_o23Ss_ZkUovJnzI8}m6Z=&Zy$A{cmi6vpAB$94y|L1`<-%u&}G7p1BFFGWXh zN=5XaH;Ig7D6C4)hLRR4l)D-%$*@^^PRW3!_k%q&4(E>dzz)fyH<3aq(!Ujop~|D! zpqT&FzZZQe<{m7noR^I&Dny;<&+|BhjP$bnNdx}B=P=RyC9$JY{{H0r$%WO)F?f8= zAKfEps2(h;Q6Vz=-xpD*W{n~H`Guhx_&xqD*0cQ^QZfn IDpCJ`0Q9AH_y7O^ literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/reboot.c b/lab_asyn/shell/reboot.c new file mode 100644 index 000000000..048f2d348 --- /dev/null +++ b/lab_asyn/shell/reboot.c @@ -0,0 +1,16 @@ +#include "header/reboot.h" + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab_asyn/shell/reboot.o b/lab_asyn/shell/reboot.o new file mode 100644 index 0000000000000000000000000000000000000000..dda9e282580625dcaef2ab81c697421da43712d2 GIT binary patch literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/rootfs/file1.txt b/lab_asyn/shell/rootfs/file1.txt new file mode 100644 index 000000000..5c275ef57 --- /dev/null +++ b/lab_asyn/shell/rootfs/file1.txt @@ -0,0 +1 @@ +This is file one. diff --git a/lab_asyn/shell/rootfs/one.img b/lab_asyn/shell/rootfs/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/rootfs/pack.sh b/lab_asyn/shell/rootfs/pack.sh new file mode 100644 index 000000000..d837d685d --- /dev/null +++ b/lab_asyn/shell/rootfs/pack.sh @@ -0,0 +1,2 @@ +find . | cpio -o -H newc > ../initramfs.cpio + diff --git a/lab_asyn/shell/rootfs/thisisfile2.txt b/lab_asyn/shell/rootfs/thisisfile2.txt new file mode 100644 index 000000000..0a8a2c0d7 --- /dev/null +++ b/lab_asyn/shell/rootfs/thisisfile2.txt @@ -0,0 +1 @@ +Here is file two with longer size. diff --git a/lab_asyn/shell/shell.c b/lab_asyn/shell/shell.c new file mode 100644 index 000000000..8a4702237 --- /dev/null +++ b/lab_asyn/shell/shell.c @@ -0,0 +1,141 @@ +#include "header/shell.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/mailbox.h" +#include "header/reboot.h" +#include "header/cpio.h" +#include "header/allocator.h" +#include "header/dtb.h" +#include "header/irq.h" +#include "header/timer.h" +#define BUFFER_MAX_SIZE 256u + + +extern void *_dtb_ptr; + +void async_read_command(char* buffer) { + int index = 0; + char tmp[1]; + + while (1) { + if (uart_async_read(tmp) > 0) { + buffer[index] = tmp[0]; + // uart_send_char(tmp[0]); + if (tmp[0] == '\r' || tmp[0] == '\n' || tmp[0] == '\0') { + buffer[index] = '\0'; + break; + } + index++; + } + } + // uart_send_string("out read_commandppppppppppppppp\n"); +} + + +void parse_command(char* buffer){ + uart_send_string("in parse command ========================\n"); + char* input_string = buffer; + char* parameter[5]; //5 is the available parameter length + int para_idx = 0; + int input_string_len = utils_strlen(input_string); + for(int i=0; i < input_string_len; i++){ + if(*(input_string+i) == ' '){ + *(input_string+i) = '\0'; + parameter[para_idx++] = (input_string+i+1); + } + } + + if(utils_string_compare(input_string,"help")) { + uart_async_send("help :print this help menu\n"); + uart_async_send("hello :print Hello World!\n"); + uart_async_send("info :Get the hardware's information\n"); + uart_async_send("reboot :reboot the device\n"); + uart_async_send("ls :list the file\n"); + uart_async_send("cat :print file content\n"); + uart_async_send("malloc :give dynamic memory space\n"); + uart_async_send("dtb :print device tree\n"); + uart_async_send("exec :execute user program\n"); + } else if (utils_string_compare(input_string,"hello")) { + // uart_send_string("Hello World!\n"); + uart_async_send("Hi\n"); + } else if (utils_string_compare(input_string,"info")) { + get_board_revision(); + uart_async_send("My board revision is: "); + uart_hex(mailbox[5]); + uart_async_send("\n"); + get_arm_mem(); + uart_async_send("My ARM memory base address is: "); + uart_hex(mailbox[5]); + uart_async_send("\n"); + uart_async_send("My ARM memory size is: "); + uart_hex(mailbox[6]); + uart_async_send("\n"); + } else if (utils_string_compare(input_string,"reboot")) { + uart_async_send("Rebooting....\n"); + reset(1000); + } else if (utils_string_compare(input_string,"ls")) { + cpio_ls(); + } else if (utils_string_compare(input_string,"cat")){ + //uart_send_string("Filename: "); + //char filename[BUFFER_MAX_SIZE]; + //read_command(filename); + //cpio_cat(filename); + cpio_cat(parameter[0]); + } else if (utils_string_compare(input_string,"malloc")){ + char *a = simple_malloc(sizeof("9876")); + char *b = simple_malloc(sizeof("345")); + a[0] = '9'; + a[1] = '8'; + a[2] = '7'; + a[3] = '6'; + a[4] = '\0'; + b[0] = '3'; + b[1] = '4'; + b[2] = '5'; + b[3] = '\0'; + uart_async_send(a); + uart_async_send("\n"); + uart_async_send(b); + uart_async_send("\n"); + } else if (utils_string_compare(input_string,"dtb")) { + fdt_traverse(print_dtb,_dtb_ptr); + } else if (utils_string_compare(input_string,"exec")) { + //uart_send_string("Program name: "); + //char buffer[BUFFER_MAX_SIZE]; + //read_command(buffer); + cpio_exec_program(parameter[0]); + } else if (utils_string_compare(input_string,"timer")) { + + setTimeout("hello world1",3); + setTimeout("hello world2",6); + setTimeout("hello world3",9); + + } else if (utils_string_compare(input_string,"settimeout")) { + char *message = (char *)parameter[0]; + size_t second_str_len = utils_strlen(parameter[1]); + uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); + setTimeout(message,seconds); + } else { + uart_async_send("The instruction "); + uart_async_send(input_string); + uart_async_send(" is not exist.\n"); + } + // uart_send_string("out parse command\n"); +} + + +void shell(){ + while(1) { + // uart_send_string("in shell\n"); + char buffer[BUFFER_MAX_SIZE]; + uart_send_string("# "); + async_read_command(buffer); + // uart_send_string("testyyyyyyyyyyyyyyyyyyyyyyy\n"); + parse_command(buffer); + // uart_send_string("out shell\n"); + } + +} + + + diff --git a/lab_asyn/shell/shell.o b/lab_asyn/shell/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..6f1dc79498c7068e8c61bc716af9f69c6cba2ce7 GIT binary patch literal 7344 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 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + ldr x1, =_start + bl from_el2_to_el1 + mov sp, x1 + + + /* set exception vector table */ + adr x0, exception_vector_table + msr vbar_el1, x0 // vbar -> Vector Base Address Register + + //bl core_timer_enable + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + //bl core_timer_enable + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b + +from_el2_to_el1: + mov x0,#(1<<31) + msr hcr_el2,x0 + mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable + msr spsr_el2,x0 // spsr -> saved program status register + msr elr_el2,lr // lr->link register elr->Eeception Link Register + eret +/* +core_timer_enable: + //mov x0,1 + //msr cntp_ctl_el0, x0 //enable + //mrs x0, cntfrq_el0 + //mov x3,5 + //mul x0, x0, x3 + //msr cntp_tval_el0,x0 // set expired time + //mov x0,2 + //ldr x1, =CORE0_TIMER_IRQ_CTRL + //str w0,[x1] //unmask timer interrupt + //ret +*/ +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + + +exception_handler: + save_all + bl except_handler_c + load_all + eret + +irq_exception_handler: + save_all + bl uart_irq_handler + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + b exception_handler // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + +.global _dtb_ptr //define a global variable _dtb_ptr +.section .data //_dtb_ptr is in data section +_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 + diff --git a/lab_asyn/shell/start.o b/lab_asyn/shell/start.o new file mode 100644 index 0000000000000000000000000000000000000000..2a7d92cb0cfce21c71794f218a84f99e20ce9226 GIT binary patch literal 7632 zcmeHM&1(}u6o1LCrqzBcG_=L0P^gGTDt=L<-B$adwpzVdy)2t%HNiBgn^kLtwum<` zt@PA`T5kg$JP1Nh{TD36gQp-OA|g^m+ETl|+3YmyB)#;|QP_dqdGnk1e!rPFvjfRY zcK7%AeLi5t2X7(YVkp3Leco1VQ-M+_$%CHdWx&gTmjN#WUIx4j{5KisoPwbc!0J4l z&NRu&Qw`va8j>=WW!274!cZB&YzM#$PN)hNgPBgmA`=jN1aQ3LF|2gSaOI_CoxuLt zWsCuMy#&<_nHRCCB~ThN?f7J+=kF~^ewPgZ`B>>ApKAT&bE8DQw8-S^(Ou-*somsz zM}Yk3Eg{R7OUch`d&n|95esocp5S1-s9!K+XLPn@b-YW2X<-?)NNR` zJEc`jXYIFG{SSim7X<6i3D$omSbsvWew$$ZI>Gt}1nY0Ci#>l91nbWU)*lzFe?zc- zn_zwXO}*_R6}>3{kicJ*Q^KBNMFP11&fP&2;yFZyK`tU_w`GWN_ zRhX{K;mp5;!>?j=Rgv)@vGKw@oMiso)yaU3oE_!jv17C1DI!A&DI zqUwobs+q#772?JnRUaGHN6mODsm8QqG@%>N90fIMM$}Q$fPC*geb`JHs;Na1I;d(S zomSJPW|+*5kLxg^#gk45V^fFWE_$g{iV4{BI%vNEYH%Sc9Gg~sj$MyvF9{2c-PekA>&X zkDPYlR|^nw9J0=U0~ky910P?C7(aJ}037`%b|e4d=TG-`vG_sf{priority < task_head->priority) { + new_task->next = task_head; + new_task->prev = NULL; + if (task_head) { + task_head->prev = new_task; + } + task_head = new_task; + } else { + // Find the correct position in the list + task_t *current = task_head; + while (current->next && current->next->priority <= new_task->priority) { + current = current->next; + } + + // Insert the new task + new_task->next = current->next; + new_task->prev = current; + if (current->next) { + current->next->prev = new_task; + } + current->next = new_task; + } + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, uint64_t priority) { + + task_t* task = simple_malloc(sizeof(task_t)); + if(!task) { + return; + } + + task->callback = callback; + task->priority = priority; + + enqueue_task(task); +} + +void execute_tasks() { + + uart_send_string("in exe \n"); + while (task_head) { + task_head->callback(); + task_head = task_head->next; + if (task_head) { + task_head->prev = NULL; + } + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + //simple_free(task); + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts +} + diff --git a/lab_asyn/shell/tasklist.o b/lab_asyn/shell/tasklist.o new file mode 100644 index 0000000000000000000000000000000000000000..146e1ff6ec4c330e30a5635b9d93189864fe84b2 GIT binary patch literal 2400 zcmbW1Pe>F|7{I^T8O!{a|DwonCt1QM2Uk2;1dUp0AQhUB5bciZl;ZAcJF{RJ=_TmU zLD6gBvGvqpB~KC2!9$0r^j3N35C}oop&@MhzS;M5dd_y}TV~$(e&3(>&HLWIsq;M- z0+Iw=BzO)xGfn~2Jv+MYsydWI8GODhuLb~S+Cg_D8M1Pj?u77}0%fB?f~!FVGAe+B zF-{JBU&@iS2G<_gkkS4{mKKjHx?|*WOUgaSOe;Hn3X3K7E0;SMMEf@!wM62XuG88Si);p;SvN;1I5qkCd^Dgt z(-LHZs=Nxtx&v@_jTm5k(SZ96*&u!geKYa(-?=6Frp;2_p|vRgNK!Q?Otl1{tF!a8 z+SossPTFZT9M)R3=B9AkordqXv}nz(#~H?2ppsrF(%oKAChDcSvY^Wjb9Ihjq*HWB+AAv9R2*SA+Pf6=XS-mVU5N|EL)2~ zXaYh*U?y*;&9oUI1H@9MVKdztNsPzMNWzH6$6|n|HkM{43(`i)j#y@LC}P>Ek>o9) z=*X~X46(ZSPS;@TxK1WsN4>xsS)9lpFer}=y=jQ`7>rTQp2641g z`Ei(QDKlvU zd4Np=pyJoRadw4wGe_zl#qxOGKUzjy tn?i~iTw!&TBBOgkjHmq-dxr?#GB`*RkBHkscY|O2GOK^s6HBTX{|9Ma^KAeC literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/timer.c b/lab_asyn/shell/timer.c new file mode 100644 index 000000000..7e84400b9 --- /dev/null +++ b/lab_asyn/shell/timer.c @@ -0,0 +1,102 @@ +#include "header/timer.h" +#include "header/allocator.h" +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +timer_t *timer_head = NULL; + +void add_timer(timer_t *new_timer) { + + timer_t *current = timer_head; + + // Disable interrupts to protect the critical section + asm volatile("msr DAIFSet, 0xf"); + // Special case: the list is empty or the new timer is the earliest + if (!timer_head || new_timer->expiry < timer_head->expiry) { + new_timer->next = timer_head; + new_timer->prev = NULL; + if (timer_head) { + timer_head->prev = new_timer; + } + timer_head = new_timer; + + // Reprogram the hardware timer + asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); + return; + } + + // Find the correct position in the list + while (current->next && current->next->expiry < new_timer->expiry) { + current = current->next; + } + + // Insert the new timer + new_timer->next = current->next; + new_timer->prev = current; + if (current->next) { + current->next->prev = new_timer; + } + current->next = new_timer; + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + + +void create_timer(timer_callback callback, void* data, uint64_t after) { + //Allocate memory for the timer + timer_t* timer = simple_malloc(sizeof(timer_t)); + if(!timer) { + return; + } + + //Set the callback and data + timer->callback = callback; + timer->data = data; + + //Calculate the expiry time + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); + timer->expiry = current_time + after * cntfrq; + //Add the time to the list + add_timer(timer); +} + + +void print_message(void *data) { + char *message = data; + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); + uint64_t seconds = current_time / cntfrq; + + uart_send_string("Timeout message: "); + uart_send_string(message); + uart_send_string(" occurs at "); + uart_hex(seconds); + uart_send_string("\n"); +} + +void setTimeout(char *message,uint64_t seconds) { + + char *message_copy = utils_strdup(message); + + if(!message_copy){ + return; + } + + if (!timer_head) { + //enable core_timer_interrupt + unsigned int value = 2; + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt + *address = value; + } + + create_timer(print_message,message_copy,seconds); +} + diff --git a/lab_asyn/shell/timer.o b/lab_asyn/shell/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..2073fbde9b7685a25c77b303f1959a2feaf6cbc6 GIT binary patch literal 3064 zcmbW2O>7%Q6oB7)o#LixNSjn30?nq1P(gHMhe$+$!#YtZNKpw*DuINsH}*D;u;a+P zmI8@LihAggs^J1^4?V>>aR{OuKvlW+R0y}03UMokK!}77k$G?Sy=JnpCB#_c_vYL8 zGxKI?=Ie5LrL~MeU`aNJ&yb`IQ3uOF*iR$dCPD(`Y=iyZF7fUSoaRjIHl* z0UIYKjM^!zgMqz2(ft*zai`m<8(mP}UHp;O*&~d`G&frB{(2g!K28iawkf`eInN zJ2~_cWAwm1QqB0}0>l?i8oeETU?F)n#PA-;bf| ziCPl-gwg;$Aert=-Z*r#ZS;D4)g1dGHs1d5!6rGUkBqSfLuht|eU?I>y#729V9Pun&+Q)Ar@b$^*P06*~t5c^FuL`O55Ekm1V$Rkspkd~YtF@dJD? z6M}-b0B$~?QJ#>icy8eFz@IJ67rji$Ef&i;@V$VqA5??cqEAus)p<~knS$r$0iMTs zQR~Ka=%>I^6yQXJ4>0dV-pM+NS6c8SbBQnalkN{Si7$LO#1M_|Xq?W1w6|E1_@{Y1 z!BXN2pJM)8Wd2#^6h}YZSR&OxS+?yAfN52Ri`lhfCiO6)+{iT>u|1S2Id=er$PI1gZF<>eFFGsle%RC%>PP)7= z#C(MF%lk#R_=$X*{pGpHOaF2GAF_YcyujeL1Y{}m7yLdd&Gv7LKZ#j3r2Qjb@t6Ih xbwqQMi^Urvbv%NM?q$@UzRS_QLj*}aKg%@Gn$%6uF;trQPjI4w7_yA|{|i80T(tlI literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/uart.c b/lab_asyn/shell/uart.c new file mode 100644 index 000000000..ca50673c8 --- /dev/null +++ b/lab_asyn/shell/uart.c @@ -0,0 +1,211 @@ +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +#define RX_INTERRUPT_BIT 0x01 +#define TX_INTERRUPT_BIT 0x02 + +#define AUXINIT_BIT_POSTION 1<<29 + +char uart_read_buffer[UART_BUFFER_SIZE]; +char uart_write_buffer[UART_BUFFER_SIZE]; +int uart_read_head = 0; +int uart_read_index = 0; +int uart_write_index = 0; +int uart_write_head = 0; + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + // P.104 Since I need UART 1 Transmit/Receive Data -> TXD1/RXD1 + // p.102 I find These two in GPIO 14/15 Fun5 + // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 + // That's why I need GPFSEL1 + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 + r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 + *GPFSEL1 = r; // from here activate Trasmitter&Receiver + + //Since We've set alt5, we want to disable basic input/output + //To achieve this, we need diable pull-up and pull-dwon + *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down + //Wait 150 cycles + //this provides the required set-up time for the control signal + r=150; while(r--) { asm volatile("nop"); } + // GPIO control 54 pins + // GPPUDCLK0 controls 0-31 pins + // GPPUDCLK1 controls 32-53 pins + // set 14,15 bits = 1 which means we will modify these two bits + // trigger: set pins to 1 and wait for one clock + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + + + r=1000; while(r--) { asm volatile("nop"); } + + /* initialize UART */ + *AUX_ENABLE |=1; + //P.9: If set the mini UART is enabled. The UART will + //immediately start receiving data, especially if the + //UART1_RX line is low. + //If clear the mini UART is disabled. That also disables + //any mini UART register access + *AUX_MU_CNTL = 0; + //P.17 If this bit is set the mini UART receiver is enabled. + //If this bit is clear the mini UART receiver is disabled + //Prevent data exchange in initialization process + *AUX_MU_IER = 0; + //Set AUX_MU_IER_REG to 0. + //Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; + //P.14: 00 : the UART works in 7-bit mode + //11(3) : the UART works in 8-bit mode + //Cause 8 bits can use in ASCII, Unicode, Char + *AUX_MU_MCR = 0; + //Don’t need auto flow control. + //AUX_MU_MCR is for basic serial communication. Don't be too smart + *AUX_MU_BAUD = 270; + //set BAUD rate to 115200(transmit speed) + //so we need set AUX_MU_BAUD to 270 to meet the goal + *AUX_MU_IIR = 0xc6; + // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 + // Writing with bit 1 set will clear the receive FIFO + // Writing with bit 2 set will clear the transmit FIFO + // Both bits always read as 1 as the FIFOs are always enabled + /* map UART1 to GPIO pins */ + *AUX_MU_CNTL = 3; // enable Transmitter,Receiver + +} + + +/** + * Send a character + */ +void uart_send_char(unsigned int c) { + /* wait until we can send */ + // P.15 AUX_MU_LSR register shows the data(line) status + // AUX_MU_LSR bit 5 => 0x20 = 00100000 + // bit 5 is set if the transmit FIFO can accept at least one byte. + // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop + // else FIFO can not accept at lease one byte then still wait + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the + //UART FIFOs. + //communicate with(send to) the minicom and print to the screen + *AUX_MU_IO=c; +} + +/** + * Display a string + */ +void uart_send_string(char* s) { + while(*s) { + /* convert newline to carriage return + newline */ + if(*s=='\n') + uart_send_char('\r'); + uart_send_char(*s++); + } +} + +/** + * Receive a character + */ +char uart_get_char() { + char r; + /* wait until something is in the buffer */ + //bit 0 is set if the receive FIFO holds at least 1 symbol. + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + /* convert carriage return to newline */ + return r=='\r'?'\n':r; +} + + +/** + * Display a binary value in hexadecimal + */ +void uart_hex(unsigned long long d) { + unsigned long long n; + int c; + uart_send_string("0x"); + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x57:0x30; + uart_send_char(n); + } +} + +void uart_enable_interrupt() { + + // Enable RX and TX interrupt for mini UART + uint32_t ier = mmio_read(AUX_MU_IER); + ier |= RX_INTERRUPT_BIT; + //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); + mmio_write(AUX_MU_IER, ier); + + // Enable the mini UART interrupt in the second-level interrupt controller + // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; + uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); + enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 + mmio_write(ENABLE_IRQS_1, enable_irqs1); +} + +void uart_disable_interrupt() { + // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; + uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); + disable_irqs1 |= AUXINIT_BIT_POSTION; + mmio_write(DISABLE_IRQS_1,disable_irqs1); +} + +int uart_async_read(char *buffer) { + // uart_send_string("in uart_async_read\n"); + if (uart_read_head == uart_read_index) { + // No characters available + return 0; + } else { + // uart_send_string("flag \n"); + buffer[0] = uart_read_buffer[uart_read_head++]; + if (uart_read_head >= UART_BUFFER_SIZE) { + uart_read_head = 0; + } + return 1; + } +} +void uart_async_write(const char *buffer, int length) { + uart_send_string("in uart_async_write\n"); + // uart_write_head = 1; + // uart_read_index = 1; + for (int i = 0; i < length; i++) + { + // uart_send_string("qq\n"); + uart_write_buffer[uart_write_index++] = buffer[i]; + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + } + // Trigger TX interrupt + /// uart_send_string("Triiger TX interrupt\n"); + /// uart_hex(uart_write_index); + /// uart_hex(uart_write_head); + // unable transmit interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); + /// uart_send_string("flag1\n"); + /// uart_hex(uart_write_index); + /// uart_hex(uart_write_head); +} + +void uart_async_send(const char *str) { + uart_send_string("in uart asy send ===========================\n"); + int length = utils_strlen(str); + uart_async_write(str, length); +} + + diff --git a/lab_asyn/shell/uart.o b/lab_asyn/shell/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..e8811ae32f03d5f93118d29b76d0cfc8fadaf852 GIT binary patch literal 4000 zcmbuBU2GIp6oAik2D(5gODRGC?G#r)B5T`JQcMif7WqjOVN(({#_hH{WjC}-yE~1= zqTSLGN%4UyA%+O{0Rxhl@Ia#VL0W;N@yV<|F)<)05fgj>`Xa`%o^$7%c9^zLp61TI z_q*qB&b@QHJukkrwLsHAM1wD2Y9+si6f6p$HB^HrH2@%@y1_dtb+9K!0SU zBpay(Yd8c$>GF7SNjVtnYXOFPu$7tmk6=K@Xg=SdEkQf@D59Yq*{q&n9p1^R_07EI zweN$0oK`fDdlK!-u^kQ!!8EZpg}LSYRHGzPaoQo?ahbz=OmuQpnS&j`DMN6lVXvb ziSbABg&P55)S_?7ACSQ+C@HIk4hZ(HAU_k`mp;QiJ@$tV=O=U+#5@PFCdVm1vhCBe zk=ygLxjA#QDp&F|8oGS4yvX`sa|rI;${s%1586?GzRf|{ZD3wKL8$C~m~WWq9z93# z4xvx2?u7EC-8g&SqMUFKEYzi(0rV=&LDjUk{zQ&+{9IyD-dO*^-!bNrI|1Roy8K8mooN@wOms(IAZtL25ss-kC44bM) z9-w1`4h;p!>L{iGySH1xK`XFjSi?AQ(E6}20E0Jl^L#muZ-ajHDuAjBXxh=*fH7Pj z+&+9J5vwUTV9>Z*R@1|IM1ui5e}#8Ou}-~MANRaaEy`3aq;?bCU#q>M+{PEcgK^9i z-%sUtLtkFy$veJq!e4->%W@jwzL}Qr)spjZg>7--N_iz)r znXyxG^M%<34Yt+SKX0zv)6|)AI?c+;aCNw1LuIF$R=!(R6|Sg$nz4!s5aeEaI|4@6 z6WYq6GR2lN|I4HI439$|X7Tt94{P9YHTSEqPw=>%`r6{)se;qm>({Rp)0A>JLIV_u zLF{8i03;V;7ntqho_t^7@euXwyM=vIuD6Jz)X<~0*gR#N*6Tkk*m3>Z_bNW&*@W&? z1McAwn=bl{H!gl9_&1a2=*ceu1t`jN(P7RsxImHF_;mlIu0!E0egaTBZH4sRto%zl z%=IIn0+x8{Am@eljQCx)pnV`&i;Z|Gzp|Vg+8g5S%;oHCWqyWvJI+a7!KVD+M^7T> z#>O#mi@BVggUlP5%lUbq`32@fI43!Ujr{E5tyE_R+2`1T*!=Ppg2lMMK`x!_#J9`? z421u}T;|f>VUC>=;s4-F`4_-_5!QwH>1mDn$Gw?;kXJdqzMJuSrfJdqzSZ)N_tkN3~QkI%w~X5k~u<-O!wTwyNnC47vz z|Gj?j`0?idv&WB@H}H2NaZObntOIk2D?Gv6AGh7Zm$47(`kAl5x-Io^y8lV$Am`N7 zyh1&v_+6fF@o~9_UiERghgyAH?jgE2NF;742Om;&id)Pt`gkMrF&~$E=uaP)dkDgr z18q*M3415)_6ZrK?bcY>vAY}y$74wtsFK?6*x_wE z_iV^GvF3fKN7i;C+LDg7(JlJ_#6)x4l1IKR@@UZmS2Ync1Oz?dJP9tpd1C-|iQC*;$wF7~AokS%;us6pI5|A`W?6^W3OJF_oMYJ_;uf8dp@R+&V6r0Jzh3c8@qg;f P_J4E!39m7Z{r3L>%zQ{< literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/userprogram/Makefile b/lab_asyn/shell/userprogram/Makefile new file mode 100644 index 000000000..19cefe3cf --- /dev/null +++ b/lab_asyn/shell/userprogram/Makefile @@ -0,0 +1,11 @@ +all: one.img + +one.o: one.S + aarch64-linux-gnu-gcc -c one.S -o one.o + +one.img: one.o + aarch64-linux-gnu-ld one.o -T linker.ld -o one.elf + aarch64-linux-gnu-objcopy -O binary one.elf one.img + +clean: + rm one.o one.elf > /dev/null 2>/dev/null || true diff --git a/lab_asyn/shell/userprogram/linker.ld b/lab_asyn/shell/userprogram/linker.ld new file mode 100644 index 000000000..ab70a30ea --- /dev/null +++ b/lab_asyn/shell/userprogram/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab_asyn/shell/userprogram/one.S b/lab_asyn/shell/userprogram/one.S new file mode 100644 index 000000000..4acf6f4dd --- /dev/null +++ b/lab_asyn/shell/userprogram/one.S @@ -0,0 +1,7 @@ +.section ".text" +.global _start +_start: + svc 0x1337 +1: + nop + b 1b diff --git a/lab_asyn/shell/userprogram/one.elf b/lab_asyn/shell/userprogram/one.elf new file mode 100644 index 0000000000000000000000000000000000000000..b13e36ed9627aa5a41acd8767b43259aeddc6b32 GIT binary patch literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/userprogram/one.img b/lab_asyn/shell/userprogram/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/userprogram/one.o b/lab_asyn/shell/userprogram/one.o new file mode 100644 index 0000000000000000000000000000000000000000..c00c28e5b03a97b1c7da93cb70b11273c5c3833a GIT binary patch literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T literal 0 HcmV?d00001 diff --git a/lab_asyn/shell/utils.c b/lab_asyn/shell/utils.c new file mode 100644 index 000000000..8242d820c --- /dev/null +++ b/lab_asyn/shell/utils.c @@ -0,0 +1,63 @@ +#include "header/utils.h" +#include "header/allocator.h" + +int utils_string_compare(const char* str1,const char* str2) { + for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ + if(*str1 != *str2) return 0; + else if(*str1 == '\0' && *str2 =='\0') return 1; + } + return 1; +} + +unsigned long utils_atoi(const char *s, int char_size) { + unsigned long num = 0; + for (int i = 0; i < char_size; i++) { + num = num * 16; + if (*s >= '0' && *s <= '9') { + num += (*s - '0'); + } else if (*s >= 'A' && *s <= 'F') { + num += (*s - 'A' + 10); + } else if (*s >= 'a' && *s <= 'f') { + num += (*s - 'a' + 10); + } + s++; + } + return num; +} + +void utils_align(void *size, unsigned int s) { + unsigned long* x = (unsigned long*) size; + unsigned long mask = s-1; + *x = ((*x) + mask) & (~mask); +} + +uint32_t utils_align_up(uint32_t size, int alignment) { + return (size + alignment - 1) & ~(alignment-1); +} + +//with null-terminator -> "hello" return 6 +size_t utils_strlen(const char *s) { + size_t i = 0; + while (s[i]) i++; + return i+1; +} + + +char *utils_strcpy(char* dst, const char *src) { + char *save = dst; + while((*dst++ = *src++)); + return save; +} + + +char *utils_strdup(const char *src) { + size_t len = utils_strlen(src); + char *dst = simple_malloc(len); + if (dst == NULL) { // Check if the memory has been successfully allocated + return NULL; + } + utils_strcpy(dst, src); // Copy the string + return dst; +} + + diff --git a/lab_asyn/shell/utils.o b/lab_asyn/shell/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..74670709cc74f02475f1c6c05ac4403bb067de43 GIT binary patch literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Thu, 25 Apr 2024 18:37:09 +0800 Subject: [PATCH 11/24] Create ReadMe.md --- lab3_ADEX2/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab3_ADEX2/ReadMe.md diff --git a/lab3_ADEX2/ReadMe.md b/lab3_ADEX2/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab3_ADEX2/ReadMe.md @@ -0,0 +1 @@ + From 14d7dd01b50944ee8f773bebb00df89be196b0fe Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 25 Apr 2024 18:40:11 +0800 Subject: [PATCH 12/24] Add files via upload --- lab3_ADEX2/shell/Makefile | 22 +++ lab3_ADEX2/shell/README.md | 1 + lab3_ADEX2/shell/allocator.c | 20 +++ lab3_ADEX2/shell/allocator.o | Bin 0 -> 1744 bytes lab3_ADEX2/shell/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32753 bytes lab3_ADEX2/shell/cpio.c | 96 +++++++++++ lab3_ADEX2/shell/cpio.o | Bin 0 -> 4768 bytes lab3_ADEX2/shell/dtb.c | 163 ++++++++++++++++++ lab3_ADEX2/shell/dtb.o | Bin 0 -> 4880 bytes lab3_ADEX2/shell/except.c | 201 ++++++++++++++++++++++ lab3_ADEX2/shell/except.o | Bin 0 -> 5696 bytes lab3_ADEX2/shell/header/README.md | 1 + lab3_ADEX2/shell/header/allocator.h | 7 + lab3_ADEX2/shell/header/cpio.h | 39 +++++ lab3_ADEX2/shell/header/dtb.h | 26 +++ lab3_ADEX2/shell/header/gpio.h | 38 ++++ lab3_ADEX2/shell/header/irq.h | 22 +++ lab3_ADEX2/shell/header/mailbox.h | 38 ++++ lab3_ADEX2/shell/header/reboot.h | 8 + lab3_ADEX2/shell/header/shell.h | 2 + lab3_ADEX2/shell/header/tasklist.h | 21 +++ lab3_ADEX2/shell/header/timer.h | 20 +++ lab3_ADEX2/shell/header/uart.h | 39 +++++ lab3_ADEX2/shell/header/utils.h | 25 +++ lab3_ADEX2/shell/initramfs.cpio | Bin 0 -> 1024 bytes lab3_ADEX2/shell/kernel8.elf | Bin 0 -> 83328 bytes lab3_ADEX2/shell/kernel8.img | Bin 0 -> 12696 bytes lab3_ADEX2/shell/linker.ld | 44 +++++ lab3_ADEX2/shell/mailbox.c | 51 ++++++ lab3_ADEX2/shell/mailbox.o | Bin 0 -> 2064 bytes lab3_ADEX2/shell/main.c | 78 +++++++++ lab3_ADEX2/shell/main.o | Bin 0 -> 3728 bytes lab3_ADEX2/shell/reboot.c | 16 ++ lab3_ADEX2/shell/reboot.o | Bin 0 -> 1496 bytes lab3_ADEX2/shell/shell.c | 151 ++++++++++++++++ lab3_ADEX2/shell/shell.o | Bin 0 -> 7256 bytes lab3_ADEX2/shell/start.S | 152 ++++++++++++++++ lab3_ADEX2/shell/start.o | Bin 0 -> 7616 bytes lab3_ADEX2/shell/tasklist.c | 67 ++++++++ lab3_ADEX2/shell/tasklist.o | Bin 0 -> 2144 bytes lab3_ADEX2/shell/timer.c | 134 +++++++++++++++ lab3_ADEX2/shell/timer.o | Bin 0 -> 3600 bytes lab3_ADEX2/shell/uart.c | 196 +++++++++++++++++++++ lab3_ADEX2/shell/uart.o | Bin 0 -> 3792 bytes lab3_ADEX2/shell/userprogram/Makefile | 11 ++ lab3_ADEX2/shell/userprogram/README.md | 1 + lab3_ADEX2/shell/userprogram/linker.ld | 19 ++ lab3_ADEX2/shell/userprogram/one.S | 7 + lab3_ADEX2/shell/userprogram/one.elf | Bin 0 -> 66352 bytes lab3_ADEX2/shell/userprogram/one.img | Bin 0 -> 16 bytes lab3_ADEX2/shell/userprogram/one.o | Bin 0 -> 728 bytes lab3_ADEX2/shell/utils.c | 63 +++++++ lab3_ADEX2/shell/utils.o | Bin 0 -> 2320 bytes 53 files changed, 1779 insertions(+) create mode 100644 lab3_ADEX2/shell/Makefile create mode 100644 lab3_ADEX2/shell/README.md create mode 100644 lab3_ADEX2/shell/allocator.c create mode 100644 lab3_ADEX2/shell/allocator.o create mode 100644 lab3_ADEX2/shell/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab3_ADEX2/shell/cpio.c create mode 100644 lab3_ADEX2/shell/cpio.o create mode 100644 lab3_ADEX2/shell/dtb.c create mode 100644 lab3_ADEX2/shell/dtb.o create mode 100644 lab3_ADEX2/shell/except.c create mode 100644 lab3_ADEX2/shell/except.o create mode 100644 lab3_ADEX2/shell/header/README.md create mode 100644 lab3_ADEX2/shell/header/allocator.h create mode 100644 lab3_ADEX2/shell/header/cpio.h create mode 100644 lab3_ADEX2/shell/header/dtb.h create mode 100644 lab3_ADEX2/shell/header/gpio.h create mode 100644 lab3_ADEX2/shell/header/irq.h create mode 100644 lab3_ADEX2/shell/header/mailbox.h create mode 100644 lab3_ADEX2/shell/header/reboot.h create mode 100644 lab3_ADEX2/shell/header/shell.h create mode 100644 lab3_ADEX2/shell/header/tasklist.h create mode 100644 lab3_ADEX2/shell/header/timer.h create mode 100644 lab3_ADEX2/shell/header/uart.h create mode 100644 lab3_ADEX2/shell/header/utils.h create mode 100644 lab3_ADEX2/shell/initramfs.cpio create mode 100644 lab3_ADEX2/shell/kernel8.elf create mode 100644 lab3_ADEX2/shell/kernel8.img create mode 100644 lab3_ADEX2/shell/linker.ld create mode 100644 lab3_ADEX2/shell/mailbox.c create mode 100644 lab3_ADEX2/shell/mailbox.o create mode 100644 lab3_ADEX2/shell/main.c create mode 100644 lab3_ADEX2/shell/main.o create mode 100644 lab3_ADEX2/shell/reboot.c create mode 100644 lab3_ADEX2/shell/reboot.o create mode 100644 lab3_ADEX2/shell/shell.c create mode 100644 lab3_ADEX2/shell/shell.o create mode 100644 lab3_ADEX2/shell/start.S create mode 100644 lab3_ADEX2/shell/start.o create mode 100644 lab3_ADEX2/shell/tasklist.c create mode 100644 lab3_ADEX2/shell/tasklist.o create mode 100644 lab3_ADEX2/shell/timer.c create mode 100644 lab3_ADEX2/shell/timer.o create mode 100644 lab3_ADEX2/shell/uart.c create mode 100644 lab3_ADEX2/shell/uart.o create mode 100644 lab3_ADEX2/shell/userprogram/Makefile create mode 100644 lab3_ADEX2/shell/userprogram/README.md create mode 100644 lab3_ADEX2/shell/userprogram/linker.ld create mode 100644 lab3_ADEX2/shell/userprogram/one.S create mode 100644 lab3_ADEX2/shell/userprogram/one.elf create mode 100644 lab3_ADEX2/shell/userprogram/one.img create mode 100644 lab3_ADEX2/shell/userprogram/one.o create mode 100644 lab3_ADEX2/shell/utils.c create mode 100644 lab3_ADEX2/shell/utils.o diff --git a/lab3_ADEX2/shell/Makefile b/lab3_ADEX2/shell/Makefile new file mode 100644 index 000000000..beea4a7b2 --- /dev/null +++ b/lab3_ADEX2/shell/Makefile @@ -0,0 +1,22 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CFLAGS = -Iinclude -fno-stack-protector -Wall -Wextra -Wpedantic -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +# CFLAGS += -I../../../opt/lib/gcc/aarch64-linux-gnu/12.2.0/include +CFLAGS += -I /usr/aarch64-linux-gnu/include +all: kernel8.img + +start.o: start.S + aarch64-linux-gnu-gcc $(CFLAGS) -c start.S -o start.o + +%.o: %.c + aarch64-linux-gnu-gcc $(CFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + aarch64-linux-gnu-ld start.o $(OBJS) -T linker.ld -o kernel8.elf + aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb -display none -kernel kernel8.img diff --git a/lab3_ADEX2/shell/README.md b/lab3_ADEX2/shell/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab3_ADEX2/shell/README.md @@ -0,0 +1 @@ + diff --git a/lab3_ADEX2/shell/allocator.c b/lab3_ADEX2/shell/allocator.c new file mode 100644 index 000000000..4ca648ee9 --- /dev/null +++ b/lab3_ADEX2/shell/allocator.c @@ -0,0 +1,20 @@ +#include "header/allocator.h" +#include "header/utils.h" + +#define SIMPLE_MALLOC_BUFFER_SIZE 8192 +static unsigned char simple_malloc_buffer[SIMPLE_MALLOC_BUFFER_SIZE]; +static unsigned long simple_malloc_offset = 0; + +void* simple_malloc(unsigned long size){ + //align to 8 bytes + utils_align(&size,8); + + if(simple_malloc_offset + size > SIMPLE_MALLOC_BUFFER_SIZE) { + //Not enough space left + return (void*) 0; + } + void* allocated = (void *)&simple_malloc_buffer[simple_malloc_offset]; + simple_malloc_offset += size; + + return allocated; +} diff --git a/lab3_ADEX2/shell/allocator.o b/lab3_ADEX2/shell/allocator.o new file mode 100644 index 0000000000000000000000000000000000000000..42047e4bff9d5a846fec68d6bb675751e99ff9b2 GIT binary patch literal 1744 zcmbtU&ubGw6#llG+Su0CpCCl)9;#HZOHy)>g1Bwbf{IFMQBUb6-I(BRQnDL}7PR+X zTIj)xp7k&ACL$hs6c65%dh^<24ng1S&dY8l5f8qQec$`$y*D%8%cUh0ww{#?aaN@J`dVS2{ZO4kyt*EMbp^_bGk%=cLtMht<}g?c7LPN56no z8)y&F*dj#U&`xLT)7y`F;Ty31HOACod1-0hm{}_}YeCb<<;=X9oy|4FF!y3^&dlbo zNIG22$?yqi&sUIYO=+3&i&774KkfNsdgeH`V|-Z(I`L71x5reg|5Gk*sI8A>(&vW;~3LjAN3i**)9_U9V2m& zKstsKQ3S7(JDt!W)S0+D^yf2)GUd~D-FnFm>J77m=@$H|x9K_sFQf~_X1VM%FukGh z^>W#Ff?g8Mpz8Vs+pRvSp}UU^NtrxUKL0bs$LauvT+WojXaB1X3_Uymg=78)QGFq1IJvxw>Iks zcIhe1Fx{yX$_?9d;tBo_8B|V7?z=G-al-g~qp1IkGc+J{wm3oh11Z9;jE|ES^RQlg zPM0OGzCru4PIaP3(ymeDu3c@-I{l#0(^~{U)sB;sAv|MOK`cdM)_$-#PtkZmoVUY zaHoj-mC;Qf5C6nRyy87yIkM3P_7r| zruGn(X|BLEc1+V`k5;o&*~3hfeesQoGYk)TV_rkX zlbvRHvJYsdYRx>>Lt+1<@SV`k=6vRqQqAlU5Ij})%DBGMz`Ip)q=JpSSZ-c ziT`X|6~SLCb<4|@<`Qtozk|a(>w?p6nCNMZ78yJX@m-0pm#VdeCd-)1EzHeXAuylI zaJ@!wmRi*&5Ws{IVLWC1I*E^Dos=VS-k88i)(3fgo8hHimTZ_2fN;!*@eerhQxO{y ze>vhG)c6Jk7GY@m-_iI!^xr4()j~(&nI1&pR1S~W_;Rkka(c2_D9;-NrT;;VNBTLa zTQdEJH9kzA59zafe8lb)`B6?YF+Qe%_jQSP`J6<+Z#CQ9`Mm25$U`FlROk=ko+&RkJ3&Lj%x@pA@0Odu z3mV;GtJ$pGls}xEE6n6}H`>LOQoGx^DWB~$Dn(0w4&G~FD!1n&oawf!El1BZ?gflv{^fSH z3qPIaU-dE{`mhsTkysOdA(E{#O|@JS!5}UyV;RD#HkSN)NwZX%B99k3xFQp4wwW*O zyVt4KTeZMnKwm~@`5D+Zp?}L{&I0*GxLC>a_Oew;8smt0!(;H!5f4sjQx|T+mFb>t zp^4-iQzAIjE4O2v@qtJf9BEMg=gvy5Ue*E~KBKkb(dOT8j5!+UzyCb+bTasKP*1POHc^&VYEc;10gj&xcs@R|9v0mXQD z9$@4%)7y3S$)AXZP$aLc06vC0VGv%1`I9d7fKQf#ad4T>;zmDt`ZAu3*SK#*aRi5P zpgBZZqXb$vizm}Tjzd>hg2mEGt;;CDG9Li!#)Ain#}DlD_}G8QgE#NNllN{tdhkf` z*8PWW7vGHBXT9S`4;J^|oG;#CeL3qpeDL@Y0UbVa{GfP1#3aoZByE1mJ8}1cymyQ@ z63@??#~$;TGmpLUDCEq;U=|F8!ju6{n}=bkV5k)Kc()xme6V=i(F5e@#J&@E9xooc z`9SejZ~uwoIqw*6$R9r5jvvSu$)7wAACTvPeJA#r82TUu;LukHeN*1iyAJ1yNA5g9 zPhLDXpSVpZ-F5I5NJdDK%Kk&R9X@*82vs}~^6>*iDIOEg;RD7a`9|J+&v_cIr{jV? ziEdIaFT-^?E{*}&7jfLm@&A>$o`dVTxGZl&H^ZN7$25)PBNNo?Wnmb#3db~{Bm8cL zF8Ow4FpqGY?$k6uF}l|vJb`OFu4{2!hieBemtUnzUXCM^CA4YTf&boK)l@nh&rOYKGJNauzP=p0C+V+*GFlg_RU=#a;VpMsQ&c8<=aX*{F3OK}5eiQr&KezSJnHH(L{7~k8g3i_`EOdUsp<}ebD1l3d{4zXy`Yy0s0WP)D;$uOF!AZemPFdl}C^LP1DsRy}Mj`R#`V&_pBGUoOj1* zIlM*suVqcE`y{=4;`Gj|UXrw48mHy(wmCgY(tBB)9(jw+{c1UP0*~#{t<(<(h}*MsPtRC?&+i=A3&HE??h!wclUVPBzbN88COly2Ck8BHNCms@(oW#3Fa z8^=YPJ&4yL;wg_zYprfgk2F0^!|@2|XgF;QaWCQ%G{Uw3e!_CPG?H~t>Y)+YR;9tZ zbZM}xHZ1LY!J%QBl8o3i4a<_0N0LUlm&RUzG#@Do`*x*Cc_hnHu`tTi@G;F{ewc=Q zBy}>$N6=%J6eE1H{w0c=o8hj7T&n;BD#d51uS$1CvSq|6@p$G4#-U(H&v_Dc? z0v$|!2XtlS*uT{A@e*i=E~WBpdIi!uYI$~LzZG!OXS+drmG{@Dh*#0CWzbCU7QS6S z8981Adgt?Q-A9hXTQ!}xuq|&^UQZ=YuZ;0DOZ|(J1L@jErbP*kmkjxxaemDoSpVA>GZerP?rvP#^I06!h^l?KC3n$-7+`+y_-fQEEp2)i^G$FR#s zQa;a&XozHp3*Mw0m%`8fRQrxWblBe**;J}cM=(rtg{5~5{1dpgu zHO+DO=}0$u*)*a%&$aQH1*|aI8djR@&-t#WVd|bEgVcVGx*%mS?<7i6XlVUpfwK*l zOILX(j?25tD|IcToe$X+I*cN}#D|kQS3l{wbXYG!r?e6iIB}H6o$wDB%Y;0-bhDPO z&`#M>KwQ+P=at&^U9DO!pEtgCwH}m%8qKEg2_CQpmQ^(mVGkglw6C;yK#=t(;ES&D zNqu8J&j9L4)&XWyy;5tT$Z1u;=`7DfRd4$xz>_c@L+g(JUDgkp$u$&_(R&fEZJ+dD zUo!7)o+_PzpU&nXI!0a1EYwzlZnN24mT2WMTEm*2nx2~T7sU8Q>4)C$`G5784b$d) z6#g+>>X;As7`PTV1suvv>IGBrSPU%WqGf;Kg>s9pr8z&gpoOVbjXWFN+B8mt&E5o7B!SA-aFGy?@{~d%KdzW$76q!$A z4UDvgSbrDevUx~7?M7H+)VqyD@Te|aTPm&gW!X(wd!L&VY9y!w`vHkLS)dea`Ovm`m$OrNe`KaAYlTTXR6UMsNwJzod-Q7Z6AT7iTU-a{G zd8FK~Ck&#f1gmxjk>Q!Ro`KV+<;3*Tqn&%^0aH0K&o(ZtE9RR= zn2tDu@^$kWByZ?MYQEHM<|}z)oFH~1+VUg$_v#4{k%o@^L7vo;qwuEc3C9qM_f+W# z%d^wV-2afJtvb*7b}0+qL8UC*M+F!idFU+*5G6L^5oK8?=&iVz25mO%gQ(xspItT% zc6#V!x!Df9R`qmH1JtDHr{BtF7kGxxj^T4}oKKFe;&!OgsoH|5EWzhFqS0I^Oxq^& zA&k!r^dhzg1nnd&YZhr))=B%!<4KyJH*~VKe8vkpL(}UyXAJolXqTP7Pb|ZNo3c%?Nj+n$PS1|Lucv4%53y^+fl}|yu=|a zO;?#e>qhdA#y{b9Nv5S;jMp9V_c>5uL`47G*=!i@8{pgivT3@y8 z=sHm6acxGPo3)+&bW~-yiu@A%$KKh_hyTYwYaZ8T_-CHPBOh!dZh5i@(=mP{{?~vb z{A12jY-Txbi%2^ze;^VDr+mT|J;v}(2d3?ZYfBby%RTT@X%q(Dw^Y3ce{0?1Fnkt% zE!#%Cvt0}CX3QIHDz@~t;~D22h;aZ0!R0E^qOypgr8q;F+EwLS+a=4wK4*}effJ7T zIIbtIjAc^B!S1-1>H3XpFSm3cujJTS+BI#q$Yptz+oic#d4qlsh)6>h$zh(sdwEls z%0YE)qxw06w895^0r0_1^)Wugt~nne%=kdeGsh^;b7xx;*8Z5XS3Y2Ogg3}xU>iVu z%;vlO+yv6H9$D*r7I3k=(ECmGbNR5J%NMnu6CY^MkybxBA-}Mnqb!Kavd}ie&Kud8 zahbbiUHMDscG|dXeI8^k!6j*2+0iaBKf<)FI(juwo&(C$S7$XplrMGcb|ZKZU2(UT z14d`-!zu5c+?)?Y6D{#5B*vi+0s`$k>)i`aSZ>BqXQ;Q}UGl+0(rrd}C?9>_0shd* zW_QU+zvaycaPJ)X1pO^<2WthNgCye={vcWIG#9%L+|>cT^AJ~c;8pNvkjCz=msE_W z-g|&g7p8X=X3UlYn@-+Gw0#aL+s}+{V&8v~-#r+Ull^}DQukktD^thR6%pYqZeN|u zXr7e0eS1oyPg(yV=uti@Ym)zDl*g9Oqkivp!rz3SdZ|2+Kkl9(EbYqlenKQ^d;3u! zf(9LFvmIhzcne;>x(aL^Fx6WsGx;VRK4~xbyv#n?b{S?n!m5)rg@v;ZI-t^yv^~pm$$r0B5AO1m=H+?y@lVm z-%gaw^q|Ulm@*-MR_?=?-+1jz6c!uFcECEwZ2Vc4(4h?6?tj+DL}j_#uKCq6qnvv9 z2!bRnFg!BfvVOLI!g;g2$@?H_YkJlh>QmaW;!tl`9^p6rvoJ}&9XKwJGk&X{4Et*p zF(H=rFw?lQnsdUmedo?nd%Vo$XT68$AwJV$ZejRlkS|$FN>~F=e+g5;x zG<4(5v=<(WC0!xLqm%9G9wZp72CfPnCn{`r{X zMV)Zvw8#A*2~iP0+p-9Xz9>xfiZ+KZ)X%V6uW9eLT8HFIc+>IFlbWYmKMFEbnUGJd zHPh?@W#qQ z`BIPBfheAqPi5YZSI`W{qOc2+US+TEWbyVh7k(wnyau(O0^;eEr*mi5`|2v!*NE4T zPvz;gz!4cPSL%GZ*y}8KFg^Q6S5IerA`)omLvXMm=duWncxTtw@eJDz<5X_6cgzR; zs7!|0PFRP`hqx+t;!qB11Mt3wcLOt;)}_mr!cg?oaw%WypeKASwN{jNO1mgeGZN0qupiCgUk8qk`7{s8 zMe?XM@o{1iqlognd0CFes7ZS_>(}x=F_|e`D2I6ohB}1MrpFA*562L~52h&+pGiwT z+nGh|efeiMpMg4iQu7wzaQGqID3>&QPP+Z(HPl8y9zF9Ktb12?vk22MAC+GY{>)l+ zu{z)#AZ8b)rwV)h#d^tBrc3KrL5p=E^|4rO*Vpig@2NWHQ)sPYZG_{E*f|UBR@K)u zJ`yn=j`UG}w3&Mu40VMtwKr@?mXF~-hF^7dqxSM^z!hFQVh($F>}@+hL>jvD;fuU# zKYl}$Hk{j280ut8)miIey?+Y$9J8~&m?z5CvmU%rIbV--QqHo>Dan`etam!nyqum` z8(C@K)8jh9jE8(7|8)j0fZfm1qx`t_pmHa^me&U^?YrW`rVgE~wY*hhqEwDyKgzN) zPvUQ&zp?qLjb!i!(2L0+aW=*#Wk6LE8IV6MlPd!q2e>lW4czmQf%b(@p$vxkzRvQi zY`+ix{T7ySjx}I>(tgkQ4uYj&bi#WO!HjqIE9>&Kao{_)-(aJ<$s?WA4aTWFN&-RE zJI@2m2h7K=A-;BM+$Ll*{5X*HUA!L;(6OPbnJ+UcqJb1KpUO<&tgK`mi1x~chra;7 z&TEqo%93q30}{FbZgJ0dty^fl5wuhuy0Goib8Y$tZA9q3$r&ed{kE{t-D(M`l_`ZsI(;B<>yFPV(_aqJpPAM&MG1`k+$zgeFHYd605 zMDfTS-d%@yKYG_O`8fNScWB=o#bbBg;oY&{+rRH{k>7>qLSLR>IP#G;K2Y8PQNniua=jq_qm`M3nHeJ zkG2$ZdXLT{{6YuDzMhVGQVziDJ0{9n9F@yk5EfopRXElJL7~xW=Ntr!WBAE332ncj zV~&pz8UhT<$T{}tY?-7i2h|a=T*OrCKB=? z`EcHh`AA-Nd4TzFeune;exup)PnU!0Dgj~I;cuIumPu%FE>7rR3KLU=;XBf`#O3}= z>`Uner~T5*ltjCrJ(>WhR!*sNn5Zuq7f3!`Y~pm1&wY|G`c2#CbFB*qJzk`Uu2r&4l_pH#O^b>Mf+9)4XV_--e54*(Cb6txpF` zab*(T723=cqm)jpFNCey$~|KZzsuuVLOis$t$e4U`zKtMhpoFjZ=Em=?}dNf3EvL? zx)Z)TfzKS~o%l5)(vaTk5w|Uh7k#+~VU=m3A3pDLYrnXea(^Y_F9$gQ;K)D6 zXr2J+iS%GMdtfL00{G{h@L@wTl;67$r@AlQuJT|3tiaStq(Ju4+H|?mQr^=H$hwKu2^iY;@nAWO70Y~5KE`J@oC5ZdB^`n$N#U^kA7t9f5Lx_jII2| zc5vTH&?ujIzO<2vROt3p=(VX(<>`kuKkDS`a9!8wmb%UvZG`i^a7POKeSq)mg^y5I zuTQ`^p5l1#stA5Vab@v794n6$*{2Ah=7w`>FslC*Bb+d8Pj=^V7rk_oTWu}|*J9ae}7dJ|uOFi3?>2o`{#zaS% zL-$Ai9M2iP(siCc?ZW>yg3l=&@Ao5LBHWx;X-|mrakAsmk~@Yc-G2k#Yzp1~jo>cb z(TfS+fG)MfI*FEjmFnKPo6ES^8nMQZV zad9xBoM+roM9PYId-~ytz5XB%x|O{(3{Z{f*aQxvCYx3 ztWsAO0nej6{V0NbsZD<;{26jyDtC!$<3<t61tmyA@}3V(60y zjpCxL>D+u~5LW*D)|w1L!n`n7matpy2Y{c(!_2CY z9&yi)heNl|$9RZ^w?1qMyFBRlFk_CL)z?gsBkF7G)1%{P1t#+{$U~j*Uo3Xc;K<9G z?eR$;c%zR`Mu+GUhIii4f1FG?=oWE|XIuPYGJZ0Ckgei?DtSb&i`AdT6hs z-|mk$=^P&`_&b6Bg8}%-BVfr3^gZp2?h8iE*~UEwuQCn##LPz}KIK4E#1jX7&QE=& zHrm<+W0DUWxojiiYTzV~y&%MGqt65GGgELA$0Z7H#N9Rs*BpTu;`)Pd?ZIIza~5>> zrr;)zAynL3`r(=bQD|0#2k5~C#|Pu;ae^U!X#@Oe5{FY>n*H#d;{l0FUQ*6MpOiA% z1HX&~GPE(KyWlM;w7GQRRw8M$Ufwkb*E#o%xDOA)HAmt}`N+eE(s7NX3zUT6mvkQ; zgzL~H?q8(fhDQ&XBRWGK9#6qd9FZ5|eqjKv6@%ciKFm4c@ivljv|UL1zfx#pO3gj4 zPHY4^o-_@9ztV#v$=ebQLL zOH)_+@9c}~(0AlR`Ts%RH1V>M|Bv;>b?7H#`PY5ZkbZQ=73u#&UtEX2wT3M7cBJ`c zN*b=(CXXE>K5WH>KS;q3+q5;D#6|nKXln{CzS?q+36pvv?lT7BMs-Tus|VrQ)iUMb z`gB}d{n2=kbY}+Q@=Z8wqZjQPglmrL3d?qQAg**}f_npaxF-cS^(ZUb!Lyu9*V=44 z$DU6ho%!cR+&)J65gv_KiU00_`4Hb^K)#5d);@%O{5U5mKk@&xAN>$NqR(=FW*~mg zaY&(@zqHwOj=V62z39JF(y`R`I3b~b1@L~9f~Us@Q8pOAjSZ#XNM944=3?|M3*7O3 zxXuwjq>H@Au1vw@m;%wt-&k6|0i3+zJR5Y<#&&uVg_dD9C9h8Gv=@^nWH&aSg6kZI zBfP=JjNO)kmpJAo#7!If5!X4kCd7S33f;ufG=hsU{D%LlfxQ?px*dIhEk8b(j32;4 zIbDkDZIU-$o@J;W9g3pygZ?YS^c(#5WyI(Qv`6U2{|iIeS0#TpeiDJ`bP4i7y!-m% ziE4;^z|Ytj!Gp#~e$gg)Tb{9XiAPJ9_~-xxjeos~?>Trt0mdq1SL^v8bJk*E8C ztL8uGzeCioLI3?hFFE#mLLZw0P@m?%K<-a=qK^Y7^&2>6@9V8d|3~Maev+Twh4d2N z)RE`^?|)^{CYmu^`iE00>$;S+_oE`lUkMtfk4t=Tllb<6c%K$J2|WEU2ee3!a|s*$ zYl*V@s?aj+HTgd!>fdK2zV|~A<@xV>d5J!}u)JIbn|Mm_dOwD+vKjlb$){(NKjX2! zHuldFZ#Uapx|GGg2)xe*d5d>B@cu*adN;0m&M|v4YZ8s9QP9v-@8{7apPA=9D8=V!PCkC_250?#wGqk zhWPPpPkdzGu}+xzxWsGuK@g5S!S;^tip5RJ%1K8s3=ZkPFpd-M3?vQc?6?^}EB#4l zXP}{h`Q7n@LL=Htr)iG}JbjZKakz?}{3jXbi(ew?qRn8$y#)E(X^VhIY=0NyPP%b0 zb4Vg`z}(Ih!Y{0Lu<;8O}G zk8d#W*iHj2+nXkPHvupX>jUHOFmd5RwWfIw;fV!wP4j*e7fXXRzVVL`o>-7(8peI1 zPaNdc^FKN0-njY49Dg*Ys}n}%jQgDYe@^1;YJ!PF+aG^oGJV3Id@%lN$#^?w&UtQL z7nYm#R;gR%-YNM(r8iN+Sqed?a~JB$m%g*XNefX-G zuME5)Nvm4m20l;Le6VR!XU)}qAVI;?9y;gg8l%@*1~Vu%cv`|=-dId5j;zREzr1jg z-q(LTweZ79{x1!`<1C%=Tcu8?x{4#1T&QO4<41d)X1n8+o5A8@wOoa$I$k%Z<6B)U z#^cPYY>STJbPV;|HsdkiXV!pDMLw+iK@jwS_Oe@V7hVAP1$f3&;57-%6JY zhCUhUPuBJ2wUF&8aLG;JwqzD_g6m%R7pv$Dl-9D{ zp=M)OtR#qj)ap&>@|I~EHeIDs_Lf@}D|GkMfl#?)`wUD4hH=7eW2KH7?3VmmiGOQE zb4TkG>!i8^JAwux(uQ~q$EDg@=}gCmwwk4J{HC(I+^l$bJFJ$2qO?k`!L@^0fPd)v zG>RVfJab!{FSbGh(ja0G$OU}3xEhFX6(YEe;B*&j)~k@W*&=7M5s0&3OGQw2v4jo# z<1bg2ma(m_p2IqGrQyq$En(0^P+cN8LfoQUq#~RBcttW*lmbBO#nKiRFhxKG6>A%X zIu+RrC9N8^x+vRYa8_=U0X#qodtn$bn_gs6B;04?$tSZk$HnTYMssa#8U0SZ(u7rI zJ_R=)Aqd-AY&Ob)cdFgM;jMCykYpCagB*$|lPn#D0VAARb1j7E{tNV<5xNEbgD+dSLq(g=u!t z+I*y*5sdaoTKsAg{~UDS*! ?GkmH-zV^IsZipgc8T^`Gz-Oc`L`&40Og-DIY&v8 ziqfIu6)#q-LO)hPLqAqIW2=}FFcZu(CdLFX^X^1pt;|^$oOJ{EPZ)GSmjFXAmbOAa zQp0cP79uae;bc76br#Un3nKC5FX*{0ZiQZ~UBPeX$Y*6(AripcdTedU1f0bMEROWR zu%Hno!s3q;NW-2J1e^D?4fJMV5G=WT(Lu2J83fC53<323*~M2lLa9xA?g~ZZpNrt2 z3Ap8O%JJ`w{8#}9ai(!3P5KWsQo%TyCd4)x7!TX{a6TNz+7LesyYaF4?+DESQzy;r zwaiY73dk@UB-8lHCFw(;;?i~X3hqgjG3oCwa_m+c84Kr!*&YNf*6 OPqI~*e!TdI|Nj8Si!WyY literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/cpio.c b/lab3_ADEX2/shell/cpio.c new file mode 100644 index 000000000..a38879c9c --- /dev/null +++ b/lab3_ADEX2/shell/cpio.c @@ -0,0 +1,96 @@ +#include "header/cpio.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/allocator.h" + +int file_num = 0; +struct file *f = NULL; + +void allocate_file_array() { + if (f == NULL) { + f = (struct file *)simple_malloc(MAX_FILE_NUM * sizeof(struct file)); + if (f == NULL) { + uart_send_string("Memory allocation error\n"); + // Handle memory allocation error + } + } +} + +void traverse_file() +{ + allocate_file_array(); + char* addr = (char *)cpio_addr; + + + while(utils_string_compare((char *)(addr+sizeof(struct cpio_header)),"TRAILER!!!") == 0){ + + struct cpio_header *header = (struct cpio_header *)addr; + unsigned long filename_size = utils_atoi(header->c_namesize, (int)sizeof(header->c_namesize)); + unsigned long headerPathname_size = sizeof(struct cpio_header) + filename_size; + unsigned long file_size = utils_atoi(header->c_filesize, (int)sizeof(header->c_filesize)); + + utils_align(&headerPathname_size, 4); + utils_align(&file_size, 4); + + f[file_num].file_header = header; + f[file_num].filename_size = filename_size; + f[file_num].headerPathname_size = headerPathname_size; + f[file_num].file_size = file_size; + f[file_num].file_content_head = (char*) header + headerPathname_size; + + addr += (headerPathname_size + file_size); + file_num += 1; + } +} + +int findfile(char* filename) { + for(int n=0;n<=file_num;n++) { + if ((utils_string_compare(((char *)f[n].file_header)+sizeof(struct cpio_header), filename) != 0)){ + return n; + } + } + return -1; +} + +void cpio_ls() +{ + for(int n=0;n<=file_num;n++) { + uart_send_string(((char *)f[n].file_header)+sizeof(struct cpio_header)); + uart_send_string("\n"); + } +} + + +void cpio_cat(char *filename) +{ + int targetfile_num = findfile(filename); + + if(targetfile_num != -1) { + for (unsigned int i = 0; i < f[targetfile_num].file_size; i++) + { + uart_send_char(f[targetfile_num].file_content_head[i]); + } + uart_send_string("\n"); + + } else { + uart_send_string("Can not Find the file\n"); + } + +} + +void cpio_exec_program(char* filename) { + int targetfile_num = findfile(filename); + + char* target = (char*) 0x20000; + for(unsigned i = 0; il|R z&x|a4hd1Zm-#zDd&pG$Jd*2^+?zvmnG?1pjvrr!i3J|-l-Z$N@3D-g!EKk2&S~g&A zsTHc70JAaOtQG)HEw!4}<>^vwG!bZLSmLCgj2SqW+vV z_l*H3HLWll`vB%H-wd=~@iJmhKw-FSbe+6>n}?N+4K7CWe@8yO3FogHDm@W2&-??| zzAXT2yC2{Dw;&iZ<2uZo0Bz=(WOpU62WLhKQ2KKa&I}&WN|%fqPR5?sD3&6vi)(F- zJ*Le)`F*W#>HbLR+lL1*hQZSE^y^pUWC3#$tJY4V-7G$?{TsE~hI&3;x+)*1(Z}yF z4$8?wi+QG?SGKQ*!nsb2s|n*jfmps7)<&Uo|35VtIe{^dZ)Vb|6i*;O=7xMc`(v%I zY;g%o&${axUTR2((rOnL?15UUYp5$Ma=>E zM|K+819Z;lZDw^;!#e9Qt7HR7tKZF+o5%HAMd#O`fAJ~%jPtX!zbMf+s{7ZduGdpM zjppk4tj9pqe%?0y51K>{5rx-~u3dR?&VvI0_xiPyIP2>ro1bEVYpCQtGd zlzo%f>78E+6#jY%>-aZ`OwK+KveM~X+;UR6Y$##dIlBe(;@4tIBVdt;dx zw6dXW&I#R}%8rGcWFj=4N+)n~*Wln?p)C)LPG+6SP;YOzFWhrS@1#5I{r$FW;hw%< zGVJkncmlM?h9NL@leV#K6Kp}Oi}BqgBkiH1fn&zNyuP#LlaJ50L!@<=D*<|NdWdy{ zbTCHR_a1FIcFn-S=0irh$X{ zA#G?rP&7tRU$l2h*Y)c^Y?t=i?J64cfqO5UA0YL1*n#sOvF`hxu6ZeHZ8Z&J z)f)xCz~5@kK&I820eHgsTF@Q;6mNBL4p6c2^c(T7Q8c}-ryq1L7XPFH-t15DWwVYf^y6M!uEcZRzXgrshudgkf8C-MAKmWwAX+rtx6iFkCv z&h4|U42+{OdY7HdV1U@#JOQ1U-<22hM#QP+q}|RPzkWaC#IL?ZCga!p z@FB*3fw=NX2#+W{s-H2&{p(VlQQM9@YrU@f?{HuI3Gw)Gmg0}#1;+b*JhO~b9@cT6 z#M2G%7Zn`8V^`Xn4e)muCx6s<q z@T>k$DEun^oWi5V^_hZqNitD>&bWVH0(@@y<7#7E_C@0AV%+~8g?v2nes1yc2;SF# zXGGyq<9$%!QSl>;`|ERoaeut;Hoz+ik6O<+at@ntA323CvfGF6<*~f)qA&N(DWAUF zJ7pg(_fClGQ+VWlfpGpn#<50GI<_a1(z6q3E9@ku90-qDjs@Y-d>+Dfjs~RO8}5fN zp7ohT7FF;oH4)x*?*n(_9V@;c^~gGrjE>`Ro?x&3e-T1c3c>$HVIoE?q;4XPJ6yE> zw-LLfV%8zIw{VRIyvg?T-A(HRJ$U8&_*TYwTX_~B=37@LINdS?x_5}Pk-gk+Vj%0w zxEDLbxlI6;vOazHs7>s}4-+S;FYle`{+s=mdr@$)6L}BY%e=@B|Ht@$$M$N?6Gxft z<$M-i@n6RD{YI*$04$UIa?SFX_K$4EUd}9v!@o9}^l(8f@FaaNUyG05p320(cL>3| atoSw!lqPu-i0<~)>?`blQWRPG?f(lT;Iw@J literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/dtb.c b/lab3_ADEX2/shell/dtb.c new file mode 100644 index 000000000..523dac1d4 --- /dev/null +++ b/lab3_ADEX2/shell/dtb.c @@ -0,0 +1,163 @@ +#include "header/dtb.h" +#include "header/uart.h" +#include "header/utils.h" +#define UNUSED(x) (void)(x) + + +char* cpio_addr; +int space = 0; +//1. Define the callback function type(fdt_callback) +//2. Create a structure for holding the FDT header information(fdt_header) +//3. Implement helper functions to extract the FDT header information + +uint32_t fdt_u32_le2be (const void *addr) { + const uint8_t *bytes = (const uint8_t *) addr; + uint32_t ret = (uint32_t)bytes[0] << 24 |(uint32_t)bytes[1] << 16 |(uint32_t)bytes[2] << 8 |(uint32_t)bytes[3]; + return ret; +} + +void send_space(int n) { + while(n--) uart_send_string(" "); +} + +int parse_struct (fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr,uint32_t totalsize) { + uintptr_t end_ptr = cur_ptr + totalsize; + + while(cur_ptr < end_ptr) { + + uint32_t token = fdt_u32_le2be((char *)cur_ptr); + cur_ptr += 4; + + switch(token){ + case FDT_BEGIN_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_BEGIN_NODE token. + Node name (variable length, NULL-terminated): Specifies the name of the node being opened. + */ + //uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char*)cur_ptr,NULL,0); + cur_ptr += utils_align_up(utils_strlen((char*)cur_ptr),4); + break; + case FDT_END_NODE: + /* + Token type (4 bytes): Indicates that it's an FDT_END_NODE token. + */ + //uart_send_string("In FDT_END_NODE;\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_PROP: { + + /* + Token type (4 bytes): Indicates that it's an FDT_PROP token. + Data length (4 bytes): Specifies the length of the property data (len). + Name offset (4 bytes): Provides the offset of the property name within the strings block (nameoff). + Property data (variable length): Contains the property data itself, the size of which is determined by len. + */ + //uart_send_string("In FDT_PROP \n"); + uint32_t len = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = fdt_u32_le2be((char*)cur_ptr); + cur_ptr += 4; + //second parameter name here is property name not node name + cb(token,(char*)(strings_ptr + nameoff),(void*)cur_ptr,len); + cur_ptr += utils_align_up(len,4); + break; + + } + case FDT_NOP: + //uart_send_string("In FDT_NOP\n"); + cb(token,NULL,NULL,0); + break; + + case FDT_END: + //uart_send_string("In FDT_END\n"); + cb(token,NULL,NULL,0); + return 0; + default:; + return -1; + } + } + return -1; + +} +//4. Implement the fdt_traverse function: + +int fdt_traverse(fdt_callback cb,void * _dtb){ + uintptr_t dtb_ptr = (uintptr_t) _dtb; + uart_send_string("\ndtb loading at: "); + uart_hex(dtb_ptr); + // uart_send_char('\n'); + uart_send_string("\r\n"); + struct fdt_header* header = (struct fdt_header*) dtb_ptr; + + uint32_t magic = fdt_u32_le2be(&(header->magic)); + + if (magic != 0xd00dfeed){ + + uart_send_string("The header magic is wrong\n"); + return -1; + } + + /* + +-----------------+ + | fdt_header | <- dtb_ptr + +-----------------+ + | reserved memory | + +-----------------+ + | structure block | <- dtb_ptr + header->off_dt_struct (struct_ptr) + +-----------------+ + | strings block | <- dtb_ptr + header->off_dt_strings (strings_ptr) + +-----------------+ + */ + + uintptr_t struct_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_ptr + fdt_u32_le2be(&(header->off_dt_strings)); + uint32_t totalsize = fdt_u32_le2be(&header->totalsize); + parse_struct(cb, struct_ptr,strings_ptr,totalsize); + return 1; + +} + +//5. Implement the initramfs_callback function: +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size){ + UNUSED(size); + if(token==FDT_PROP && utils_string_compare((char *)name,"linux,initrd-start")){ + cpio_addr = (char*)(uintptr_t)fdt_u32_le2be(data); + uart_send_string("cpio address is at: "); + uart_hex((uintptr_t)fdt_u32_le2be(data)); + // uart_send_char('\n'); + uart_send_string("\r\n"); + } +} + +//6. Implement print_dtb callback function: + +void print_dtb(int token, const char* name, const void* data, uint32_t size) { + UNUSED(data); + UNUSED(size); + + switch(token){ + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_space(space); + uart_send_string((char*)name); + uart_send_string("{\n "); + space++; + break; + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if(space >0) send_space(space); + uart_send_string("}\n"); + break; + case FDT_NOP: + break; + case FDT_PROP: + send_space(space); + uart_send_string((char*)name); + break; + case FDT_END: + break; + } +} diff --git a/lab3_ADEX2/shell/dtb.o b/lab3_ADEX2/shell/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..52e6b26ddeb9ed5149e2f9c032346cb3c2b5bae9 GIT binary patch literal 4880 zcmbtXU2Ggh60VuqILkUQN$fy`4?MZEP=dnBHbz+Jq>Sw(aFCoFXQSgsVm;m+yero0 z_3kYAus9qkLXpgaqih05Bo_n^v7b*meB#Ff9(X&8I3_Pd=I)UfkomKOF;zWPanrFS zBubj;?ysu8s;;h?oqhT6(Id8HfrthFhV_-80Q0x6&pkEuU^{HXnKujZxu@ow^kR$a zTwAiBb9MZK=~V~LE}yWbn*gSk9k{P%!&#+wnr6_cR;h#0x7OBD%O|?0SI0lPLjH8E zj=y))x6}L6W>bjzI)o9{?37!?;U$)*|BB@j(G1<+?H)H>ct>+#)j0FPUDON z6a6+!eAW_!(Sa?HYKgU%B#6$jQ-%s}ByE-2E{Ll<554FMB|2cQgJaF3EUrEe8wHI^zztec%UbthD z{7#|Y60WHRU-r0@KQwzQH`dnfBpu?aHe^G3AN8N3j&h?o*Kw}bmg?{=)&y;*@H$IA z!l7fnjc4?qQ~h%vzF$5F@Ejg+O4qONJvxWXE8hMkJg311ZtSUX&yYAK03KYf_f~|1^0cG9sQpmv zZh#fC9iTnnn&#w#;}rSfNc(P*_^adZtNx*L_i&$4-&ixMPqtz|U|(ET{Y2;Xu{vww zA|C2j9BZ;}jC-?w9UQmfFpG5?J%)VL&y@rmmwv`RK2EhFznANv{S@~!aS%U_DnH?r z7M7@_Z~RY`5YU4jgN93G~DMgBa|bOTcW@hwJ;HIF0yhHsbRr z+#5ZAOU~|@^*&blqB(#|H<{HL zZocBaP#!4`vA&QmR>uzHi}|pey}uIr`b=Z-(FSA_J4GAB-=XoGYqhU^Rr&;huGLXR`a$Nh3#RS-dH3q zUI%D`;?b?A!Mzx}K~JsQ!s;P!2`8wq2~dglSsm?IS7~G;dH?Z_POu>tDFq zbK{E!+;`h~`+`Nb3O})MwRhcIR6XSK_`=n0Rz-m}xKrpDe6zNJ3LGHqt>U0&BXN+) zl&uQbjAx5!4pBdChTqCh1P(+|bh3yi4(j3170NztAkor+x?Aw=i0snpu#GL68JGU` z7{3=s!5C7*LwF~iU-c(qhw$3S{=_Eu0OG_`;*zSqL~M8y`{&ty2fnCDRA1tF8n2Dw zzJWOLPqDq~O~hQhcH;R;<>Vw@WE=-2q6d5rB{R@E2CZ3mHXEj^4|JppLC0VKm7thS zS4w^+fGWOU($P9B;~NV~ez_8)D`B~s385P13zf8A$PX3M)efWc}yEOa>4cF~YGcNf^Jm)ze`4^+bN#8o zBltYyW}XWgkG`+#8jp^Dt=a2u%O5p+9gp)*g&B7b<5Gt+TnCqNse|CHjGJ}XXYj~= z4;VaxcQS6~)1~p~`~9=VqvMZi_WFL0YW6yge@K*=aR)SeojY8ns4jWf@ijNi?DF8Di|y}qw2jLUg34g8C7bHDS9o9FlkcHDw-xs?>sX5jLU zNEvt^uir6n`JG%a@EsBa?*DZ!JKzYmB0ASCezCmM4yD+dKX83tn^B(r|#LvpZE zfn<4v7G&O@?1Ciz-V6stG%1dRLGqEmo}{no%yVc*-a#(?Y}p?UqTs*d?xHVkK|d3s z^XP`M!1az+xBlkScMP4sCk8zB-4;#G@TVAkPf;A{hdpd}FXKiSXd==Lgv)(XL*LlM zY5MPBfBD`L2Z=B1cAOArhX6c^KmGaDMf@cX50x~RJ`>xwIX>m5i}=a-7gWkzxBKsJ z-2XG|FKs6r^X#89$R&TVdlDyP>IuN(^@eCN#cMi0@)dtMKcY8dlS>yjREd@Kh|#yO j=}&E9o*hDPg$>`Pg(k*!)VI<`{yF}!%W1weHT{1905y4h literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/except.c b/lab3_ADEX2/shell/except.c new file mode 100644 index 000000000..9f056fb17 --- /dev/null +++ b/lab3_ADEX2/shell/except.c @@ -0,0 +1,201 @@ + +#include "header/uart.h" +#include "header/irq.h" +#include "header/shell.h" +#include "header/timer.h" +#include "header/tasklist.h" +#include "header/utils.h" + +#define CNTPSIRQ_BIT_POSITION 0x02 +#define AUXINIT_BIT_POSTION 1<<29 + + +void except_handler_c() { + uart_send_string("In Exception handle\n"); + + //read spsr_el1 + unsigned long long spsr_el1 = 0; + asm volatile("mrs %0, spsr_el1":"=r"(spsr_el1)); + uart_send_string("spsr_el1: "); + uart_hex(spsr_el1); + uart_send_string("\n"); + + //read elr_el1 + unsigned long long elr_el1 = 0; + asm volatile("mrs %0, elr_el1":"=r"(elr_el1)); + uart_send_string("elr_el1: "); + uart_hex(elr_el1); + uart_send_string("\n"); + + //esr_el1 + unsigned long long esr_el1 = 0; + asm volatile("mrs %0, esr_el1":"=r"(esr_el1)); + uart_hex(esr_el1); + uart_send_string("\n"); + + //ec + unsigned ec = (esr_el1 >> 26) & 0x3F; //0x3F = 0b111111(6) + uart_send_string("ec: "); + uart_hex(ec); + uart_send_string("\n"); + + while(1){ + + } +} +int a = 6; +void timer_irq_handler() +{ + uart_send_string("in timer_irq_handler\n"); + uart_hex(a); + uart_send_string("\r\n"); + //enable core_0_timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + // Disable interrupts to protect critical section + // asm volatile("msr DAIFSet, 0xf"); + + asm volatile("msr DAIFClr,0xf"); + + uint64_t current_time; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + + while(timer_head && timer_head->expiry <= current_time) { + timer_t *timer = timer_head; + + // Remove timer from the list + timer_head = timer->next; + if (timer_head) { + timer_head->prev = NULL; + } + + //free timer + + // Reprogram the hardware timer if there are still timers left + if(timer_head) { + asm volatile("msr cntp_cval_el0, %0"::"r"(timer_head->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } else { + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + } + + //Execute the callback + timer->callback(timer->data); + + //enable interrupt + asm volatile("msr DAIFClr,0xf"); + } + +} + +void uart_transmit_handler() { + //uart_send_string("in uart trans handler \n"); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | (0x2)); // enable transmit inte + + // special case (Enter) + if (uart_write_buffer[uart_write_index-1] == '\r'){ + uart_write_buffer[uart_write_index++] = '\n'; + uart_write_buffer[uart_write_index] = '\0'; + } + + // Send data from the write buffer + while (uart_write_head != uart_write_index) { + mmio_write(AUX_MU_IO, uart_write_buffer[uart_write_head++]); + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + + if (uart_write_head == uart_write_index) { + //uart_send_string("//////////////// \n"); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~0x2); + if(uart_read_buffer[uart_read_index-1] == '\r'){ + uart_read_buffer[uart_read_index-1] = '\0'; + parse_command(uart_read_buffer); + uart_read_index = 0; + uart_write_index = 0; + uart_write_head = 0; + } + } + } + mmio_write(AUX_MU_IO, 0); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x1); +} + +void uart_receive_handler() { + // uart_send_string("in uart receive handler \n"); + // Read data(8 bytes) and store it in the read buffer + char data = mmio_read(AUX_MU_IO) & 0xff; + // uart_send_char(data); + // uart_send_string("\r\n"); + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + uart_read_buffer[uart_read_index++] = data; + if (uart_read_index >= UART_BUFFER_SIZE) { + uart_read_index = 0; + } + + // Enqueue the received data into the write buffer + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + uart_write_buffer[uart_write_index++] = data; + if (uart_write_index >= UART_BUFFER_SIZE) { + uart_write_index = 0; + } + + create_task(uart_transmit_handler,2); // for echo +} + +void irq_except_handler_c() { + + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + // unsigned long long DAIFSet = 0; + // asm volatile("mrs %0, DAIFSet":"=r"(DAIFSet)); + // uart_hex(DAIFSet); + // uart_send_string("in irq except handler \n"); + uint32_t irq_pending1 = mmio_read(IRQ_PENDING_1); + uint32_t core0_interrupt_source = mmio_read(CORE0_INTERRUPT_SOURCE); + uint32_t iir = mmio_read(AUX_MU_IIR); + + if (core0_interrupt_source & CNTPSIRQ_BIT_POSITION) { + + // uart_send_string("in core0 interrupt \n"); + //disable core 0 timer + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 0; + + create_task(timer_irq_handler,a); + a = a - 1; + } + + + // Handle UART interrupt + if (irq_pending1 & AUXINIT_BIT_POSTION) { + // uart_send_string("in irq pending \n"); + if ((iir & 0x06) == 0x04) { + //Disable receive interrupt + //uart_send_string("in iir 0x04 aaaa \n"); + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x01)); + create_task(uart_receive_handler,1); + } + + if ((iir & 0x06) == 0x02) { + // uart_send_string("in iir 0x02 bbb \n"); + //Disable transmit interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) & ~(0x02)); + create_task(uart_transmit_handler,2); + } + } + + // asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + + execute_tasks(); + //asm volatile("msr DAIFClr, 0xf"); // Enable interrupts + +} + + diff --git a/lab3_ADEX2/shell/except.o b/lab3_ADEX2/shell/except.o new file mode 100644 index 0000000000000000000000000000000000000000..daa6bcb83bf93ac4a9e9fe4beac2a47b7b127e41 GIT binary patch literal 5696 zcmbW4U2GiH701uaY!WARLSiqFCKQi9gi;h%wlT0!B+ohyNkmlAWRcPWU5|Gs-Bs*O zygP=4AiPO=h!B+=Ws?SpL_tC#?o*M1U{zWoK_x%%P`TLJfQZaC0J;s826l+ zbJxe?-9GeM*Z1Dv{Li`Pe$MRF&b?3Rng%Lq@F6U<6veWAscv~y3)Vv`EFAme3^u1R zpIR{B)a?TrwM#xLmY3>qit1WRac&5T`!%@q4Pe;?P&U8XT3LL?s0>tpQo(Mf^SV_V z!CW-p^89o9%sr@k1oJw8@E|~~bE8#@q0J+hHHgiaFnEpZ$>xd%moDoI zempR3f>r(u`}4=!(f?i2nAwc6*Seu*;+PD>s+~ZM6@s6Q%#K7m24LbJ0C8+@ifP6D z_H0-5D+3-ZqIPQ5jNXg3VeIEE%mdh06@5RBrG`EXe}1QLBbx-P2AD(W|5I!af_~UC zAl`+3kI&lCQ60+1F^{5M;?7+Y#canuCR7 zfA;4x-4#Vvn!>oQV9XSchWQh0lg;en;=O9VH5#kx!yjw8i+tV(Z8Vv++@b#nl)g5h9Z7=~Lh)=D9 z2@B_6ofGm+=Xt&zYIL6O_Q&Im5zi^^EC2jo)X^{QuZudA=i9B?KXJW(jcZKn(2e^D z{dhLC--d8cj-oBHlI(}{oelLJ4fU(h0i{gVbTi{lE|JMiB+_;^HRj~-9)b1r57VBk zxwDXTj=Gs6S<`>+J;@)<=Mv6X-xH=M1D1m`whV)lB*m^BJDxDNJv%y?btlcfzQ{nN z_o2Q?ui5une}ANR;Kz)8ZvY#)qP?;oLWTRat*srf4cTVq*Qtzc=smys!m8oZp^_0l ztDVt*aji0R^TuDVZU8z^!>q-7jAKZ*G=KmV3Wj%^Rcwimnb zy$_wypRO!5pY}Q1H7dw=2>!F!=$X;@O#}x1HA)70YLpCEwF3L=xstE9b9Eu?e4U!Y?-A?>FI}Ag4I@;pIgltY)&!fUg^Q9GA+63HXu z<9G@B<~b+nWL|XY-6m0wUAlJuFwk}B4^cf%B*7^-$w^k^!Nw`8pSX6MCwZFG4!=9V z)p^*8d;>Y)r0zZPBTpIKOO$>T;HF0b$j@C|r=o}JDjwyR?p8`F9>ur&*z+Uf*~k1b z^e^{CoH>0YNUrt~>DyRC#T}uSycKnnNRQtE^|YBe`ImgR(5pElqk}>(c}nQ+DCBbFCZwoH_y~CXLiFy}M z*RA{_rg&K5MYK_H|69((5N1wsN`4>n74H}3w6Em3>uI9j-h>Y`r#R)g-pxFCE)Fse z_M2iJoCjCoUg+8`G|WHs`jbvZt z0Do64W+eaexNDC>1izmAGOcPkXUvYcPQisp%64stjOOzY$sM5v$@?Nvh|rgglSN7P zi0edl{q)&~@~)jcj5@M*(uqSkd)(pP|Np{7Q=FO=U+xw%O6Pc9{nqkt24Y(=lf=R- zlf^$ctNhb~n$%AVi`1Gvz+6omKZfhvZ=n17_nOkt_Ye6D+W#$R$OaUHOnulO)-NH} zt85>fVHLmfW1*Jny_jX%$sd#I`%FDkcB +// #include +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef void (*fdt_callback)(int type,const char* name,const void *data,uint32_t size); + +struct __attribute__((packed)) fdt_header { + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +}; + +int fdt_traverse(fdt_callback cb,void *dtb_ptr); +void get_cpio_addr(int token,const char* name,const void* data,uint32_t size); +void print_dtb(int token, const char* name, const void* data, uint32_t size); diff --git a/lab3_ADEX2/shell/header/gpio.h b/lab3_ADEX2/shell/header/gpio.h new file mode 100644 index 000000000..38ca70635 --- /dev/null +++ b/lab3_ADEX2/shell/header/gpio.h @@ -0,0 +1,38 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +//Page 90, Physical/bus addr diff +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + + +// Helper function to write data to a memory-mapped I/O address +static inline void mmio_write(volatile uint32_t* reg, uint32_t data) { + *reg = data; +} + +// Helper function to read data from a memory-mapped I/O address +static inline uint32_t mmio_read(volatile uint32_t* reg) { + return *reg; +} + +#endif diff --git a/lab3_ADEX2/shell/header/irq.h b/lab3_ADEX2/shell/header/irq.h new file mode 100644 index 000000000..9085cb30c --- /dev/null +++ b/lab3_ADEX2/shell/header/irq.h @@ -0,0 +1,22 @@ +#ifndef IRQ_H +#define IRQ_H + +#include "gpio.h" + + +#define IRQ_BASIC_PENDING ((volatile unsigned int*)(MMIO_BASE+0x0000B200)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B204)) +#define IRQ_PENDING_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B208)) +#define FIQ_CONTROL ((volatile unsigned int*)(MMIO_BASE+0x0000B20C)) +#define ENABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B210)) +#define ENABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B214)) +#define ENABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B218)) +#define DISABLE_IRQS_1 ((volatile unsigned int*)(MMIO_BASE+0x0000B21C)) +#define DISABLE_IRQS_2 ((volatile unsigned int*)(MMIO_BASE+0x0000B220)) +#define DISABLE_BASIC_IRQS ((volatile unsigned int*)(MMIO_BASE+0x0000B224)) +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int*)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060)) + + +#endif + diff --git a/lab3_ADEX2/shell/header/mailbox.h b/lab3_ADEX2/shell/header/mailbox.h new file mode 100644 index 000000000..d13ac3ce9 --- /dev/null +++ b/lab3_ADEX2/shell/header/mailbox.h @@ -0,0 +1,38 @@ +#include "gpio.h" + +extern volatile unsigned int mailbox[36]; + +#define MBOX_REQUEST 0 + +/* channels */ +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_GETBOARD 0x00010002 +#define MBOX_TAG_GETARMMEM 0x00010005 +#define MBOX_TAG_LAST 0x00000000 + +int mailbox_call(); +void get_board_revision(); +void get_arm_mem(); + +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 diff --git a/lab3_ADEX2/shell/header/reboot.h b/lab3_ADEX2/shell/header/reboot.h new file mode 100644 index 000000000..e1d44aa1b --- /dev/null +++ b/lab3_ADEX2/shell/header/reboot.h @@ -0,0 +1,8 @@ +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + + +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); diff --git a/lab3_ADEX2/shell/header/shell.h b/lab3_ADEX2/shell/header/shell.h new file mode 100644 index 000000000..9784c1ccb --- /dev/null +++ b/lab3_ADEX2/shell/header/shell.h @@ -0,0 +1,2 @@ +void shell(); +void parse_command(char* buffer); diff --git a/lab3_ADEX2/shell/header/tasklist.h b/lab3_ADEX2/shell/header/tasklist.h new file mode 100644 index 000000000..de876b84c --- /dev/null +++ b/lab3_ADEX2/shell/header/tasklist.h @@ -0,0 +1,21 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +// #include +#include + +typedef void (*task_callback)(); + +typedef struct task { + struct task *prev; + struct task *next; + task_callback callback; + uint64_t priority; +} task_t; + +void execute_tasks(); +void create_task(task_callback callback,uint64_t priority); +void enqueue_task(task_t *new_task); +extern task_t *task_head; + +#endif diff --git a/lab3_ADEX2/shell/header/timer.h b/lab3_ADEX2/shell/header/timer.h new file mode 100644 index 000000000..a9a8c65da --- /dev/null +++ b/lab3_ADEX2/shell/header/timer.h @@ -0,0 +1,20 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +// #include + +typedef void (*timer_callback)(void *data); + +typedef struct timer { + struct timer *prev; // previous timer in the list + struct timer *next; // next timer in the list + timer_callback callback; // the function to call when the timer expires + void *data; // data to be passed to the callback + uint64_t expiry; // the time at which the timer will expire +} timer_t; + +extern timer_t *timer_head; // head of the timer list + +void setTimeout(char *message,uint64_t seconds); +#endif diff --git a/lab3_ADEX2/shell/header/uart.h b/lab3_ADEX2/shell/header/uart.h new file mode 100644 index 000000000..0c3ff1bd8 --- /dev/null +++ b/lab3_ADEX2/shell/header/uart.h @@ -0,0 +1,39 @@ +#ifndef UART_H +#define UART_H + +#include "gpio.h" +#include +#define UART_BUFFER_SIZE 1024 + +void uart_init(); +void uart_send_char(unsigned int c); +char uart_get_char(); +void uart_send_string(char* s); +void uart_hex(unsigned long long d); +void uart_enable_interrupt(); +int uart_async_read(char *buffer); +void uart_async_write(const char *buffer, int length); +void uart_async_send(const char *str); + + +extern char uart_read_buffer[UART_BUFFER_SIZE]; +extern char uart_write_buffer[UART_BUFFER_SIZE]; +extern int uart_read_index; +extern int uart_read_head; +extern int uart_write_index; +extern int uart_write_head; + +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile unsigned int*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile unsigned int*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile unsigned int*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile unsigned int*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile unsigned int*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile unsigned int*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile unsigned int*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile unsigned int*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile unsigned int*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile unsigned int*)(MMIO_BASE+0x00215068)) + +#endif diff --git a/lab3_ADEX2/shell/header/utils.h b/lab3_ADEX2/shell/header/utils.h new file mode 100644 index 000000000..3ba6dd719 --- /dev/null +++ b/lab3_ADEX2/shell/header/utils.h @@ -0,0 +1,25 @@ +#include +// #include + +#define nop asm volatile("nop") + +#ifdef _cplusplus +#define NULL 0 +#else +#define NULL (void*)0 +#endif + +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +// #if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; + + +int utils_string_compare(const char* i, const char* j); +unsigned long utils_atoi(const char *s, int char_size); +void utils_align(void *size, unsigned int s); +uint32_t utils_align_up(uint32_t size, int alignment); +size_t utils_strlen(const char *s); +char *utils_strcpy(char* dst, const char *src); +char *utils_strdup(const char *src); diff --git a/lab3_ADEX2/shell/initramfs.cpio b/lab3_ADEX2/shell/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..faf47b52fd58348135f4805c9dad3157d9e67fb3 GIT binary patch literal 1024 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 OMswDTv#PiJ{{I6fIrzl@ literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/kernel8.img b/lab3_ADEX2/shell/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..ff30a435fab17a9c4953c07b28c42bd0dafe1ac9 GIT binary patch literal 12696 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 O=Jf~6`2}p|KmP}Mr)i}C literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/linker.ld b/lab3_ADEX2/shell/linker.ld new file mode 100644 index 000000000..5018defb6 --- /dev/null +++ b/lab3_ADEX2/shell/linker.ld @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_ADEX2/shell/mailbox.c b/lab3_ADEX2/shell/mailbox.c new file mode 100644 index 000000000..7e0c5d99c --- /dev/null +++ b/lab3_ADEX2/shell/mailbox.c @@ -0,0 +1,51 @@ +#include "header/mailbox.h" + +volatile unsigned int __attribute__((aligned(16))) mailbox[36]; + +int mailbox_call() +{ + unsigned int r = (((unsigned int)((unsigned long)&mailbox)&~0xF) | (MBOX_CH_PROP&0xF)); + /* wait until we can write to the mailbox */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + /* write the address of our message to the mailbox with channel identifier */ + *MBOX_WRITE = r; + /* now wait for the response */ + while(1) { + /* is there a response? */ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + /* is it a response to our message? */ + if(r == *MBOX_READ){ + /* is it a valid successful response? */ + if(mailbox[1] == MBOX_RESPONSE) + return 1; + } + } + return 0; +} + +void get_board_revision(){ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETBOARD; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} + +void get_arm_mem(){ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = MBOX_REQUEST; + // tags begin + mailbox[2] = MBOX_TAG_GETARMMEM; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = MBOX_TAG_LAST; + mailbox_call(); // message passing procedure call, we should implement it following the 6 steps provided above. +} diff --git a/lab3_ADEX2/shell/mailbox.o b/lab3_ADEX2/shell/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2118f241e7cf5768d3e64c641e7118db6261bc GIT binary patch literal 2064 zcmbtU&1(};5TDH^w%Q`8jZo}I7A>OCE=eg=ib80u6%mzS4?-c`q^k+ZCa~E`^q^7u z2gFma;zf@+2$Ea>hJv0wdhntbk8x&qX1ly@PtNjoW`1ve^WK~H@p|L_orI==hz4Kb z*b@{WojSG)zFB~A7=t80?=8T4ZSvq~4Q7|LAD{kY4gDK60}6w~;cx{q2S?No*r%rt zj`k^@Y-}m$7ZU)3dSz4RUD*E2B3JH1<6L+lFj zFT)2nn}op|^b?~n(8e)m8e0b26bx|685%>lda_&msBkqco|~Ns`2Mmt*Vk8#Yg^^L zrnhJ0^X9UdTg>nIZvNHMl9^k+&afYz_WuCd%OWH@bK3NH76_YS++$7H0^2ttSb^=E ztWQ(4XG!=yjO*89cN9R!FHUsYRYk^p|K!Oy@8c)q3D)6^-y8h}@gtClf^6$B5`$8n z$l>FN3Dg%N>ykRoF)qH;GS7IQ`BKkY=ubq}+v9$4tXiYo>X;Rn@4)=7_@#=~Xuvbu zE0tT8yIXSY=e2gN)$}3DbxMxyNUWqHJ&C1@R!QuO3ck!F6_@p>c{-=W?=wEDO6`-S6KWz?P<=&D$* z-LOp0?s#DCTAl@Fx!ne{(sCTTiCDAc+2-bht;M!yRq9~+;dZt3)U_NtoX~$72J&%< zCr*9=F_K?_3jgWQ3XEw~bT$fs8~%6rs*X}}l(X2#93=-u-jl0n6RzIu1?Ev~R8*MW zAj+xoa~#-<&BeW8DI1&^QB+(wgd>kT7@4XPFVDeQRof_J|ZU~ zQa^$2p%GXADuF0>1LfDBUMt~C{o}?aN}tECvOb3x-9MF2`>NI+A(&!tgPe$Px)7mv QF^=Eo`9BFG14HHi1I=EhNdN!< literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/main.c b/lab3_ADEX2/shell/main.c new file mode 100644 index 000000000..979b9fc57 --- /dev/null +++ b/lab3_ADEX2/shell/main.c @@ -0,0 +1,78 @@ +#include "header/uart.h" +#include "header/shell.h" +#include "header/dtb.h" +#include "header/utils.h" +#include "header/cpio.h" +#include "header/timer.h" + +void test_read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + uart_send_string("\r\n"); + break; + } + else + { + uart_send_char(buffer[index]); + } + index++; + } +} + +extern void *_dtb_ptr; +void main() +{ + + uart_init(); + // pre test ////////////////////////// + char buffer[256]; + while(1) + { + uart_send_string("# "); + test_read_command(buffer); + char * input_string = buffer; + if(utils_string_compare(input_string,"in")) + { + break; + } + else + { + // uart_send_hex((uintptr_t) _dtb_addr); + uart_send_string("The instruct is not exist.\n"); + } + } + ///////////////////////////////////////// + + // set up serial console + uart_init(); + + unsigned long el = 0; + asm volatile ("mrs %0, CurrentEL":"=r"(el)); + uart_send_string("Current exception level: "); + uart_hex(el>>2); // CurrentEL store el level at [3:2] + uart_send_string("\r\n"); + + asm volatile("mov %0, sp"::"r"(el)); + uart_send_string("Current stack pointer address: "); + uart_hex(el); + uart_send_string("\r\n"); + + fdt_traverse(get_cpio_addr,_dtb_ptr); + traverse_file(); + uart_send_string("Type in `help` to get instruction menu!\n"); + + uart_enable_interrupt(); + + + while(1){ + asm volatile("nop"); + } + //echo everything back + //shell(); +} + + diff --git a/lab3_ADEX2/shell/main.o b/lab3_ADEX2/shell/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c80fdbc7443a8e19e1096da4f762dd69d6d23497 GIT binary patch literal 3728 zcmbuBPiz!b7{I^XDFkaNwf`uT$kbLW1je@3xDXB7mWl^L(3ZqR%I^PdwKlWlkr##SYq%w+#N9mSZ=(lCw(;u+n^cNXTMxr*I;3FBDQ!_gQYf@ z`#uiPjwTgqb7vk&z%FQgCEoVByBQXC_ruwqjg85}00%M8Jk9Gs{v(U)vtNIRKI98q zWxigVB(dzEpUer}vR%(9XFT04V#abkBXAfiJC3l4Wkkuding8?=S2RH9=HR~ zyPlbOK`#|8+Y^p%X0wiPU9_4!U!nwhIw$g_wC)x4(*hI8j1;dR>~c?7jrG}&{Qcj0 zF22}_`?)n1TlgUk3%4`cVi%6LW9!2D+(x$63u`-Yd{EX4msDBRI+j+nuBCRY8;v#G z|B4pdM>@3_*6vrWZ7JOei3-;5FxD@I^-E#>R8mI4!UZtL5P``?6!akf|!JO(m-7A{!f#e!s3;JM+bipXgT}BiaA2_P4+mcw8Zrik_ezYe04@F%Aok)j&@gj< zth;G9=*X~^zD&|}q*=eza9JC@5U<3Z{`se?*P3BJ;>Udp0G%G-k>=(2rG1z8j=r_$ z?FWy%(|56V{M`q}F7#I(l2)}la&3S=H)_plHQx*X4S%&n!$`G6gH2U0nNBdoFOo9yC-H-5*{A(rfsJKb9+W*R@1}w|idZro5lrXA z45YH&RI21T;KwUj#T0!8VLI!jJjXmI99IAa609ZhZ{rT_p=)x z)olUtue+p9T)p4?uC^gppZX)xz9YgLsqDG_%s*4&sPVs0c!$)f`&Qwq{dbacUarfs~AVuwf|dkx?f!!gnAs45XUn_C=HTx z9cJXr7Rk8|%$t-r>b_bOzB7ytcytS76VBtgE|jFyi1Rz)Bf~vk@XRSN@Us*2Io2GJ zHw{nBcwl5r&je%2b-{3oG$8XqBY{IULW1AEatRFj7UG!>3_R=!3uUWWew~;0)#A+VQ>KBYE^h zQ3)gcTcH@L?8gDc{IC9l=u0t&u&HuU4z8#WbzVQOV;mXjRrQkwIvdJ3(fTEk*Q(!F zGGJP6tV!nJ{9Hde4^WB$Y^tQ?!%Ov1g_pzqDV$_owR=N-_?3yM?OEv`HJ_Itr}&b} z>t~!trPls+c@*P)(f$dsKkuK`6U~hX{*v%D*>6QgXSS$6oe-nX4kDP7f70L3K#}PF S>6=o^|AbsWowHPl`u_ts$YKlt literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/reboot.c b/lab3_ADEX2/shell/reboot.c new file mode 100644 index 000000000..048f2d348 --- /dev/null +++ b/lab3_ADEX2/shell/reboot.c @@ -0,0 +1,16 @@ +#include "header/reboot.h" + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab3_ADEX2/shell/reboot.o b/lab3_ADEX2/shell/reboot.o new file mode 100644 index 0000000000000000000000000000000000000000..dda9e282580625dcaef2ab81c697421da43712d2 GIT binary patch literal 1496 zcmbtU&1w`u5U%-2&_qE+FcM=%2&lm{yCFjG)UYNI5s}4!w{>>XA&~4Y%=E(QLDxJ< zZXWUgl3O0Yg9P*e@&@_>S~Xj>X?n+tHq3lqee+dKPgU=J+<37W1_8(l;0s(tq5{lC z7hIQA!z|2@_vAEc{a8$*?{pnT!?REE@GLz4{42mKiigceALkA9h5EP&5H2T9j_(Kb zVEq&Ez*eL2Bzdsi?ssiJsn^w-s;$)fWmx~Px~ghx4_PjEb*;Pu1n-*=5AFu@R~CV^ zIo2;RlJ&KpgL0%b*`4mG~Aqc zLjLIrmGpQ*zm3WbXaCZ#TdYfe-JX$ObESk4a?|ehtjb_%082ZNrQOUNv~p7zOO`wA zo5D|YyHfLXdEZk{*BpZ?-gRu+Mzr||_k>w9u%LEQn}TW=1*ojo>6k8R-JUgS>*e-J zVbg3MRBjGZW%gRTdD<~j`M+=;vuS#M=QUS-%P1h=SDZ`IEy-S0h0@P^;NK!LNk+*rAetSbMM M^IwmhBjV@(0ZmC~ng9R* literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/shell.c b/lab3_ADEX2/shell/shell.c new file mode 100644 index 000000000..eddcdba81 --- /dev/null +++ b/lab3_ADEX2/shell/shell.c @@ -0,0 +1,151 @@ +#include "header/shell.h" +#include "header/uart.h" +#include "header/utils.h" +#include "header/mailbox.h" +#include "header/reboot.h" +#include "header/cpio.h" +#include "header/allocator.h" +#include "header/dtb.h" +#include "header/irq.h" +#include "header/timer.h" +#define BUFFER_MAX_SIZE 256u + + +extern void *_dtb_ptr; + +void read_command(char* buffer) { + int index = 0; + while(1) { + buffer[index] = uart_get_char(); + uart_send_char(buffer[index]); + if(buffer[index] == '\n') { + buffer[index] = '\0'; + buffer[index+1] = '\n'; + break; + } + index++; + } +} +/* +void async_read_command(char* buffer) { + int index = 0; + char tmp[1]; + + while (1) { + if (uart_async_read(tmp) > 0) { + buffer[index] = tmp[0]; + uart_send_char(tmp[0]); + if (tmp[0] == '\r') { + buffer[index] = '\0'; + break; + } + index++; + } + } +} +*/ + +void parse_command(char* buffer){ + uart_send_string("in parse command\n"); + char* input_string = buffer; + char* parameter[5]; //5 is the available parameter length + int para_idx = 0; + int input_string_len = utils_strlen(input_string); + for(int i=0; i < input_string_len; i++){ + if(*(input_string+i) == ' '){ + *(input_string+i) = '\0'; + parameter[para_idx++] = (input_string+i+1); + } + } + + if(utils_string_compare(input_string,"help")) { + uart_send_string("help :print this help menu\n"); + uart_send_string("hello :print Hello World!\n"); + uart_send_string("info :Get the hardware's information\n"); + uart_send_string("reboot :reboot the device\n"); + uart_send_string("ls :list the file\n"); + uart_send_string("cat :print file content\n"); + uart_send_string("malloc :give dynamic memory space\n"); + uart_send_string("dtb :print device tree\n"); + uart_send_string("exec :execute user program\n"); + uart_send_string("timer or settimeout :demo timer interrupt\n"); + } else if (utils_string_compare(input_string,"hello")) { + uart_send_string("Hello World!\n"); + } else if (utils_string_compare(input_string,"info")) { + get_board_revision(); + uart_send_string("My board revision is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + get_arm_mem(); + uart_send_string("My ARM memory base address is: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("My ARM memory size is: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); + } else if (utils_string_compare(input_string,"reboot")) { + uart_send_string("Rebooting....\n"); + reset(1000); + } else if (utils_string_compare(input_string,"ls")) { + cpio_ls(); + } else if (utils_string_compare(input_string,"cat")){ + //uart_send_string("Filename: "); + //char filename[BUFFER_MAX_SIZE]; + //read_command(filename); + //cpio_cat(filename); + cpio_cat(parameter[0]); + } else if (utils_string_compare(input_string,"malloc")){ + char *a = simple_malloc(sizeof("9876")); + char *b = simple_malloc(sizeof("345")); + a[0] = '9'; + a[1] = '8'; + a[2] = '7'; + a[3] = '6'; + a[4] = '\0'; + b[0] = '3'; + b[1] = '4'; + b[2] = '5'; + b[3] = '\0'; + uart_send_string(a); + uart_send_char('\n'); + uart_send_string(b); + uart_send_char('\n'); + } else if (utils_string_compare(input_string,"dtb")) { + fdt_traverse(print_dtb,_dtb_ptr); + } else if (utils_string_compare(input_string,"exec")) { + //uart_send_string("Program name: "); + //char buffer[BUFFER_MAX_SIZE]; + //read_command(buffer); + cpio_exec_program(parameter[0]); + } else if (utils_string_compare(input_string,"timer")) { + + setTimeout("hello 1",3); + setTimeout("hello 2",6); + setTimeout("hello 3",9); + + } else if (utils_string_compare(input_string,"set")) { + char *message = (char *)parameter[0]; + size_t second_str_len = utils_strlen(parameter[1]); + uint64_t seconds = (uint64_t) utils_atoi(parameter[1],second_str_len-1); + setTimeout(message,seconds); + } else { + uart_send_string("The instruction "); + uart_send_string(input_string); + uart_send_string(" is not exist.\n"); + } +} + +void shell(){ + /* + while(1) { + char buffer[BUFFER_MAX_SIZE]; + uart_send_string("# "); + //async_read_command(buffer); + parse_command(buffer); + } + */ + +} + + + diff --git a/lab3_ADEX2/shell/shell.o b/lab3_ADEX2/shell/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..ab152e7fc0987f4c5a673402b0ae0385ed0fa9f2 GIT binary patch literal 7256 zcmcJUe`p-X702KGuq|0i>R1qoy4jYL3F1bz(A6=OFfX@`J`9&Hb!z#9F#SjVNU)i0$C;k4N2E<@+9`_{qNqeWkW!kGxZTsr$6U0=oidD(mhpLWU_6)CJy9PBFC97NuEU{Xwh`|_D zjPF#OVtzjh+2s@1e8i&OmQgUB{0~gW`m$?KgHtj+yHX}o$I4bJUi(mx`^I_ew4Jk9 zr|7m16>T?=Ibj!t=S=JrxJMMjD0^1f<6ZzI6J5%+51q76TSop&*(}*PbiY(_&KPdh zZ0hH|tmp*e8lGd}AXeSN-t@QTSw_vZ9HZ(~PC8~O7{aqlh$@cZS{{`vHS{Ns`bN-# z^JY0tttuY*^MQ$^E3^L^}$k*(k?84gD8;^Y{%J7fSzK-fM!aZDn}nz(XiKJQpA z&L|nSw!8LOE8xMr0!;YxY?n_aF`;PDrBMNJ9{oI+F94hmzfO@;!H))W-+yC(^Fy3J z0~o$Z#V(!fVXM~95Q7qhjpS2G3%l7q?qg9A0c zI`E@Ihm!q+Ut#P^>|mkD*$If(pN#D7?14UH-OOL2eE8A+x3|8tW#o#dMv0igO;8;W>kk&3``FtUU(Qx-rG@P~9xWP)Sei zJ_ysugUt>UuU5{uq}jd!Ngq-_7-FoQuA2+HaIdpI%5Lt#Cnf46fhgTy%u5GS~gQ#awjK zTwmi{bcEkwuIt=oE;`d(zt6eo2$v&F*NJ1ClthQl1xjtqMMpT@FO+nh9h%NUUVY@I>LKHbow-%71lYR=?L!+(V-vhlw^KnUQ(Kl@MlAG(wdIM z^Sq`bd@Mv~T+}9)Ek=taAO5rXzeIL}y9US>yVi zVV-DGfUC?YuE!OAjk(P84A-x7F6$-y26O#BUD0$T{+rBGn5+KCJc+*8-%<2;DSqBp zxH=CI4UEX2-HLsjxx}@^{o9z!xWYRX9aXbPUf^?iPnxr{6GGRa)V6+WfttM}csrX%xJ&~$_sLv$L<$xnF(((?R7;mRjIm|-sd z@8J4doQwa$FEZEf(*=d^QTD^TA^e8I)pfk7aP@b^ErqN0_nA|?s=d6rNL;d?+W3`5 z;u7A;T#qZkobKzrN?hFvr*{WQ26MXaRQq0qtM>iO$^R!r1oJ`W;=jRhKFeJE7oKLW z`#-7ZKdI5Q??uQVOu^8TmK|1#SXSAWM|Rk+cd1%R8(b$?cw%YGPVe{M0C z{UCfz(O2)6yCGa&=|#W5`fdE8B>KWTnUkNYzU=KS$XUXVZj56TKF#$T8khGoNV;cA zo|(nmbAr4eCC4h7NzbZ#kj$H&3CXPMLei;Fh0F(%DM->w9Dc}yBz`rrl1IMv;z8Fl zbKgfh>TMM=C-55_y?y_0$-wRyYRkJ0DW>TUrUcJZP-~qlVsu83Ng6LTrGgJ0(9b!2 zzoT*5*htRyFEQt3P>kcOHLV1+dQ+x`RCmoyLIrKTw!zpicqG!XyAk2EqW z_v59etNijv{;5g&N&Zc2l(K4fUw!#h8g$$5aevKCkWWynN?$69|AN1Zh0WHlzza0S zhO~avSNhBPkv|*8Mz+eI!1{S%I*`#;(EHPOH+}68K{s{4^n@0$R`t)M&H68~gM~n* I`B(4%FH&kZod5s; literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/start.S b/lab3_ADEX2/shell/start.S new file mode 100644 index 000000000..d930d2213 --- /dev/null +++ b/lab3_ADEX2/shell/start.S @@ -0,0 +1,152 @@ + +.section ".text.kernel" + +.global _start + + + +_start: + ldr x1, =_dtb_ptr //put _dtb_ptr into register1 + str x0, [x1] //store dtb address from x0 to _dtb_ptr + // read cpu id, stop slave cores + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, 2f + // cpu id > 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + ldr x1, =_start + bl from_el2_to_el1 + mov sp, x1 + + + /* set exception vector table */ + adr x0, exception_vector_table + msr vbar_el1, x0 // vbar -> Vector Base Address Register + + //bl core_timer_enable + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size + +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + //bl core_timer_enable + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b + +from_el2_to_el1: + mov x0,#(1<<31) + msr hcr_el2,x0 // set EL1 runs in AARCH64 + mov x0,#0x345 // 0x3c5 [4:0]->ELH1 / ASH(SEerr) IRQ FRQ disable + msr spsr_el2,x0 // spsr -> saved program status register + msr elr_el2,lr // lr->link register elr->Eeception Link Register + eret + +// save general registers to stack +// user program and the exception handler share the same general purpose reg +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] //stp -> store paire + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + + +exception_handler: + save_all + bl except_handler_c + load_all + eret + +irq_exception_handler: + save_all + bl irq_except_handler_c + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + b exception_handler // branch to a handler function. + .align 7 // entry size is 0x80, .align will pad 0 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b irq_exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + b exception_handler + .align 7 + +.global _dtb_ptr //define a global variable _dtb_ptr +.section .data //_dtb_ptr is in data section +_dtb_ptr: .dc.a 0x0 //it defines _dtb_ptr to be a 8-byte constant with a value of 0x0 + diff --git a/lab3_ADEX2/shell/start.o b/lab3_ADEX2/shell/start.o new file mode 100644 index 0000000000000000000000000000000000000000..e072c076b559d6f0854b82792804731424c17969 GIT binary patch literal 7616 zcmeHM-Afcv6hFH&xmtd#7PzS73W5=}Vf2NBj+P&l_VtqaGR(SDyR;uRJCqsd68!^) zPd-%kcAj9X>2?b#(lIt`&G0H=DM!djmQH(nXWX?#An zia7vpmZ82S|1zFi2B{_AjjbTO_+SX)`$7Q7$2uSR)aWOlTLto^LnL2M>?7aKR*>&K z0rF$8lB`~*~rw8&4;yQ>oKfTjY2>|j$Y*GLyil`aS=KCkz)Wk z29aY3IW8f`W#qVm9K*;lf*eIkxX~mj*&8va82fRJt?E!BO?A0D<+A#uC`{r)U+)}QCBKgC&pjI(|h zXMOxly=xQ7o)iEG;4jN5;FEGDfLH=sXAq^hg@|yS$q1Q!5#kJf$i~+g{HTrNzZ!p; zqboAF6JN>TH!(X{X8gxZytEEyoOtHwWW>br!q{!>Gm>URYzI8G1D@CchxSRhqh(UE znmj4%8N78uLc1@kljG`yp2(!-xRQ<~RSnu>AjkBmJfUk)eEL8g*E5=|E77D1vK-B3 z<*cq~y5lFNR7fd_w2RbXl*e&QN3cCsn>D?VrkQ5^sK+P07juiHk^iDVz8aQ1lDHR~RCJYAjCArez`1tM4& zh-hk3iBL3hPu0?D(#^9=pB~HMP@#g!mzciOrLk^n!w$vRH&e2Mm~C3}#&=*GjbZbh z^|NWVZ>)YNKA{*pe&=X0>|Qj=!VKsbLiC#;VRKuq$?7fHAmyiVPP+BIu(V6xQh=}> rP_PFaz+Ac?*!(KQ*tsJFVCzqto#KU^Ki%8q@+JGcwY!*VdTjn5L;n#g literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/tasklist.c b/lab3_ADEX2/shell/tasklist.c new file mode 100644 index 000000000..91e1eeadc --- /dev/null +++ b/lab3_ADEX2/shell/tasklist.c @@ -0,0 +1,67 @@ +#include "header/tasklist.h" +#include "header/allocator.h" +#include "header/uart.h" +#include "header/utils.h" + +task_t *task_head = NULL; + +void enqueue_task(task_t *new_task) { + // uart_send_string("in enqueue_task\n"); + // Disable interrupts to protect the critical section + asm volatile("msr DAIFSet, 0xf"); + // Special case: the list is empty or the new task has higher priority + if (!task_head || new_task->priority < task_head->priority) { + new_task->next = task_head; + new_task->prev = NULL; + if (task_head) { + task_head->prev = new_task; + } + task_head = new_task; + } else { + // Find the correct position in the list + task_t *current = task_head; + while (current->next && current->next->priority <= new_task->priority) { + current = current->next; + } + + // Insert the new task + new_task->next = current->next; + new_task->prev = current; + if (current->next) { + current->next->prev = new_task; + } + current->next = new_task; + } + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, uint64_t priority) { + // uart_send_string("in create_tasks\n"); + task_t* task = simple_malloc(sizeof(task_t)); + if(!task) { + return; + } + + task->callback = callback; + task->priority = priority; + + enqueue_task(task); +} + +void execute_tasks() { + // uart_send_string("in execute_tasks\n"); + while (task_head) { + task_head->callback(); + task_head = task_head->next; + if (task_head) { + task_head->prev = NULL; + } + asm volatile("msr DAIFSet, 0xf"); // Disable interrupts + //simple_free(task); + } + + asm volatile("msr DAIFClr, 0xf"); // Enable interrupts +} + diff --git a/lab3_ADEX2/shell/tasklist.o b/lab3_ADEX2/shell/tasklist.o new file mode 100644 index 0000000000000000000000000000000000000000..3ecce4a61a6abc49022957361bdb58937d6d5d39 GIT binary patch literal 2144 zcmbtU&1(}u6n~rD+S`4Tm!|Y$5!|$BixgWwdJu$Uo36ApNo#fk(TeRK z;6brhrAO0~hZH@C6i*(-kK)CTg9o7?m3UdC#`h*O$udp6_?FrCo8SAIeKR}D=f=Rm!2-k^s@P!AfB^X6%Y^#D2XH?MhO4MhPy>b=#<2|Ac8>yAgBs*R04~P3 zCG_1?V_QAU?%P(;{!LZZk7f#68F1QIuu0v57fI$FY~)9JSbjK z^1oDAFJcbRR^H;WR@VRuo#RTrcqN+OU3&EdxlVzpb|uyiZU?SA?lauD0tIL?T!6D% zGzVNy+{e~j2;#cw8;Sq=r?f%eQ1lxv<)(ZvIx;d8>YbX-rk!jk643|s{=P_-O(S;) z2K4^H6P(7S0JO3k&r&TPwdRQcQ1PiHDrS-;z=*vk>mcLz z`V+0fK4$g4%KnYe=_NTdEp%Bn2rKS2oN@e}v_2?laZ z$mo$)4<^`!gU*A2!z-`(ue-y^{irFGI4|NpI?j3dPdB8xJPpesFloBOC}+KRQIC8{ zo^#ctl?R1+>-b z|8xG6j`3LPKiys;Ui6>J$h9eCN7U!K89Dkd<#@^~_Z}%&expiry < timer_head->expiry) { + new_timer->next = timer_head; + new_timer->prev = NULL; + if (timer_head) { + timer_head->prev = new_timer; + } + timer_head = new_timer; + + // Reprogram the hardware timer + asm volatile ("msr cntp_cval_el0, %0"::"r"(new_timer->expiry)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); + return; + } + + // Find the correct position in the list + while (current->next && current->next->expiry < new_timer->expiry) { + current = current->next; + } + + // Insert the new timer + new_timer->next = current->next; + new_timer->prev = current; + if (current->next) { + current->next->prev = new_timer; + } + current->next = new_timer; + // Enable interrupts + asm volatile("msr DAIFClr, 0xf"); +} + + +void create_timer(timer_callback callback, void* data, uint64_t after) { + //Allocate memory for the timer + timer_t* timer = simple_malloc(sizeof(timer_t)); + if(!timer) { + return; + } + + //Set the callback and data + timer->callback = callback; + timer->data = data; + + //Calculate the expiry time + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0":"=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0":"=r"(cntfrq)); + timer->expiry = current_time + after * cntfrq; + //Add the time to the list + add_timer(timer); +} + + +void print_message(void *data) { + char *message = data; + uint64_t current_time, cntfrq; + asm volatile("mrs %0, cntpct_el0" : "=r"(current_time)); + asm volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq)); + uint64_t seconds = current_time / cntfrq; + + uart_send_string("Timeout message: "); + uart_send_string(message); + uart_send_string(" occurs at "); + uart_hex(seconds); + uart_send_string("\n"); +} + +void repeat_message(void *data) +{ + char *message = data; + /* + while(1) + { + char *message = data; + uart_send_string(message); + uart_send_string("\r\n"); + } + */ + for(int i=0; i< 5000; i++) + { + char *message = data; + uart_send_string(message); + uart_send_string("\r\n"); + uart_send_string("========================="); + uart_send_string("\r\n"); + } +} + +void repeat_nop(void *data) +{ + char *message = data; + while(1) + { + asm volatile("nop"); + } + +} + + +void setTimeout(char *message,uint64_t seconds) { + + char *message_copy = utils_strdup(message); + + if(!message_copy){ + return; + } + + if (!timer_head) { + //enable core_timer_interrupt + unsigned int value = 2; + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // unmask timer interrupt + *address = value; + } + + create_timer(repeat_message,message_copy,seconds); +} + diff --git a/lab3_ADEX2/shell/timer.o b/lab3_ADEX2/shell/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..ed5fd917bee4816fedeb42f73c4d774c6fc71696 GIT binary patch literal 3600 zcmbVOO-x)>6h3d>fRqAK2Wle*9!+B~u_GW0tTlN+e>5SAKod=k!(--INM{&2?~Oqr zc4%CyQl(&S#YM};proYVY=rF%Aq-7fb<`x1l zzjZc{ZAAMY9TsomICSCC;JSWr5yKYN^#<0B1!JcYF8qE!KfE#2lifPoo86iI=EjO1 zxgA8FSuk_Iy{NBULVZn#Wxd|aoy6xNRNT1+FkBDNa9E53clK#8{HLxhwg%0dmCxS{ z&OkO3gj^ou1z!-d20+e_wNybCYszKt>HDK;&4A3Hfm+72AP42#&gUQY*Sm>%HuS*a zRtR!iSSwUyR;fl)gXP8nEqi$VnKccc)~e8_qOOpc)9N8dwV_{w#AK~4hQ78l{nc(i zH<9xxj0b$2>XlD0W)7cu$|3t$h=oK?iI?!5>8~jd`8N=^eDYX_vG;f6>Y_%kK9N_{M{A(ILse$A2m1OuI(Hb{y-Reav9oNJgXSlw(+~halbQzP@8d+nLeygqt=x zI>KGy_M;tXG3o04!fB3P^i$B4>v^ga0_`EDEfLBQ?@%_~pPSHL4``7{l-QFW#6cO7~ zXIu$h)q5`o7APIL(^{8=2S63;F4W($Jww_bH-w42JiWUX`<7Gm?g!zoe5rXIO5F?q zI{uXs9hpjr4i!c4K7kbDH3Bcr>-m@Cf1nJ172q9JB>HYQ3#W9bECg`$AU+TI`Y^&C z&8TUARCy8s@*m-eIo3}zevilEoS=OQpHe)->_5P*kmqZ(jQ@G|Ut)iGUfy7Qg>i9a z5SuN-^FHDSeETSQz{M9b6^_D@7#x{`ls#!%ZiL@XNLwj4;@A_hh~uWlC(eNti$z2P zL{sQ!^S~KTOvddiHzA+43{g! zJ2wC!tkZw0WN#Z4T)ywpU)E_bpY)gb6O1<@4_*ViLhmDqiXZpjBK$-de1vgYkN=d* z0-F^)&i*R?eHpwS<4I_p2Ru{!b~FA6YC7vu;*87wwDH6wzcNtgvFjEH4DEub# zzoYO={M|A6IGlgH`*BPfi`1kh~<5br{AOFvctNXRixVkTQeLVjD zZ~Ay@ef-;uQ=k3#p@8S4?$@InTY>)UB9P}4e1ymH{*nIo7@t%82Y4OJ3ckencM2}= z83;RXCR}S2wVU$vn6y%M+zPw)lnddQYj$7j=`}Uf>0=%K7EJDW_$e)X(FDw51Q}`~R{2*Eqh&og1?4Cq-MXU&61TQF8yh z4-WAGPQJ8%6f5K9{?XctawE3Q`AweOj~KnjYCNS;_YNWG=JWG04Sb^Zitdt9@nig* LJ?4ugQ;q)@qU^T! literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/uart.c b/lab3_ADEX2/shell/uart.c new file mode 100644 index 000000000..2bb53d9a9 --- /dev/null +++ b/lab3_ADEX2/shell/uart.c @@ -0,0 +1,196 @@ +#include "header/uart.h" +#include "header/irq.h" +#include "header/utils.h" + +#define RX_INTERRUPT_BIT 0x01 +#define TX_INTERRUPT_BIT 0x02 + +#define AUXINIT_BIT_POSTION 1<<29 + +char uart_read_buffer[UART_BUFFER_SIZE]; +char uart_write_buffer[UART_BUFFER_SIZE]; +int uart_read_head = 0; +int uart_read_index = 0; +int uart_write_index = 0; +int uart_write_head = 0; + +/** + * Set baud rate and characteristics (115200 8N1) and map to GPIO + */ +void uart_init() +{ + register unsigned int r; + // P.104 Since I need UART 1 Transmit/Receive Data -> TXD1/RXD1 + // p.102 I find These two in GPIO 14/15 Fun5 + // Since each GPFSEL controls 10 pin, GPFSEL1 controls 10-19 + // That's why I need GPFSEL1 + r=*GPFSEL1; + r&=~((7<<12)|(7<<15)); // gpio14, gpio15 clear to 0 + r|=(2<<12)|(2<<15); // set gpio14 and 15 to 010/010 which is alt5 + *GPFSEL1 = r; // from here activate Trasmitter&Receiver + + //Since We've set alt5, we want to disable basic input/output + //To achieve this, we need diable pull-up and pull-dwon + *GPPUD = 0; // P101 top. 00- = off - disable pull-up/down + //Wait 150 cycles + //this provides the required set-up time for the control signal + r=150; while(r--) { asm volatile("nop"); } + // GPIO control 54 pins + // GPPUDCLK0 controls 0-31 pins + // GPPUDCLK1 controls 32-53 pins + // set 14,15 bits = 1 which means we will modify these two bits + // trigger: set pins to 1 and wait for one clock + *GPPUDCLK0 = (1<<14)|(1<<15); + r=150; while(r--) { asm volatile("nop"); } + *GPPUDCLK0 = 0; // flush GPIO setup + + + r=1000; while(r--) { asm volatile("nop"); } + + /* initialize UART */ + *AUX_ENABLE |=1; + //P.9: If set the mini UART is enabled. The UART will + //immediately start receiving data, especially if the + //UART1_RX line is low. + //If clear the mini UART is disabled. That also disables + //any mini UART register access + *AUX_MU_CNTL = 0; + //P.17 If this bit is set the mini UART receiver is enabled. + //If this bit is clear the mini UART receiver is disabled + //Prevent data exchange in initialization process + *AUX_MU_IER = 0; + //Set AUX_MU_IER_REG to 0. + //Disable interrupt because currently you don’t need interrupt. + *AUX_MU_LCR = 3; + //P.14: 00 : the UART works in 7-bit mode + //11(3) : the UART works in 8-bit mode + //Cause 8 bits can use in ASCII, Unicode, Char + *AUX_MU_MCR = 0; + //Don’t need auto flow control. + //AUX_MU_MCR is for basic serial communication. Don't be too smart + *AUX_MU_BAUD = 270; + //set BAUD rate to 115200(transmit speed) + //so we need set AUX_MU_BAUD to 270 to meet the goal + *AUX_MU_IIR = 0xc6; + // bit 6 bit 7 No FIFO. Sacrifice reliability(buffer) to get low latency // 0xc6 = 11000110 + // Writing with bit 1 set will clear the receive FIFO + // Writing with bit 2 set will clear the transmit FIFO + // Both bits always read as 1 as the FIFOs are always enabled + /* map UART1 to GPIO pins */ + *AUX_MU_CNTL = 3; // enable Transmitter,Receiver + +} + + +/** + * Send a character + */ +void uart_send_char(unsigned int c) { + /* wait until we can send */ + // P.15 AUX_MU_LSR register shows the data(line) status + // AUX_MU_LSR bit 5 => 0x20 = 00100000 + // bit 5 is set if the transmit FIFO can accept at least one byte. + // &0x20 can preserve 5th bit, if bit 5 set 1 can get !true = false leave loop + // else FIFO can not accept at lease one byte then still wait + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x20)); + /* write the character to the buffer */ + //P.11 The AUX_MU_IO_REG register is primary used to write data to and read data from the + //UART FIFOs. + //communicate with(send to) the minicom and print to the screen + *AUX_MU_IO=c; +} + +/** + * Display a string + */ +void uart_send_string(char* s) { + while(*s) { + /* convert newline to carriage return + newline */ + if(*s=='\n') + uart_send_char('\r'); + uart_send_char(*s++); + } +} + +/** + * Receive a character + */ +char uart_get_char() { + char r; + /* wait until something is in the buffer */ + //bit 0 is set if the receive FIFO holds at least 1 symbol. + do{asm volatile("nop");}while(!(*AUX_MU_LSR&0x01)); + /* read it and return */ + r=(char)(*AUX_MU_IO); + /* convert carriage return to newline */ + return r=='\r'?'\n':r; +} + + +/** + * Display a binary value in hexadecimal + */ +void uart_hex(unsigned long long d) { + unsigned long long n; + int c; + uart_send_string("0x"); + for(c=28;c>=0;c-=4) { + // get highest tetrad + n=(d>>c)&0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n+=n>9?0x57:0x30; + uart_send_char(n); + } +} + +void uart_enable_interrupt() { + + // Enable RX and TX interrupt for mini UART + uint32_t ier = mmio_read(AUX_MU_IER); + ier |= RX_INTERRUPT_BIT; + //ier |= (RX_INTERRUPT_BIT | TX_INTERRUPT_BIT); + mmio_write(AUX_MU_IER, ier); + + // Enable the mini UART interrupt in the second-level interrupt controller + // uint32_t enable_irqs1 = (uint32_t) ENABLE_IRQS_1; + uint32_t enable_irqs1 = mmio_read(ENABLE_IRQS_1); + enable_irqs1 |= AUXINIT_BIT_POSTION; // Set bit29 (Auxiliary device)->mini uart + mmio_write(ENABLE_IRQS_1, enable_irqs1); +} + +void uart_disable_interrupt() { + // uint32_t disable_irqs1 = (uint32_t) DISABLE_IRQS_1; + uint32_t disable_irqs1 = mmio_read(DISABLE_IRQS_1); + disable_irqs1 |= AUXINIT_BIT_POSTION; + mmio_write(DISABLE_IRQS_1,disable_irqs1); +} + +int uart_async_read(char *buffer) { + if (uart_read_head == uart_read_index) { + // No characters available + return 0; + } else { + buffer[0] = uart_read_buffer[uart_read_head++]; + if (uart_read_head >= UART_BUFFER_SIZE) { + uart_read_head = 0; + } + return 1; + } +} +void uart_async_write(const char *buffer, int length) { + for (int i = 0; i < length; i++) { + uart_write_buffer[uart_write_head++] = buffer[i]; + if (uart_write_head >= UART_BUFFER_SIZE) { + uart_write_head = 0; + } + } + // Trigger TX interrupt + mmio_write(AUX_MU_IER, mmio_read(AUX_MU_IER) | 0x2); +} + +void uart_async_send(const char *str) { + int length = utils_strlen(str); + uart_async_write(str, length); +} + + diff --git a/lab3_ADEX2/shell/uart.o b/lab3_ADEX2/shell/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..bcdb54e4d23eb222639307299bc1308ea421103e GIT binary patch literal 3792 zcmbtXUu;ul6hF83ZVcE)88Z+-*Fps}QrBgY;tO{hLQF)VDTx|l*RB`ZuytE|8;4W5 zV=S8K!>WWBB7Ytv{7FoBAkq0Cn_#l|L`pO!3Mvvc!3SV3U>xvr&km$rEn1%xQ@1&!hB9}Nyi zCK{|r8|dQ!IFl^%_J>3Q{eh{A~pZYy$&_7u!MU`ck2cJX~%%hw&71rS$%U<8Y zYwrAE7%eKbqs6tD@5g7PX0-U;!qH+U)_xNG_4rgT8ZBbGEuEN89P1F%>PCx~&`y9A z37`*{a}#|Z+P|Rw)^9~dP+wkQMO4((*Mu7TfodN@zBL#}HofCy>Df&R)}{JBj#EJ2 ztazZ6Vl`Z&c&c++u_9YGK)See zbCFf7sJS1$(gfbg1KKkz!epabl?DY5^0y=Z zX?(wJy0_3#vvoXp%O;B|k&nG&B@93O4y-(BZ`^*e} zeUA2cdNDkh#-8!Lk2GP;9avMrnnty~_hX0`ZmP@9Q{8H;t8!h1>uz<`B`hY@onEXz zaQ4ipJu~=?z4y%n0NXn{p7(9ooycd*ye||Awg#IwhVr%>dbgz|*xdRQ!vJ1vghY8O z0@}b6%BtEX8(ZPP@HcCUdxq_R3)9)&mM$>9%_BanA|m^&8jg$tCXh z$v_b`2>aAV07Nf@U0`e{Yr?Lu-O1XA`bV}c(rxv=#A(cP!P z-BQ^C0&2yZk#M{vDu{|qveeiBRVf!0s>(p;+MN$C=O+Rc7R3ygQ7PjVa|;_>oPS_Gnejt|Y4EMFn86wkMYk3gKncZ_>^O9lQD zr4J{{mo`}bdcQgLDgdd&jLZG_ zc)sbqmb>1om2sIT%(%=$cREQG@^C5JZ?-?@@H^~pm2hz%yei@1KIoQkaUan4mqgTU zfu6MSi0w$QhCgA;gKZh1Z1=`7*D_7k%iMK(?4;k$;U7sXw=fJfUC2MPa++N^)Ud zlw;rEd>+#|3cghC&mp!Y`WNtPXjD4CFdZ0*_&$ /dev/null 2>/dev/null || true diff --git a/lab3_ADEX2/shell/userprogram/README.md b/lab3_ADEX2/shell/userprogram/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab3_ADEX2/shell/userprogram/README.md @@ -0,0 +1 @@ + diff --git a/lab3_ADEX2/shell/userprogram/linker.ld b/lab3_ADEX2/shell/userprogram/linker.ld new file mode 100644 index 000000000..ab70a30ea --- /dev/null +++ b/lab3_ADEX2/shell/userprogram/linker.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { . = ALIGN(16); *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/lab3_ADEX2/shell/userprogram/one.S b/lab3_ADEX2/shell/userprogram/one.S new file mode 100644 index 000000000..4acf6f4dd --- /dev/null +++ b/lab3_ADEX2/shell/userprogram/one.S @@ -0,0 +1,7 @@ +.section ".text" +.global _start +_start: + svc 0x1337 +1: + nop + b 1b diff --git a/lab3_ADEX2/shell/userprogram/one.elf b/lab3_ADEX2/shell/userprogram/one.elf new file mode 100644 index 0000000000000000000000000000000000000000..b13e36ed9627aa5a41acd8767b43259aeddc6b32 GIT binary patch literal 66352 zcmeIvF>Vt<6b9gDZ-@;_VG2Y9ML>!~0dh@g36Y9BSdL-@1qq6`2s9jvi@*Um0w*xD zyE7zSJ4!)A@oh6Rzu$Z7{pQ=-cPGQaAj&h0@6nycZ8Xb2e7;dLi`S`U7Ngj2Ye#KO znbGw{bn7Jdmo@VA99swwAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;SYv<_ z$Hn<_dJ)H0F`u8VR`b=zugkn$o}ZPlUR>4@)76(x_2M+G^<}qyD7$)jRmb#fQ7>Ye z#-x}1 J{jcum{{tJRE{6aB literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/userprogram/one.img b/lab3_ADEX2/shell/userprogram/one.img new file mode 100644 index 0000000000000000000000000000000000000000..13bb5c616b672e699f602fb9c67dce4a755fcb6e GIT binary patch literal 16 WcmaEu#&ktqf%)qH|Nq4qfB*nK#|B9N literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/userprogram/one.o b/lab3_ADEX2/shell/userprogram/one.o new file mode 100644 index 0000000000000000000000000000000000000000..c00c28e5b03a97b1c7da93cb70b11273c5c3833a GIT binary patch literal 728 zcmb<-^>JfjWMqH=MuzPS2p&w7fk6UE&;cy$z`)MH#_%wW>59Ap^VR?V|BEA3V`njA zHJO2dnSlwb24$uUp`EI?WSoB1jg4DrP!iA5z040^?txh087K)R#|LTA8O zC8-r940E=`zz10o5*s~4 z)PZsw6zB(;hb>kDpmt7x(yTxlgh6(JfCPkM-~`g>ZU;#{01-gI4WZy9y88uzGT8LL OhU(CP>x3}S^#cH2(jO}T literal 0 HcmV?d00001 diff --git a/lab3_ADEX2/shell/utils.c b/lab3_ADEX2/shell/utils.c new file mode 100644 index 000000000..8242d820c --- /dev/null +++ b/lab3_ADEX2/shell/utils.c @@ -0,0 +1,63 @@ +#include "header/utils.h" +#include "header/allocator.h" + +int utils_string_compare(const char* str1,const char* str2) { + for(;*str1 !='\0'||*str2 !='\0';str1++,str2++){ + if(*str1 != *str2) return 0; + else if(*str1 == '\0' && *str2 =='\0') return 1; + } + return 1; +} + +unsigned long utils_atoi(const char *s, int char_size) { + unsigned long num = 0; + for (int i = 0; i < char_size; i++) { + num = num * 16; + if (*s >= '0' && *s <= '9') { + num += (*s - '0'); + } else if (*s >= 'A' && *s <= 'F') { + num += (*s - 'A' + 10); + } else if (*s >= 'a' && *s <= 'f') { + num += (*s - 'a' + 10); + } + s++; + } + return num; +} + +void utils_align(void *size, unsigned int s) { + unsigned long* x = (unsigned long*) size; + unsigned long mask = s-1; + *x = ((*x) + mask) & (~mask); +} + +uint32_t utils_align_up(uint32_t size, int alignment) { + return (size + alignment - 1) & ~(alignment-1); +} + +//with null-terminator -> "hello" return 6 +size_t utils_strlen(const char *s) { + size_t i = 0; + while (s[i]) i++; + return i+1; +} + + +char *utils_strcpy(char* dst, const char *src) { + char *save = dst; + while((*dst++ = *src++)); + return save; +} + + +char *utils_strdup(const char *src) { + size_t len = utils_strlen(src); + char *dst = simple_malloc(len); + if (dst == NULL) { // Check if the memory has been successfully allocated + return NULL; + } + utils_strcpy(dst, src); // Copy the string + return dst; +} + + diff --git a/lab3_ADEX2/shell/utils.o b/lab3_ADEX2/shell/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..74670709cc74f02475f1c6c05ac4403bb067de43 GIT binary patch literal 2320 zcmbu9O^91n6vzMXqtkIR)M*)LaY~!CX;HAxNtwb}7rtrLf{KzhMFk;!$vm6bB$JO9 znA+k5tQ*ILgIx()@B`YeW+Aw<(Ut2KyHXjo&_ydKql;OL&vRbRHIJLD+5?Ys?(d$D zd(XZ1Ej|D83#MT}iGgp>A1Mk{rB6KOt*V{L&;EKL9z-1Io?0zS|6Q zT=&K_>5@wds6HV zW6Tv>`LiD#d?b^inU%y=Ihb7(wp(k7KjYVgCuPg(jQCvG-xVI66R`$; ze5M1^4$765Q$%_Z>3Kw>d@E>{YiIMtg=*bv`U1URp{&eG`D`t2=iBvuXvJ4^l&4rf z-=CQ$w^q4YulV_@SE(!%fk4(dMS6Q|acVzXh?_A!Ew}##Mhi z8dv?jtZ~&}IIZ*5z$=grnmt`oR@1L|PT(&FaOSh0s=kzaXqBW4++zI&xWrh#l>YZdgLh<#CT#j#T(Q=j`@GYIUh7WBRSQ*pnpAe&Zz6svV-vdX zs}irftN7JeESsu-3iJCP*8frY6 Date: Wed, 8 May 2024 21:56:52 +0800 Subject: [PATCH 13/24] Create ReaMe.md --- lab5/ReaMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab5/ReaMe.md diff --git a/lab5/ReaMe.md b/lab5/ReaMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab5/ReaMe.md @@ -0,0 +1 @@ + From a8d694e9acb503f56058a3659d28226a9c89e15b Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 8 May 2024 22:04:26 +0800 Subject: [PATCH 14/24] Add files via upload --- lab5/Makefile | 102 ++++++ lab5/archive/TA/initramfs.cpio | Bin 0 -> 247296 bytes lab5/archive/TA/initramfs/syscall.img | Bin 0 -> 246920 bytes lab5/archive/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 31790 bytes lab5/archive/initramfs.cpio | Bin 0 -> 7680 bytes lab5/archive/rootfs/one | 3 + lab5/archive/rootfs/two | 3 + lab5/archive/rootfs/user1.img | Bin 0 -> 3056 bytes lab5/archive/rootfs/user2.img | Bin 0 -> 3360 bytes lab5/bootloader/linker.ld | 28 ++ lab5/bootloader/main.c | 48 +++ lab5/bootloader/main.o | Bin 0 -> 6264 bytes lab5/bootloader/start.o | Bin 0 -> 3656 bytes lab5/bootloader/start.s | 46 +++ lab5/build/bootloader.elf | Bin 0 -> 87888 bytes lab5/build/bootloader.img | Bin 0 -> 8240 bytes lab5/build/kernel8.elf | Bin 0 -> 170288 bytes lab5/build/kernel8.img | Bin 0 -> 44920 bytes lab5/build/user1.elf | Bin 0 -> 74192 bytes lab5/build/user1.img | Bin 0 -> 3056 bytes lab5/build/user2.elf | Bin 0 -> 74640 bytes lab5/build/user2.img | Bin 0 -> 3360 bytes lab5/include/_cpio.h | 31 ++ lab5/include/current.h | 16 + lab5/include/dtb.h | 39 +++ lab5/include/exception_c.h | 17 + lab5/include/exception_s.h | 6 + lab5/include/exec.h | 7 + lab5/include/fork.h | 8 + lab5/include/list.h | 45 +++ lab5/include/mini_uart.h | 22 ++ lab5/include/mm.h | 47 +++ lab5/include/peripheral/base.h | 7 + lab5/include/peripheral/gpio.h | 12 + lab5/include/peripheral/mailbox.h | 36 ++ lab5/include/peripheral/mini_uart.h | 30 ++ lab5/include/sche.h | 62 ++++ lab5/include/shell.h | 7 + lab5/include/signal.h | 27 ++ lab5/include/sprintf.h | 31 ++ lab5/include/stddef.h | 463 ++++++++++++++++++++++++++ lab5/include/stdint.h | 319 ++++++++++++++++++ lab5/include/syscall.h | 29 ++ lab5/include/thread.h | 13 + lab5/include/timer.h | 38 +++ lab5/include/trap_frame.h | 12 + lab5/include/utils_c.h | 32 ++ lab5/include/utils_s.h | 41 +++ lab5/kernel/exception_c.c | 94 ++++++ lab5/kernel/exception_c.o | Bin 0 -> 9712 bytes lab5/kernel/exception_s.o | Bin 0 -> 10160 bytes lab5/kernel/exception_s.s | 213 ++++++++++++ lab5/kernel/linker.ld | 32 ++ lab5/kernel/main.c | 32 ++ lab5/kernel/main.o | Bin 0 -> 5672 bytes lab5/kernel/start.o | Bin 0 -> 2936 bytes lab5/kernel/start.s | 36 ++ lab5/loadImg/loadImg.py | 30 ++ lab5/loadImg/loadImg.sh | 5 + lab5/rd.o | Bin 0 -> 8328 bytes lab5/requirements.txt | 1 + lab5/src/_cpio.c | 119 +++++++ lab5/src/_cpio.o | Bin 0 -> 10536 bytes lab5/src/dtb.c | 146 ++++++++ lab5/src/dtb.o | Bin 0 -> 11984 bytes lab5/src/exec.c | 75 +++++ lab5/src/exec.o | Bin 0 -> 9896 bytes lab5/src/fork.c | 47 +++ lab5/src/fork.o | Bin 0 -> 8680 bytes lab5/src/list.c | 47 +++ lab5/src/list.o | Bin 0 -> 5576 bytes lab5/src/mailbox.c | 65 ++++ lab5/src/mailbox.o | Bin 0 -> 6952 bytes lab5/src/memzero.o | Bin 0 -> 2248 bytes lab5/src/memzero.s | 7 + lab5/src/mini_uart.c | 258 ++++++++++++++ lab5/src/mini_uart.o | Bin 0 -> 15528 bytes lab5/src/mm.c | 450 +++++++++++++++++++++++++ lab5/src/mm.o | Bin 0 -> 25592 bytes lab5/src/sche.c | 151 +++++++++ lab5/src/sche.o | Bin 0 -> 14968 bytes lab5/src/shell.c | 226 +++++++++++++ lab5/src/shell.o | Bin 0 -> 16936 bytes lab5/src/signal.c | 63 ++++ lab5/src/signal.o | Bin 0 -> 9184 bytes lab5/src/sprintf.c | 152 +++++++++ lab5/src/sprintf.o | Bin 0 -> 6656 bytes lab5/src/syscall.c | 149 +++++++++ lab5/src/syscall.o | Bin 0 -> 15424 bytes lab5/src/thread.c | 76 +++++ lab5/src/thread.o | Bin 0 -> 11232 bytes lab5/src/timer.c | 155 +++++++++ lab5/src/timer.o | Bin 0 -> 14240 bytes lab5/src/trans_el.o | Bin 0 -> 2184 bytes lab5/src/trans_el.s | 9 + lab5/src/utils_c.c | 176 ++++++++++ lab5/src/utils_c.o | Bin 0 -> 10296 bytes lab5/src/utils_s.o | Bin 0 -> 2320 bytes lab5/src/utils_s.s | 32 ++ lab5/users/user1/main.c | 286 ++++++++++++++++ 100 files changed, 4759 insertions(+) create mode 100644 lab5/Makefile create mode 100644 lab5/archive/TA/initramfs.cpio create mode 100644 lab5/archive/TA/initramfs/syscall.img create mode 100644 lab5/archive/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab5/archive/initramfs.cpio create mode 100644 lab5/archive/rootfs/one create mode 100644 lab5/archive/rootfs/two create mode 100644 lab5/archive/rootfs/user1.img create mode 100644 lab5/archive/rootfs/user2.img create mode 100644 lab5/bootloader/linker.ld create mode 100644 lab5/bootloader/main.c create mode 100644 lab5/bootloader/main.o create mode 100644 lab5/bootloader/start.o create mode 100644 lab5/bootloader/start.s create mode 100644 lab5/build/bootloader.elf create mode 100644 lab5/build/bootloader.img create mode 100644 lab5/build/kernel8.elf create mode 100644 lab5/build/kernel8.img create mode 100644 lab5/build/user1.elf create mode 100644 lab5/build/user1.img create mode 100644 lab5/build/user2.elf create mode 100644 lab5/build/user2.img create mode 100644 lab5/include/_cpio.h create mode 100644 lab5/include/current.h create mode 100644 lab5/include/dtb.h create mode 100644 lab5/include/exception_c.h create mode 100644 lab5/include/exception_s.h create mode 100644 lab5/include/exec.h create mode 100644 lab5/include/fork.h create mode 100644 lab5/include/list.h create mode 100644 lab5/include/mini_uart.h create mode 100644 lab5/include/mm.h create mode 100644 lab5/include/peripheral/base.h create mode 100644 lab5/include/peripheral/gpio.h create mode 100644 lab5/include/peripheral/mailbox.h create mode 100644 lab5/include/peripheral/mini_uart.h create mode 100644 lab5/include/sche.h create mode 100644 lab5/include/shell.h create mode 100644 lab5/include/signal.h create mode 100644 lab5/include/sprintf.h create mode 100644 lab5/include/stddef.h create mode 100644 lab5/include/stdint.h create mode 100644 lab5/include/syscall.h create mode 100644 lab5/include/thread.h create mode 100644 lab5/include/timer.h create mode 100644 lab5/include/trap_frame.h create mode 100644 lab5/include/utils_c.h create mode 100644 lab5/include/utils_s.h create mode 100644 lab5/kernel/exception_c.c create mode 100644 lab5/kernel/exception_c.o create mode 100644 lab5/kernel/exception_s.o create mode 100644 lab5/kernel/exception_s.s create mode 100644 lab5/kernel/linker.ld create mode 100644 lab5/kernel/main.c create mode 100644 lab5/kernel/main.o create mode 100644 lab5/kernel/start.o create mode 100644 lab5/kernel/start.s create mode 100644 lab5/loadImg/loadImg.py create mode 100644 lab5/loadImg/loadImg.sh create mode 100644 lab5/rd.o create mode 100644 lab5/requirements.txt create mode 100644 lab5/src/_cpio.c create mode 100644 lab5/src/_cpio.o create mode 100644 lab5/src/dtb.c create mode 100644 lab5/src/dtb.o create mode 100644 lab5/src/exec.c create mode 100644 lab5/src/exec.o create mode 100644 lab5/src/fork.c create mode 100644 lab5/src/fork.o create mode 100644 lab5/src/list.c create mode 100644 lab5/src/list.o create mode 100644 lab5/src/mailbox.c create mode 100644 lab5/src/mailbox.o create mode 100644 lab5/src/memzero.o create mode 100644 lab5/src/memzero.s create mode 100644 lab5/src/mini_uart.c create mode 100644 lab5/src/mini_uart.o create mode 100644 lab5/src/mm.c create mode 100644 lab5/src/mm.o create mode 100644 lab5/src/sche.c create mode 100644 lab5/src/sche.o create mode 100644 lab5/src/shell.c create mode 100644 lab5/src/shell.o create mode 100644 lab5/src/signal.c create mode 100644 lab5/src/signal.o create mode 100644 lab5/src/sprintf.c create mode 100644 lab5/src/sprintf.o create mode 100644 lab5/src/syscall.c create mode 100644 lab5/src/syscall.o create mode 100644 lab5/src/thread.c create mode 100644 lab5/src/thread.o create mode 100644 lab5/src/timer.c create mode 100644 lab5/src/timer.o create mode 100644 lab5/src/trans_el.o create mode 100644 lab5/src/trans_el.s create mode 100644 lab5/src/utils_c.c create mode 100644 lab5/src/utils_c.o create mode 100644 lab5/src/utils_s.o create mode 100644 lab5/src/utils_s.s create mode 100644 lab5/users/user1/main.c diff --git a/lab5/Makefile b/lab5/Makefile new file mode 100644 index 000000000..527f6f735 --- /dev/null +++ b/lab5/Makefile @@ -0,0 +1,102 @@ +CFLAG = -Iinclude -Wall -ffreestanding -fno-stack-protector -nostdlib -nostartfiles -mgeneral-regs-only +K8=kernel8 +BL=bootloader +LINKER=linker.ld +START=start +CPIO:=archive/initramfs.cpio +TA_CPIO:=archive/TA/initramfs.cpio + +DTB:=archive/bcm2710-rpi-3-b-plus.dtb +USER_DIR:=users/user +USER1:=user1 +USER2:=user2 +BUILD:=build/ + +BUILD_ELF:=$(shell find build/ -name '*.elf') +BUILD_IMG:=$(shell find build/ -name '*.img') +ARC_IMG:=$(shell find archive/ -name '*.img') + +SRC_C:=$(shell find src/ -name '*.c') +SRC_S:=$(shell find src/ -name '*.s') + +KER_C:=$(shell find kernel/ -name '*.c') +KER_S:=$(shell find kernel/ -name '*.s') + +BL_C:=$(shell find bootloader/ -name '*.c') +BL_S:=$(shell find bootloader/ -name '*.s') + +USER1_C:=$(shell find users/user1/ -name '*.c') +USER1_OBJS:= $(USER1_C:%.c=%.o) + +USER2_C:=$(shell find users/user2/ -name '*.c') +USER2_OBJS:= $(USER2_C:%.c=%.o) + +OBJS:= $(SRC_C:%.c=%.o) \ + $(SRC_S:%.s=%.o) \ + rd.o + + +KERNEL_OBJS:=$(KER_C:%.c=%.o) \ + $(KER_S:%.s=%.o) + + + +BL_OBJS:=$(BL_C:%.c=%.o) \ + $(BL_S:%.s=%.o) \ + src/mini_uart.o src/utils_c.o src/utils_s.o src/memzero.o src/sprintf.o + + + + +all: $(BUILD)$(USER1).img\ + $(BUILD)$(USER2).img \ + $(BUILD)$(K8).img \ + $(BUILD)$(BL).img + + + +rd.o:$(CPIO) + aarch64-linux-gnu-ld -r -b binary -o rd.o $(CPIO) + + +%.o: %.s + aarch64-linux-gnu-gcc -g -o $@ -c $< + +%.o: %.c + aarch64-linux-gnu-gcc -g -o $@ $(CFLAG) -c $< + + +$(BUILD)$(K8).img: $(OBJS) $(KERNEL_OBJS) + aarch64-linux-gnu-ld -T kernel/$(LINKER) -o $(BUILD)$(K8).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(K8).elf $@ + +$(BUILD)$(BL).img: $(BL_OBJS) + aarch64-linux-gnu-ld -T bootloader/$(LINKER) -o $(BUILD)$(BL).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(BL).elf $@ + +$(BUILD)$(USER1).img:$(USER1_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)1/$(LINKER) -o $(BUILD)$(USER1).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER1).elf $@ + cp $@ archive/rootfs/ + +$(BUILD)$(USER2).img:$(USER2_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)2/$(LINKER) -o $(BUILD)$(USER2).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER2).elf $@ + cp $@ archive/rootfs/ + +$(CPIO): + cd archive/rootfs&&find . | cpio -o -H newc > ../initramfs.cpio + +on: + sudo screen /dev/ttyUSB0 115200 +qe: $(BUILD)$(K8).img + qemu-system-aarch64 -M raspi3b -kernel $< \ + -serial null -serial stdio -s \ + -initrd $(TA_CPIO) \ + -dtb $(DTB) \ + +clean: + $(RM) $(BUILD_ELF) $(CPIO) \ + $(OBJS) $(KERNEL_OBJS) $(BL_OBJS) $(USER1_OBJS) $(USER2_OBJS)\ + $(BUILD_IMG) $(ARC_IMG) + \ No newline at end of file diff --git a/lab5/archive/TA/initramfs.cpio b/lab5/archive/TA/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..0676fb1584617bc4d73624b3b212a12133e97d8e GIT binary patch literal 247296 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 iR9+wW`e!2WU#NV7<3HcemDl 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 literal 0 HcmV?d00001 diff --git a/lab5/archive/initramfs.cpio b/lab5/archive/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..36a1383f3d82acb795de93f055545bea43f57287 GIT binary patch literal 7680 zcmeHMU2GKB6+W}O7-EQRz)}#7*jXTg01dnT!Cs2QtZhhB5^&ZVMOBnyz*ey8VlOy> z*0f&4LsQ`gPmDyQ2$ZyWz=Q}Zij=GrwN8|WM6r|xXrJ10$B?9IBb7p$Fse7x@7$T$ z9q+E!O?a{iilyd~1wDDgsnku5-4n__l6;dus(c;oKit=Ccja@4uS&>x;tDr8am|^B$gDiHXQww`TroLM{CW0B&*A!q zdVl^5WrqGRp7E33LUdXLDQyI`G{PArb%WmNqtnmf7Ihe}bH=+i=#OD+%#jz64-zFq z3MHi8_h5Y=XFr#9-_AR}?wq({+jhYV3Fo*8=Y{G@;HU#vFe z6U1X0b!1N8N9OhAWZtMI^V7v-ezuUze*`sC)M=)1pJq-k*UanHnt5ZfW`4R*GZmt% zVjY=coo2$0&h|1xf0XmAKwJxO2XOmw`*7Q_rY>K%tTUORccp(fF9JRd_!O|6uRHCh z3kLkEuyGZ-LDm0fH~w#90ZKP|&M8J_|H-*QU-;=G8E+?I z571Hp8IE^y_nR-!r4Md(Z4$STpMUY(y<@DS`BHJQ2R8Sl(#A>Bw;xnnSXX@Re?v@- z+(KSn^3Al4sWZc4tpq=)FZ%M=SBQM4=+5w!)fm%|7h{i>4h690u!Xf>>cg08b2V&o zoCa(fu&Er6y%d5?f=$$i9XoK$$*xt{;`vSe54C_fai6en3yfoak9*_&-GWqH+DEOi z9QOQ#;C?$Lzktpney57)`2x0HjOTCH=`NnbcA}q+d}Adz7aTw0J0;eTiSJ|XJrPP0 zAH%}h+jbYV=aDH=dnT_56H?MPpq9-W7pOz?zdmtr1P5I zgBT28D!o^rx%I3}L^O?>ca~7ooOZL0#YsRLgrW=bKyBarbKj`)F2=_tgA7 zi)~y*ZlQx(jT&fiF2Q%1KDxbd=NaJpEcve}&zLZJm@<{IiU8#`Qt99FKi=dFly1l0K~t^mcE3pu3XX z=XlR^y+?Zc4{cQ+IL7B>cl^M?-oEawYR|Er11g_pBYc{@x014b$nxdN59~YKb7*j@ zD)ponmEAbF`ZO%{4&r(Jp=bO09wfrISYFC6;}kfyN~v2C#5O^+0{7IHmh~c|u`2a! z;GDnv?|-Y}$6DMixZD40SsgqOtLlgYVLg66j`6TPUUSxWPWiE;$M^v55#XAQOS`*0 z_$bCNmcS=~PXTYV^`-q?9{oRITmau@vQ_!Ni)^4c}F#Gh2IRLR_41g6edRtgZX zQRVEib4!0}D|2qAfTw_uI=Jub>T{v}IUL_Jx|zde?i|?5%bJ@cue*D`7;%Z&e7r2n z7yA$OAjXJVuQpURs!i&a%4W4ijiN5S{IGE+^SG9|dGc(2*eb=P3je`17f+tW59J$` z<%g^C`QhX`{Rd^<_C4oq4#)EFu!%AclfMtFd@hfN-73YyA~_y*H+<-?;0?~XU-Am~-0$+CFMxO0XYW~jXl)6; zFaY^R;F_&hln*6J;1kdr1YU{{JrBGTA9}Tf{TgtF_eL_GG$qdVgG9~dul J`TG84;Q!qtk~{za literal 0 HcmV?d00001 diff --git a/lab5/archive/rootfs/one b/lab5/archive/rootfs/one new file mode 100644 index 000000000..50ecbb596 --- /dev/null +++ b/lab5/archive/rootfs/one @@ -0,0 +1,3 @@ +1 2 3 +4 5 6 +7 8 9 diff --git a/lab5/archive/rootfs/two b/lab5/archive/rootfs/two new file mode 100644 index 000000000..599c97676 --- /dev/null +++ b/lab5/archive/rootfs/two @@ -0,0 +1,3 @@ +hello + world + !!!!! diff --git a/lab5/archive/rootfs/user1.img b/lab5/archive/rootfs/user1.img new file mode 100644 index 0000000000000000000000000000000000000000..8949656574e136c1c5cbb2a1206c07713c9fa9e3 GIT binary patch literal 3056 zcmcImU2GIp6h3!mT7Fvl15F^*u)77*q8KoeNR^~_DUm3FmTe6&L@5=cL?T_lNG#eV zJcywW9ZG@;X#>gwMGTEG!AXo(!-K{q%8x#&+-Zv#B@v51+}LIO&dlz1vMd!J*yQHk zz2EuH`R+MqW^TIklYz8J_I#p4DngDMkq!~{&`_=Yph1ULVV@|KNOyjIV#wU|o!2PN z!A`r?q(|nE9-U2kteo`a64F0SBmHwkYE><@J4fn~*;0>|OFdR1_2p?&3!;mvmb9vs z8h&i{m+t)3k6%ow^FQ`9#|Dwfg@DMRIQz&*yfFWZa_G&GV$wW=P$D+`I={u^4&2_WHri2I+gC zvnEQF?eoZKhutRFyq{-d!KS?!y}n2GN}>aZ>k!roxe3?8T_SbtUYdnxu--poM$e3J z{(3~xExWs#ycXmbT2Ra6FPs~!l}TUudRw5~qDloD);qNB!-I7Ci}AL_Y8?6bmCqjD zV~#XZ3DpFjO)1CSM|Q)D(dEolSIiI8aQ8U!a>STe*&Chc>Rm~QgZ`pF-nc+y9H1Lr z7izF4kr%f~Ix!11hcDE=(!gHUXAOL^P8U91_!N8MM`G|v@QMBiv;)VPf?kC$KHu;^ z=mngK*CcRO?Bjgv!+PH-N+o>%=ry)mYru}zt0;LDoay{b72p|Gz>D+wgFaouXJ{aL zsr#na%DG_u(04#BAibUaWSb&9(dM{*Cp!YP_gbLJz^GC=jl_IZ~(1Vxo zK3GV}t=t2}se}Q2ggIOX7dHHC7ODkJtO|O(K;BPHAn*D4l>d=W#O6APJIrTwIG@9K z&WrC-K2bZhAn2`Q=m+9&Gu7E#(;3j<0*msq%y#8c8(5E&laAqi>p$zj{dW<1>lpfC zCOG`=<$UwZob3DBMStXY+$;I-EcS5`xdjKkTJK_3_}=p~aDCe2H-hi^8UK5pyCXb| zJHjKlBRqyXLIdsyjij%vhSo+S(9AR63HAwFJ%G6=HA`(I$J<2CNF&*!rm)*AIUp?> zXtUy&#el-T|Bc5zgX4GHV#I$A@n6WqUvO)D7xC4*0vg0g+?RAS;;XOm4#M6Fe=VJK=edlY;J$#m4Pw}P z%~S$)akBp-*5o>l?^=wG?hw-__x55>lurJSRD{-5q4nHg4c|72RAM~s9nQv}D%KO+ zMK(UQ^Z6YQJrnKNy5-UPw#=lumtWboZ4nW^iT+Q#mLO~Qd{JE*!Q)Ca7vuXsJ#Q(a z@v>;2)o(ue;}2#0w+dr9##P|Wyb&*JP5@yZ|6ll5j#trV^ouNy@eYh-z$NCa-*p+k zjQ3!)PJs^s-vxXbX7GLgYeM{Qu)QDniU9X@uMOeXuz!3C{}o8&*(vx-fh*t(L;hEX z{5Jz11CIN1?tD!doO9X%eEQ#>H(cc7ZM~&tQd}tWbJq>*qY2MT0m9jOMBl9b%4Y*I g=jIgfxoOYi95HV6)%3^OC-Gt6`zLWfHyN1z1-}GOkpKVy literal 0 HcmV?d00001 diff --git a/lab5/archive/rootfs/user2.img b/lab5/archive/rootfs/user2.img new file mode 100644 index 0000000000000000000000000000000000000000..5458f0d3785b388a01f002bb2d511a6852a77b33 GIT binary patch literal 3360 zcmcInYitx%6h3!$Tc9m{KobZh>}(4GN+bA4Y-^Lw(kd!K%eICXg0!U#G$M3)S#7mL z_+bqF(V--ekT#(HpooDO6S9fXYW$(0iSp2Y%AJ;nQ4_;JiLS3s4F|UT zXxE5~h{rOE$QqqT*4SLKuH}(+J)5i>GsyZSq*<~^v&?y#H9A+b#_}}lTDE3gpP^ZT z=!#rQmRzb?uw$^jMAsM2JTnnj23im;fTp0ivFew`Z2M@U>r2Of!pn<U^IQu>(mwo!cv7ksviTFVNym zie^`RfxgGxyQPWH%tkhy`mI`;~Kpu?)}!C*B6c9;5;Z z9gcT+{ilcN>^HZY%H(b2=Qp0aU&b6w(W9~sHtY1bd610i?P@u5<;}n+a-{b*@^V}m zU)`^c_w=tO_(6Tq-FGe%DTnA@&*fssG~~ss)8gSE)*QC5_5})LNt?y6$#I&nX~L%H zjvNoeCc!4^!;Kv{=H%8YZ1Ma?{y{BZPCO=@+Y)ljZ-YPH_cQdUV;{A~dN}hNC68+< z_B%K;c~4EjQ-Urp!t;0QbS=-Jn&`FO`*tJeg5yVghhzy^yVy>0pGXl4XHBurRS!{n zKAkCQ&*C+qDb|GZN60DVAg@Jg$}WGmC9pL2ki8tyY-m z@h-u=Oc(CVcjrl=w7<{HFWqqs41&u@r>!jLP_ zXXta}CW_lzC_Y+4##lfYO+jr)3(`Jl^iL(>_ci~O5 z2marH|1S9Nf&YW>|1SFvx_-H5zcm5FIfF9ce=GcN^Zb`g_HV+!{6HWEaT;$es~-O4 zcQ}I}t8&I#JkfR0i^siliRc`faUh^au`coCcPKb9j^JJk(}~?;=7j73WFlwcJCyGm z7y8EY-7#z%B=qQwgncyWg9Y(R{R#yS9Cd(MYa35F8A&{`^xee-@&Z zqt*Up+x0AnV}G3wzXkdDH1_kcfD8YAFn<;Ba^S0c{{8c-2mU +#define BUFFER_MAX_SIZE 256u + +extern char *_dtb; +void load_img() +{ + char * kernel_addr = (char *)0x80000; + uart_send_string("Please sent the kernel image size:"); + char buffer[BUFFER_MAX_SIZE]; + // read_command(buffer); + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); + unsigned int img_size = utils_str2uint_dec(buffer); + uart_send_string("Start to load the kernel image... \n"); + + unsigned char *current = (unsigned char *)kernel_addr; + while (img_size--) + { + *current = uart_recv_raw(); + current++; + uart_send('.'); + } + uart_send_string("loading...\n"); + // branchAddr(kernel_addr); + ((void (*)(char *))kernel_addr)(_dtb); +} + +void bootloader_main(void) +{ + uart_init(); + uart_send_string("In bootloader_main!\n"); + load_img(); +} \ No newline at end of file diff --git a/lab5/bootloader/main.o b/lab5/bootloader/main.o new file mode 100644 index 0000000000000000000000000000000000000000..53e3b561c17117e0cac3570692187c36f7354dd1 GIT binary patch literal 6264 zcmbVQU2Ggz6+W}G*CM=mSzL2_CWOR&}j&`){><@3_a z8qV`DjVcbxuUqWr!0~HF96omw{R{z|cK*BmRMg*1^cV6p&aBxmeS`A5eg1b>ubcTB zx6l77Toa5HwWHXf-Umt#d3dtsIt|xuxL#lf71w^&^*y&{R~MZ!qSbTm5z+!U6*xX> z)a_c`Dcz-+&1P+!9X1kIy)ptJKj+zndOaZ6_4A8P)f?`DcW~ww7zr{^-Cm-iZ7Q+{ zjD$s^PU_+}29D!kB(@M|#KR#}FuLOk4E-9hP-b)}Fs6KT#jUCrK>X`u9O@;BPAQ!& z>17VKPjtW=As{nw0o$>=-tvifDd~I#UX19gHz)S5&+5lDqcz@!V1&qA0J#KW-|1gjzR|p zCE&I!w6aSc7^I*xJ6}K--BEpkDf1q~nCl~=cNoLxk~qbK_*2UlZeirY7Tvmn(RdAi z7V6T<#tq}&>8-d0RprC=Mq03t;Vvtcv#gwznzjb- zu?DhM=TWQgaVs@tr6;Tb^W2oRb;Rl&A&HgCS$k3WsMUYWO6IKoeO7PQ>dui#|NUfQ zOG==?OX7UX@m_|}P#&McN)&-I;J#&^q&Ox>%UMXXj0f|{E_ z!>Z#U?-Z&>YtKD6X=loIW?{j1-A3S`5a*Ry@ah@liqB@A^Xq|I4C+3DPUEastoU`W z-fU!=-Wkj%6F7yM+dyHcUaUEdiWpVv9yBU-EUm2tplo@~)H0}LEY+LngjLle2&%OP zE#pKJ*?h?@ZY&|m3(bWE7ne(^dG487)pI9kMRJw;qMKW)1ruXqxzC<@WG+{83J*k9 zGe<=_Tm1iuxY)&7v*ZFB$be5LPdg-A;qXPI8bPV#E+7Gq&CVXNN1rYQ}ey8HFmW#fdB60mur(-w!1*4t^|L1+hqiGS^yiJsau6YGH9u(Dyh8>dRc z$6ry=&J5o$QAp9IR*^)(4Bw%`wnh`eC@p{qGkh27FwR!J1>4~Av^GTHyn58dX9Eo> z6MA$=@g}JE;2koG*c(}YdH>2_7I$`Agnv zUn2IkP4wkZjg(+yX`{BP%DYJgrJ}5g-ra{jMDDB>chqoIJoSpIf~i`&v6g*!1fsi? zF0|CPYq*@x-H79Bv(;>-2p3y|W+M1@rfFDan)G)tO~Z>3JgWb41gE_r?KLJOe_8)a zj7$E4UtwI&|J?{Kb0p})2p-MnuZ&CFCz<~{j}lk#e@6U7*Xg(R>a@@W`iGtMbH9u5Rq?U)`#aCOn1X2aJm? z;iMzaOrEvitPZ=Fpo>%M0)*K8jFWz}nvF+riu*qE4{A8QQ>Z->4y`;VnSWfv-@-W5 z=);ei%q!#oo?$}p^Q=Fw;STd<4gV7Bdm3J6ys6>eU|i0H#HD&f?K|Pn%JWU;FKhTW zng4-?OU3_%hOcnkKWO;-jLZI)e161wYnuM&neSvf(SMZjT^jyf#)lb~{UG&qQq#YO z^&i&s8HSUZ{sk7yYxsN2%X5%Cud@CHO`qyMwTl{lFoaugaPpI2jD~KeWnLoM#{}uq zdAX1I{Te>QeDqw9zU*V!*W%|C>mTM(@GmldOv4@KXEl70`4bv`hIu(J`n=@);fKu~ z=X#3m1efOv*~ZyLyjkNI_~BR)%6Dr{HgJ~$$d;VIfo!4CfUI8+86_>bg=RTl^%m-= zqiCm4@ZIN8jf@%c9k1+?=>|skXfeTfLJ~~3amW_yi;ML2llAbcAd8juHSrL zAh1o-VcP%X^W)l6T_>N>cL1`m%z>mn5=Kq(4>h)`S`hbWYl>--mR_ zu#NG=X#MD)HWFXf@6(9sJ`sYq*lvd=)L5W@%;*@||BN5>7%`Ei>wW=c?edo^x!6kHZAm>o)o1c4c_OLW_xW=AYb~I# zGQNn~?d(shfB4}(3f;AOv6Jz&P3%8nd#Uf@Kq_fSk3{TuveS04Nwma@S2!`cp7xY}_7Q@eTz|ez WOr+`ar<~f^AL9J4M{J4I?f(bY3yGir literal 0 HcmV?d00001 diff --git a/lab5/bootloader/start.o b/lab5/bootloader/start.o new file mode 100644 index 0000000000000000000000000000000000000000..c28f9afa59472350768caffd4faca306bf3375a7 GIT binary patch literal 3656 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:fab@l>Gd20Pe9$TP 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 literal 0 HcmV?d00001 diff --git a/lab5/build/kernel8.img b/lab5/build/kernel8.img new file mode 100644 index 0000000000000000000000000000000000000000..21aa21a68e8f956a8b827fe12069a1f2eef016dc GIT binary patch literal 44920 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 CpU=Jk literal 0 HcmV?d00001 diff --git a/lab5/build/user1.elf b/lab5/build/user1.elf new file mode 100644 index 0000000000000000000000000000000000000000..10dbd68d8985f98cffc9955fcedb186d08318914 GIT binary patch literal 74192 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 literal 0 HcmV?d00001 diff --git a/lab5/build/user2.elf b/lab5/build/user2.elf new file mode 100644 index 0000000000000000000000000000000000000000..cb3056ccf231ddfbc63aeb0e1c2295dfc91af688 GIT binary patch literal 74640 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 literal 0 HcmV?d00001 diff --git a/lab5/build/user2.img b/lab5/build/user2.img new file mode 100644 index 0000000000000000000000000000000000000000..5458f0d3785b388a01f002bb2d511a6852a77b33 GIT binary patch literal 3360 zcmcInYitx%6h3!$Tc9m{KobZh>}(4GN+bA4Y-^Lw(kd!K%eICXg0!U#G$M3)S#7mL z_+bqF(V--ekT#(HpooDO6S9fXYW$(0iSp2Y%AJ;nQ4_;JiLS3s4F|UT zXxE5~h{rOE$QqqT*4SLKuH}(+J)5i>GsyZSq*<~^v&?y#H9A+b#_}}lTDE3gpP^ZT z=!#rQmRzb?uw$^jMAsM2JTnnj23im;fTp0ivFew`Z2M@U>r2Of!pn<U^IQu>(mwo!cv7ksviTFVNym zie^`RfxgGxyQPWH%tkhy`mI`;~Kpu?)}!C*B6c9;5;Z z9gcT+{ilcN>^HZY%H(b2=Qp0aU&b6w(W9~sHtY1bd610i?P@u5<;}n+a-{b*@^V}m zU)`^c_w=tO_(6Tq-FGe%DTnA@&*fssG~~ss)8gSE)*QC5_5})LNt?y6$#I&nX~L%H zjvNoeCc!4^!;Kv{=H%8YZ1Ma?{y{BZPCO=@+Y)ljZ-YPH_cQdUV;{A~dN}hNC68+< z_B%K;c~4EjQ-Urp!t;0QbS=-Jn&`FO`*tJeg5yVghhzy^yVy>0pGXl4XHBurRS!{n zKAkCQ&*C+qDb|GZN60DVAg@Jg$}WGmC9pL2ki8tyY-m z@h-u=Oc(CVcjrl=w7<{HFWqqs41&u@r>!jLP_ zXXta}CW_lzC_Y+4##lfYO+jr)3(`Jl^iL(>_ci~O5 z2marH|1S9Nf&YW>|1SFvx_-H5zcm5FIfF9ce=GcN^Zb`g_HV+!{6HWEaT;$es~-O4 zcQ}I}t8&I#JkfR0i^siliRc`faUh^au`coCcPKb9j^JJk(}~?;=7j73WFlwcJCyGm z7y8EY-7#z%B=qQwgncyWg9Y(R{R#yS9Cd(MYa35F8A&{`^xee-@&Z zqt*Up+x0AnV}G3wzXkdDH1_kcfD8YAFn<;Ba^S0c{{8c-2mU +/* + cpio archive comprises a header record with basic numeric metadata followed by + the full pathname of the entry and the file data. +*/ +typedef struct cpio_header +{ + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; // determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; // determine when two entries refer to the same file. + char c_mode[8]; // specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +} cpio_header; + +void cpio_ls(); +void cpio_cat(const char *filename); +char *findFile(const char *name); +size_t cpio_load_program(const char *filename, void **put_addr); +#endif \ No newline at end of file diff --git a/lab5/include/current.h b/lab5/include/current.h new file mode 100644 index 000000000..9cc1e993a --- /dev/null +++ b/lab5/include/current.h @@ -0,0 +1,16 @@ +#ifndef _CURRENT_H +#define _CURRENT_H + +#include "thread.h" + +static inline struct task *get_thread_ds() +{ + return (struct task *)read_sysreg(tpidr_el1); +} +static inline void set_thread_ds(struct task *cur) +{ + write_sysreg(tpidr_el1, cur); +} +#define current get_thread_ds() + +#endif diff --git a/lab5/include/dtb.h b/lab5/include/dtb.h new file mode 100644 index 000000000..38f0d3612 --- /dev/null +++ b/lab5/include/dtb.h @@ -0,0 +1,39 @@ +#ifndef _DTB_H +#define _DTB_H +#include +#include +/* + structure block: located at a 4-byte aligned offset from the beginning of the devicetree blob + token is a big-endian 32-bit integer, alligned on 32bit(padding 0) + +*/ + +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef struct fdt_header +{ + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +} fdt_header; + +typedef void (*fdt_callback)(int type, const char *name, const void *data, uint32_t size); +void print_dtb(int type, const char *name, const void *data, uint32_t size); +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size); +int fdt_traverse(fdt_callback cb, void *dtb_ptr); + +extern uintptr_t dtb_end, dtb_start; +extern char *initramfs_start, *initramfs_end; + +#endif \ No newline at end of file diff --git a/lab5/include/exception_c.h b/lab5/include/exception_c.h new file mode 100644 index 000000000..c47caa49c --- /dev/null +++ b/lab5/include/exception_c.h @@ -0,0 +1,17 @@ +#ifndef _EXCEPTION_C_H +#define _EXCEPTION_C_H +#include +#include "trap_frame.h" +typedef void (*task_callback)(void *); + +void enable_interrupt(); +void disable_interrupt(); +unsigned long disable_irq(); +void irq_restore(unsigned long flag); + +void default_handler(); +void lower_sync_handler(TrapFrame *_regs); +void irq_handler(); +void curr_sync_handler(); + +#endif diff --git a/lab5/include/exception_s.h b/lab5/include/exception_s.h new file mode 100644 index 000000000..fd2409595 --- /dev/null +++ b/lab5/include/exception_s.h @@ -0,0 +1,6 @@ +#ifndef _EXCEPTION_S_H +#define _EXCEPTION_S_H + +void restore_regs_eret(); + +#endif diff --git a/lab5/include/exec.h b/lab5/include/exec.h new file mode 100644 index 000000000..2676c33ae --- /dev/null +++ b/lab5/include/exec.h @@ -0,0 +1,7 @@ +#ifndef __EXEC_H_ +#define __EXEC_H_ + +void exe_new_prog(char *filename); +int do_exec(const char *path, const char *argv[]); + +#endif \ No newline at end of file diff --git a/lab5/include/fork.h b/lab5/include/fork.h new file mode 100644 index 000000000..3fa7d5d3b --- /dev/null +++ b/lab5/include/fork.h @@ -0,0 +1,8 @@ +#ifndef __FORK_H_ +#define __FORK_H_ +#include +#include "trap_frame.h" + +size_t do_fork(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab5/include/list.h b/lab5/include/list.h new file mode 100644 index 000000000..0f886e233 --- /dev/null +++ b/lab5/include/list.h @@ -0,0 +1,45 @@ +#ifndef __LIST_H +#define __LIST_H +#include +#include + +typedef struct list +{ + struct list *next, *prev; +} list; + +#define container_of(ptr, type, member) ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); }) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +#define list_for_each_entry(entry, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) + +#define LIST_HEAD_INIT(name) \ + { \ + &(name), &(name) \ + } + +static inline int list_empty(const list *head) +{ + return head->next == head; +} + +void list_init(list *node); +void insert_head(list *head, list *v); +void insert_tail(list *head, list *v); +list *remove_head(list *head); +list *remove_tail(list *head); +void unlink(list *node); +#endif diff --git a/lab5/include/mini_uart.h b/lab5/include/mini_uart.h new file mode 100644 index 000000000..2c17055b3 --- /dev/null +++ b/lab5/include/mini_uart.h @@ -0,0 +1,22 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + + +void delay(unsigned int clock); +void enable_uart_interrupt(); +void disable_uart_interrupt(); +void uart_init(); +void uart_send_string(const char* str); +void uart_send(const char c); +char uart_recv(); +char uart_recv_raw(); +void uart_hex(unsigned int d); +void uart_dec(unsigned int num); +void uart_handler(); +void test_uart_async(); +char uart_async_recv(); +void uart_async_send_string(char *str); +void uart_async_send(char c); + +unsigned int uart_printf(char* fmt, ...); +#endif \ No newline at end of file diff --git a/lab5/include/mm.h b/lab5/include/mm.h new file mode 100644 index 000000000..756755aa4 --- /dev/null +++ b/lab5/include/mm.h @@ -0,0 +1,47 @@ +#ifndef _MM_H +#define _MM_H + +#include +#include + +#define STARTUP_MEM_START 0x07000000 +#define STARTUP_MEM_END 0x07ffffff + +typedef struct FrameFlag +{ + unsigned char flag; + unsigned char order; + unsigned short ref_count; + unsigned char chunk_order; +} FrameFlag; + +typedef struct Chunk +{ + struct Chunk *next; +} Chunk; + +// buddy system +void init_buddy(); +void *alloc_pages(unsigned int pages); +void free_pages(void *victim); + +// dynamic mem allocate +void *kmalloc(unsigned int size); +void *kcalloc(unsigned int size); +void kfree(void *ptr); + +// test +void test_buddy(); +void test_dynamic_alloc(); + +// others +void memory_reserve(uintptr_t start, uintptr_t end); +void mm_init(); +void merge_useful_pages(); + +// start up allocation +void *smalloc(size_t size); + + +#endif + diff --git a/lab5/include/peripheral/base.h b/lab5/include/peripheral/base.h new file mode 100644 index 000000000..1eb154198 --- /dev/null +++ b/lab5/include/peripheral/base.h @@ -0,0 +1,7 @@ +#ifndef _PERIPHERAL_BASE_H +#define _PERIPHERAL_BASE_H + +#define MMIO_BASE 0x3F000000 +#define MAILBOX_BASE MMIO_BASE + 0xb880 + +#endif \ No newline at end of file diff --git a/lab5/include/peripheral/gpio.h b/lab5/include/peripheral/gpio.h new file mode 100644 index 000000000..8246c40ae --- /dev/null +++ b/lab5/include/peripheral/gpio.h @@ -0,0 +1,12 @@ +#ifndef _PERIPHERAL_GPIO_H +#define _PERIPHERAL_GPIO_H + +#include "peripheral/base.h" + +#define GPFSEL1 ((volatile unsigned int *)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int *)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int *)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int *)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int *)(MMIO_BASE+0x00200098)) + +#endif \ No newline at end of file diff --git a/lab5/include/peripheral/mailbox.h b/lab5/include/peripheral/mailbox.h new file mode 100644 index 000000000..fc26769a9 --- /dev/null +++ b/lab5/include/peripheral/mailbox.h @@ -0,0 +1,36 @@ +#ifndef _MAILBOX_H +#define _MAILBOX_H + +#include "peripheral/base.h" + +#define MAILBOX_READ ((volatile unsigned int *)(MAILBOX_BASE)) +#define MAILBOX_STATUS ((volatile unsigned int *)(MAILBOX_BASE + 0x18)) +#define MAILBOX_WRITE ((volatile unsigned int *)(MAILBOX_BASE + 0x20)) + +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 +#define MAILBOX_RESPONSE 0x80000000 +#define ARM_MEMORY 0x00010005 + +#define GET_BOARD_REVISION 0x00010002 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +#define MAILBOX_CH_POWER 0 +#define MAILBOX_CH_FB 1 +#define MAILBOX_CH_VUART 2 +#define MAILBOX_CH_VCHIQ 3 +#define MAILBOX_CH_LEDS 4 +#define MAILBOX_CH_BTNS 5 +#define MAILBOX_CH_TOUCH 6 +#define MAILBOX_CH_COUNT 7 +#define MAILBOX_CH_PROP 8 + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox); +unsigned int get_board_revision(); +void get_arm_memory(); + +#endif \ No newline at end of file diff --git a/lab5/include/peripheral/mini_uart.h b/lab5/include/peripheral/mini_uart.h new file mode 100644 index 000000000..0ac714e1c --- /dev/null +++ b/lab5/include/peripheral/mini_uart.h @@ -0,0 +1,30 @@ +#ifndef _PERIPHERAL_MINI_UART_H +#define _PERIPHERAL_MINI_UART_H + +#include "peripheral/base.h" + +#define AUX_ENABLE ((volatile unsigned int *)(MMIO_BASE + 0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int *)(MMIO_BASE + 0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215068)) + + + +#define ARM_IRQ_REG_BASE ((volatile unsigned int*)(MMIO_BASE + 0x0000b000)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b204)) +#define ENB_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b210)) +#define DISABLE_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b21c)) +#define AUX_IRQ (1 << 29) + + + + +#endif \ No newline at end of file diff --git a/lab5/include/sche.h b/lab5/include/sche.h new file mode 100644 index 000000000..349ed3d15 --- /dev/null +++ b/lab5/include/sche.h @@ -0,0 +1,62 @@ +#ifndef __SCHE_H +#define __SCHE_H +#include "list.h" +#include "signal.h" + +typedef unsigned long pid_t; +typedef enum +{ + TASK_RUNNING, + TASK_WAITING, + TASK_STOPPED, + TASK_INIT, +} state_t; + +struct cpu_context +{ + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long fp; + unsigned long sp; + unsigned long lr; +}; + +struct task +{ + struct cpu_context cpu_context; + char *kernel_stack; + char *user_stack; + char *user_prog; + size_t user_prog_size; + state_t state; + pid_t pid; + unsigned need_resched; + int exitcode; + unsigned long timeout; + list list; + struct signal *signal; + struct signal_context *sig_context; +}; + +extern list running_queue, waiting_queue, stopped_queue; +void add_task(struct task *t); +void kill_task(struct task *_task, int status); +void restart_task(struct task *_task); +void pause_task(struct task *_task); +void sleep_task(size_t ms); +void free_task(struct task *victim); +struct task *create_task(); +void switch_task(struct task *next); +struct task *pick_next_task(); +int get_the_cur_count(); +struct task *get_task(pid_t target); +extern pid_t task_count; +#endif \ No newline at end of file diff --git a/lab5/include/shell.h b/lab5/include/shell.h new file mode 100644 index 000000000..08f251990 --- /dev/null +++ b/lab5/include/shell.h @@ -0,0 +1,7 @@ +#ifndef _SHELL_H +#define _SHELL_H + +void shell(); +void read_command(char *str); +void parse_command(char *str); +#endif \ No newline at end of file diff --git a/lab5/include/signal.h b/lab5/include/signal.h new file mode 100644 index 000000000..768e13b87 --- /dev/null +++ b/lab5/include/signal.h @@ -0,0 +1,27 @@ +#ifndef __SIGNAL_H +#define __SIGNAL_H + +#define SIGKILL 9 + +#include "list.h" +#include "trap_frame.h" +#define SIG_NUM (sizeof(signal_table) / sizeof(signal_table[0])) +typedef void (*signal_handler)(int); + +struct signal +{ + unsigned int sig_num; + signal_handler handler; + struct list list; +}; +struct signal_context +{ + TrapFrame *trapframe; + char *user_stack; +}; + +extern signal_handler signal_table[]; + +void sig_context_update(TrapFrame *_regs, void (*handler)()); +void sig_context_restore(TrapFrame *_regs); +#endif diff --git a/lab5/include/sprintf.h b/lab5/include/sprintf.h new file mode 100644 index 000000000..a7c47f848 --- /dev/null +++ b/lab5/include/sprintf.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ +#ifndef __SPRINT_H +#define __SPRINT_H + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +#endif \ No newline at end of file diff --git a/lab5/include/stddef.h b/lab5/include/stddef.h new file mode 100644 index 000000000..5e498773a --- /dev/null +++ b/lab5/include/stddef.h @@ -0,0 +1,463 @@ +/* Copyright (C) 1989-2024 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +/* + * ISO C Standard: 7.17 Common definitions + */ +#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \ + && !defined(__STDDEF_H__)) \ + || defined(__need_wchar_t) || defined(__need_size_t) \ + || defined(__need_ptrdiff_t) || defined(__need_NULL) \ + || defined(__need_wint_t) + +/* Any one of these symbols __need_* means that GNU libc + wants us just to define one data type. So don't define + the symbols that indicate this file's entire job has been done. */ +#if (!defined(__need_wchar_t) && !defined(__need_size_t) \ + && !defined(__need_ptrdiff_t) && !defined(__need_NULL) \ + && !defined(__need_wint_t)) +#define _STDDEF_H +#define _STDDEF_H_ +/* snaroff@next.com says the NeXT needs this. */ +#define _ANSI_STDDEF_H +#endif + +#ifndef __sys_stdtypes_h +/* This avoids lossage on SunOS but only if stdtypes.h comes first. + There's no way to win with the other order! Sun lossage. */ + +#if defined(__NetBSD__) +#include +#endif + +#if defined (__FreeBSD__) +#include +#endif + +#if defined(__NetBSD__) +#if !defined(_SIZE_T_) && !defined(_BSD_SIZE_T_) +#define _SIZE_T +#endif +#if !defined(_PTRDIFF_T_) && !defined(_BSD_PTRDIFF_T_) +#define _PTRDIFF_T +#endif +/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_ + instead of _WCHAR_T_. */ +#if !defined(_WCHAR_T_) && !defined(_BSD_WCHAR_T_) +#ifndef _BSD_WCHAR_T_ +#define _WCHAR_T +#endif +#endif +/* Undef _FOO_T_ if we are supposed to define foo_t. */ +#if defined (__need_ptrdiff_t) || defined (_STDDEF_H_) +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#if defined (__need_size_t) || defined (_STDDEF_H_) +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#if defined (__need_wchar_t) || defined (_STDDEF_H_) +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +#endif /* defined(__NetBSD__) */ + +/* Sequent's header files use _PTRDIFF_T_ in some conflicting way. + Just ignore it. */ +#if defined (__sequent__) && defined (_PTRDIFF_T_) +#undef _PTRDIFF_T_ +#endif + +/* On VxWorks, may have defined macros like + _TYPE_size_t which will typedef size_t. fixincludes patched the + vxTypesBase.h so that this macro is only defined if _GCC_SIZE_T is + not defined, and so that defining this macro defines _GCC_SIZE_T. + If we find that the macros are still defined at this point, we must + invoke them so that the type is defined as expected. */ +#if defined (_TYPE_ptrdiff_t) && (defined (__need_ptrdiff_t) || defined (_STDDEF_H_)) +_TYPE_ptrdiff_t; +#undef _TYPE_ptrdiff_t +#endif +#if defined (_TYPE_size_t) && (defined (__need_size_t) || defined (_STDDEF_H_)) +_TYPE_size_t; +#undef _TYPE_size_t +#endif +#if defined (_TYPE_wchar_t) && (defined (__need_wchar_t) || defined (_STDDEF_H_)) +_TYPE_wchar_t; +#undef _TYPE_wchar_t +#endif + +/* In case nobody has defined these types, but we aren't running under + GCC 2.00, make sure that __PTRDIFF_TYPE__, __SIZE_TYPE__, and + __WCHAR_TYPE__ have reasonable values. This can happen if the + parts of GCC is compiled by an older compiler, that actually + include gstddef.h, such as collect2. */ + +/* Signed type of difference of two pointers. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_ptrdiff_t) +#ifndef _PTRDIFF_T /* in case has defined it. */ +#ifndef _T_PTRDIFF_ +#ifndef _T_PTRDIFF +#ifndef __PTRDIFF_T +#ifndef _PTRDIFF_T_ +#ifndef _BSD_PTRDIFF_T_ +#ifndef ___int_ptrdiff_t_h +#ifndef _GCC_PTRDIFF_T +#ifndef _PTRDIFF_T_DECLARED /* DragonFly */ +#ifndef __DEFINED_ptrdiff_t /* musl libc */ +#define _PTRDIFF_T +#define _T_PTRDIFF_ +#define _T_PTRDIFF +#define __PTRDIFF_T +#define _PTRDIFF_T_ +#define _BSD_PTRDIFF_T_ +#define ___int_ptrdiff_t_h +#define _GCC_PTRDIFF_T +#define _PTRDIFF_T_DECLARED +#define __DEFINED_ptrdiff_t +#ifndef __PTRDIFF_TYPE__ +#define __PTRDIFF_TYPE__ long int +#endif +typedef __PTRDIFF_TYPE__ ptrdiff_t; +#endif /* __DEFINED_ptrdiff_t */ +#endif /* _PTRDIFF_T_DECLARED */ +#endif /* _GCC_PTRDIFF_T */ +#endif /* ___int_ptrdiff_t_h */ +#endif /* _BSD_PTRDIFF_T_ */ +#endif /* _PTRDIFF_T_ */ +#endif /* __PTRDIFF_T */ +#endif /* _T_PTRDIFF */ +#endif /* _T_PTRDIFF_ */ +#endif /* _PTRDIFF_T */ + +/* If this symbol has done its job, get rid of it. */ +#undef __need_ptrdiff_t + +#endif /* _STDDEF_H or __need_ptrdiff_t. */ + +/* Unsigned type of `sizeof' something. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_size_t) +#ifndef __size_t__ /* BeOS */ +#ifndef __SIZE_T__ /* Cray Unicos/Mk */ +#ifndef _SIZE_T /* in case has defined it. */ +#ifndef _SYS_SIZE_T_H +#ifndef _T_SIZE_ +#ifndef _T_SIZE +#ifndef __SIZE_T +#ifndef _SIZE_T_ +#ifndef _BSD_SIZE_T_ +#ifndef _SIZE_T_DEFINED_ +#ifndef _SIZE_T_DEFINED +#ifndef _BSD_SIZE_T_DEFINED_ /* Darwin */ +#ifndef _SIZE_T_DECLARED /* FreeBSD 5 */ +#ifndef __DEFINED_size_t /* musl libc */ +#ifndef ___int_size_t_h +#ifndef _GCC_SIZE_T +#ifndef _SIZET_ +#ifndef __size_t +#define __size_t__ /* BeOS */ +#define __SIZE_T__ /* Cray Unicos/Mk */ +#define _SIZE_T +#define _SYS_SIZE_T_H +#define _T_SIZE_ +#define _T_SIZE +#define __SIZE_T +#define _SIZE_T_ +#define _BSD_SIZE_T_ +#define _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED +#define _BSD_SIZE_T_DEFINED_ /* Darwin */ +#define _SIZE_T_DECLARED /* FreeBSD 5 */ +#define __DEFINED_size_t /* musl libc */ +#define ___int_size_t_h +#define _GCC_SIZE_T +#define _SIZET_ +#if defined (__FreeBSD__) \ + || defined(__DragonFly__) \ + || defined(__FreeBSD_kernel__) \ + || defined(__VMS__) +/* __size_t is a typedef, must not trash it. */ +#else +#define __size_t +#endif +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +#if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; +#ifdef __BEOS__ +typedef long ssize_t; +#endif /* __BEOS__ */ +#endif /* !(defined (__GNUG__) && defined (size_t)) */ +#endif /* __size_t */ +#endif /* _SIZET_ */ +#endif /* _GCC_SIZE_T */ +#endif /* ___int_size_t_h */ +#endif /* __DEFINED_size_t */ +#endif /* _SIZE_T_DECLARED */ +#endif /* _BSD_SIZE_T_DEFINED_ */ +#endif /* _SIZE_T_DEFINED */ +#endif /* _SIZE_T_DEFINED_ */ +#endif /* _BSD_SIZE_T_ */ +#endif /* _SIZE_T_ */ +#endif /* __SIZE_T */ +#endif /* _T_SIZE */ +#endif /* _T_SIZE_ */ +#endif /* _SYS_SIZE_T_H */ +#endif /* _SIZE_T */ +#endif /* __SIZE_T__ */ +#endif /* __size_t__ */ +#undef __need_size_t +#endif /* _STDDEF_H or __need_size_t. */ + + +/* Wide character type. + Locale-writers should change this as necessary to + be big enough to hold unique values not between 0 and 127, + and not (wchar_t) -1, for each defined multibyte character. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_wchar_t) +#ifndef __wchar_t__ /* BeOS */ +#ifndef __WCHAR_T__ /* Cray Unicos/Mk */ +#ifndef _WCHAR_T +#ifndef _T_WCHAR_ +#ifndef _T_WCHAR +#ifndef __WCHAR_T +#ifndef _WCHAR_T_ +#ifndef _BSD_WCHAR_T_ +#ifndef _BSD_WCHAR_T_DEFINED_ /* Darwin */ +#ifndef _BSD_RUNE_T_DEFINED_ /* Darwin */ +#ifndef _WCHAR_T_DECLARED /* FreeBSD 5 */ +#ifndef __DEFINED_wchar_t /* musl libc */ +#ifndef _WCHAR_T_DEFINED_ +#ifndef _WCHAR_T_DEFINED +#ifndef _WCHAR_T_H +#ifndef ___int_wchar_t_h +#ifndef __INT_WCHAR_T_H +#ifndef _GCC_WCHAR_T +#define __wchar_t__ /* BeOS */ +#define __WCHAR_T__ /* Cray Unicos/Mk */ +#define _WCHAR_T +#define _T_WCHAR_ +#define _T_WCHAR +#define __WCHAR_T +#define _WCHAR_T_ +#define _BSD_WCHAR_T_ +#define _WCHAR_T_DEFINED_ +#define _WCHAR_T_DEFINED +#define _WCHAR_T_H +#define ___int_wchar_t_h +#define __INT_WCHAR_T_H +#define _GCC_WCHAR_T +#define _WCHAR_T_DECLARED +#define __DEFINED_wchar_t + +/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_ + instead of _WCHAR_T_, and _BSD_RUNE_T_ (which, unlike the other + symbols in the _FOO_T_ family, stays defined even after its + corresponding type is defined). If we define wchar_t, then we + must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if + we undef _WCHAR_T_, then we must also define rune_t, since + headers like runetype.h assume that if machine/ansi.h is included, + and _BSD_WCHAR_T_ is not defined, then rune_t is available. + machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of + the same type." */ +#ifdef _BSD_WCHAR_T_ +#undef _BSD_WCHAR_T_ +#ifdef _BSD_RUNE_T_ +#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE) +typedef _BSD_RUNE_T_ rune_t; +#define _BSD_WCHAR_T_DEFINED_ +#define _BSD_RUNE_T_DEFINED_ /* Darwin */ +#if defined (__FreeBSD__) && (__FreeBSD__ < 5) +/* Why is this file so hard to maintain properly? In contrast to + the comment above regarding BSD/386 1.1, on FreeBSD for as long + as the symbol has existed, _BSD_RUNE_T_ must not stay defined or + redundant typedefs will occur when stdlib.h is included after this file. */ +#undef _BSD_RUNE_T_ +#endif +#endif +#endif +#endif +/* FreeBSD 5 can't be handled well using "traditional" logic above + since it no longer defines _BSD_RUNE_T_ yet still desires to export + rune_t in some cases... */ +#if defined (__FreeBSD__) && (__FreeBSD__ >= 5) +#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE) +#if __BSD_VISIBLE +#ifndef _RUNE_T_DECLARED +typedef __rune_t rune_t; +#define _RUNE_T_DECLARED +#endif +#endif +#endif +#endif + +#ifndef __WCHAR_TYPE__ +#define __WCHAR_TYPE__ int +#endif +#ifndef __cplusplus +typedef __WCHAR_TYPE__ wchar_t; +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif /* __DEFINED_wchar_t */ +#endif /* _WCHAR_T_DECLARED */ +#endif /* _BSD_RUNE_T_DEFINED_ */ +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif /* __WCHAR_T__ */ +#endif /* __wchar_t__ */ +#undef __need_wchar_t +#endif /* _STDDEF_H or __need_wchar_t. */ + +#if defined (__need_wint_t) +#ifndef _WINT_T +#define _WINT_T + +#ifndef __WINT_TYPE__ +#define __WINT_TYPE__ unsigned int +#endif +typedef __WINT_TYPE__ wint_t; +#endif +#undef __need_wint_t +#endif + +#if defined(__NetBSD__) +/* The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_ + are probably typos and should be removed before 2.8 is released. */ +#ifdef _GCC_PTRDIFF_T_ +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#ifdef _GCC_SIZE_T_ +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#ifdef _GCC_WCHAR_T_ +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +/* The following ones are the real ones. */ +#ifdef _GCC_PTRDIFF_T +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#ifdef _GCC_SIZE_T +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#ifdef _GCC_WCHAR_T +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +#endif /* __NetBSD__ */ + +#endif /* __sys_stdtypes_h */ + +/* A null pointer constant. */ + +#if defined (_STDDEF_H) || defined (__need_NULL) +#undef NULL /* in case has defined it. */ +#ifdef __GNUG__ +#define NULL __null +#else /* G++ */ +#ifndef __cplusplus +#define NULL ((void *)0) +#else /* C++ */ +#define NULL 0 +#endif /* C++ */ +#endif /* G++ */ +#endif /* NULL not defined and or need NULL. */ +#undef __need_NULL + +#ifdef _STDDEF_H + +/* Offset of member MEMBER in a struct of type TYPE. */ +#undef offsetof /* in case a system header has defined it. */ +#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) + +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) \ + || (defined(__cplusplus) && __cplusplus >= 201103L) +#ifndef _GCC_MAX_ALIGN_T +#define _GCC_MAX_ALIGN_T +/* Type whose alignment is supported in every context and is at least + as great as that of any standard type not using alignment + specifiers. */ +typedef struct { + long long __max_align_ll __attribute__((__aligned__(__alignof__(long long)))); + long double __max_align_ld __attribute__((__aligned__(__alignof__(long double)))); + /* _Float128 is defined as a basic type, so max_align_t must be + sufficiently aligned for it. This code must work in C++, so we + use __float128 here; that is only available on some + architectures, but only on i386 is extra alignment needed for + __float128. */ +#ifdef __i386__ + __float128 __max_align_f128 __attribute__((__aligned__(__alignof(__float128)))); +#endif +} max_align_t; +#endif +#endif /* C11 or C++11. */ + +#if defined(__cplusplus) && __cplusplus >= 201103L +#ifndef _GXX_NULLPTR_T +#define _GXX_NULLPTR_T + typedef decltype(nullptr) nullptr_t; +#endif +#endif /* C++11. */ + +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ > 201710L) +#ifndef _GCC_NULLPTR_T +#define _GCC_NULLPTR_T + typedef __typeof__(nullptr) nullptr_t; +/* ??? This doesn't define __STDC_VERSION_STDDEF_H__ yet. */ +#endif +#endif /* C23. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L +#define unreachable() (__builtin_unreachable ()) +#define __STDC_VERSION_STDDEF_H__ 202311L +#endif + +#endif /* _STDDEF_H was defined this time */ + +#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__ + || __need_XXX was not defined before */ \ No newline at end of file diff --git a/lab5/include/stdint.h b/lab5/include/stdint.h new file mode 100644 index 000000000..2d666f79f --- /dev/null +++ b/lab5/include/stdint.h @@ -0,0 +1,319 @@ +/* Copyright (C) 1997-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* + * ISO C99: 7.18 Integer types + */ + +#ifndef _STDINT_H +#define _STDINT_H 1 + +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include +#include +#include +#include + +/* Exact integral types. */ + +/* Signed. */ +#include + +/* Unsigned. */ +#include + + +/* Small types. */ + +/* Signed. */ +typedef __int_least8_t int_least8_t; +typedef __int_least16_t int_least16_t; +typedef __int_least32_t int_least32_t; +typedef __int_least64_t int_least64_t; + +/* Unsigned. */ +typedef __uint_least8_t uint_least8_t; +typedef __uint_least16_t uint_least16_t; +typedef __uint_least32_t uint_least32_t; +typedef __uint_least64_t uint_least64_t; + + +/* Fast types. */ + +/* Signed. */ +typedef signed char int_fast8_t; +#if __WORDSIZE == 64 +typedef long int int_fast16_t; +typedef long int int_fast32_t; +typedef long int int_fast64_t; +#else +typedef int int_fast16_t; +typedef int int_fast32_t; +__extension__ +typedef long long int int_fast64_t; +#endif + +/* Unsigned. */ +typedef unsigned char uint_fast8_t; +#if __WORDSIZE == 64 +typedef unsigned long int uint_fast16_t; +typedef unsigned long int uint_fast32_t; +typedef unsigned long int uint_fast64_t; +#else +typedef unsigned int uint_fast16_t; +typedef unsigned int uint_fast32_t; +__extension__ +typedef unsigned long long int uint_fast64_t; +#endif + + +/* Types for `void *' pointers. */ +#if __WORDSIZE == 64 +# ifndef __intptr_t_defined +typedef long int intptr_t; +# define __intptr_t_defined +# endif +typedef unsigned long int uintptr_t; +#else +# ifndef __intptr_t_defined +typedef int intptr_t; +# define __intptr_t_defined +# endif +typedef unsigned int uintptr_t; +#endif + + +/* Largest integral types. */ +typedef __intmax_t intmax_t; +typedef __uintmax_t uintmax_t; + + +# if __WORDSIZE == 64 +# define __INT64_C(c) c ## L +# define __UINT64_C(c) c ## UL +# else +# define __INT64_C(c) c ## LL +# define __UINT64_C(c) c ## ULL +# endif + +/* Limits of integral types. */ + +/* Minimum of signed integral types. */ +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of signed integral types. */ +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types. */ +# define UINT8_MAX (255) +# define UINT16_MAX (65535) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (__UINT64_C(18446744073709551615)) + + +/* Minimum of signed integral types having a minimum size. */ +# define INT_LEAST8_MIN (-128) +# define INT_LEAST16_MIN (-32767-1) +# define INT_LEAST32_MIN (-2147483647-1) +# define INT_LEAST64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of signed integral types having a minimum size. */ +# define INT_LEAST8_MAX (127) +# define INT_LEAST16_MAX (32767) +# define INT_LEAST32_MAX (2147483647) +# define INT_LEAST64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types having a minimum size. */ +# define UINT_LEAST8_MAX (255) +# define UINT_LEAST16_MAX (65535) +# define UINT_LEAST32_MAX (4294967295U) +# define UINT_LEAST64_MAX (__UINT64_C(18446744073709551615)) + + +/* Minimum of fast signed integral types having a minimum size. */ +# define INT_FAST8_MIN (-128) +# if __WORDSIZE == 64 +# define INT_FAST16_MIN (-9223372036854775807L-1) +# define INT_FAST32_MIN (-9223372036854775807L-1) +# else +# define INT_FAST16_MIN (-2147483647-1) +# define INT_FAST32_MIN (-2147483647-1) +# endif +# define INT_FAST64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of fast signed integral types having a minimum size. */ +# define INT_FAST8_MAX (127) +# if __WORDSIZE == 64 +# define INT_FAST16_MAX (9223372036854775807L) +# define INT_FAST32_MAX (9223372036854775807L) +# else +# define INT_FAST16_MAX (2147483647) +# define INT_FAST32_MAX (2147483647) +# endif +# define INT_FAST64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of fast unsigned integral types having a minimum size. */ +# define UINT_FAST8_MAX (255) +# if __WORDSIZE == 64 +# define UINT_FAST16_MAX (18446744073709551615UL) +# define UINT_FAST32_MAX (18446744073709551615UL) +# else +# define UINT_FAST16_MAX (4294967295U) +# define UINT_FAST32_MAX (4294967295U) +# endif +# define UINT_FAST64_MAX (__UINT64_C(18446744073709551615)) + + +/* Values to test for integral types holding `void *' pointer. */ +# if __WORDSIZE == 64 +# define INTPTR_MIN (-9223372036854775807L-1) +# define INTPTR_MAX (9223372036854775807L) +# define UINTPTR_MAX (18446744073709551615UL) +# else +# define INTPTR_MIN (-2147483647-1) +# define INTPTR_MAX (2147483647) +# define UINTPTR_MAX (4294967295U) +# endif + + +/* Minimum for largest signed integral type. */ +# define INTMAX_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum for largest signed integral type. */ +# define INTMAX_MAX (__INT64_C(9223372036854775807)) + +/* Maximum for largest unsigned integral type. */ +# define UINTMAX_MAX (__UINT64_C(18446744073709551615)) + + +/* Limits of other integer types. */ + +/* Limits of `ptrdiff_t' type. */ +# if __WORDSIZE == 64 +# define PTRDIFF_MIN (-9223372036854775807L-1) +# define PTRDIFF_MAX (9223372036854775807L) +# else +# if __WORDSIZE32_PTRDIFF_LONG +# define PTRDIFF_MIN (-2147483647L-1) +# define PTRDIFF_MAX (2147483647L) +# else +# define PTRDIFF_MIN (-2147483647-1) +# define PTRDIFF_MAX (2147483647) +# endif +# endif + +/* Limits of `sig_atomic_t'. */ +# define SIG_ATOMIC_MIN (-2147483647-1) +# define SIG_ATOMIC_MAX (2147483647) + +/* Limit of `size_t' type. */ +# if __WORDSIZE == 64 +# define SIZE_MAX (18446744073709551615UL) +# else +# if __WORDSIZE32_SIZE_ULONG +# define SIZE_MAX (4294967295UL) +# else +# define SIZE_MAX (4294967295U) +# endif +# endif + +/* Limits of `wchar_t'. */ +# ifndef WCHAR_MIN +/* These constants might also be defined in . */ +# define WCHAR_MIN __WCHAR_MIN +# define WCHAR_MAX __WCHAR_MAX +# endif + +/* Limits of `wint_t'. */ +# define WINT_MIN (0u) +# define WINT_MAX (4294967295u) + +/* Signed. */ +# define INT8_C(c) c +# define INT16_C(c) c +# define INT32_C(c) c +# if __WORDSIZE == 64 +# define INT64_C(c) c ## L +# else +# define INT64_C(c) c ## LL +# endif + +/* Unsigned. */ +# define UINT8_C(c) c +# define UINT16_C(c) c +# define UINT32_C(c) c ## U +# if __WORDSIZE == 64 +# define UINT64_C(c) c ## UL +# else +# define UINT64_C(c) c ## ULL +# endif + +/* Maximal type. */ +# if __WORDSIZE == 64 +# define INTMAX_C(c) c ## L +# define UINTMAX_C(c) c ## UL +# else +# define INTMAX_C(c) c ## LL +# define UINTMAX_C(c) c ## ULL +# endif + +#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) + +# define INT8_WIDTH 8 +# define UINT8_WIDTH 8 +# define INT16_WIDTH 16 +# define UINT16_WIDTH 16 +# define INT32_WIDTH 32 +# define UINT32_WIDTH 32 +# define INT64_WIDTH 64 +# define UINT64_WIDTH 64 + +# define INT_LEAST8_WIDTH 8 +# define UINT_LEAST8_WIDTH 8 +# define INT_LEAST16_WIDTH 16 +# define UINT_LEAST16_WIDTH 16 +# define INT_LEAST32_WIDTH 32 +# define UINT_LEAST32_WIDTH 32 +# define INT_LEAST64_WIDTH 64 +# define UINT_LEAST64_WIDTH 64 + +# define INT_FAST8_WIDTH 8 +# define UINT_FAST8_WIDTH 8 +# define INT_FAST16_WIDTH __WORDSIZE +# define UINT_FAST16_WIDTH __WORDSIZE +# define INT_FAST32_WIDTH __WORDSIZE +# define UINT_FAST32_WIDTH __WORDSIZE +# define INT_FAST64_WIDTH 64 +# define UINT_FAST64_WIDTH 64 + +# define INTPTR_WIDTH __WORDSIZE +# define UINTPTR_WIDTH __WORDSIZE + +# define INTMAX_WIDTH 64 +# define UINTMAX_WIDTH 64 + +# define PTRDIFF_WIDTH __WORDSIZE +# define SIG_ATOMIC_WIDTH 32 +# define SIZE_WIDTH __WORDSIZE +# define WCHAR_WIDTH 32 +# define WINT_WIDTH 32 + +#endif + +#endif /* stdint.h */ diff --git a/lab5/include/syscall.h b/lab5/include/syscall.h new file mode 100644 index 000000000..f556cf61f --- /dev/null +++ b/lab5/include/syscall.h @@ -0,0 +1,29 @@ +#ifndef __SYSCALL_H +#define __SYSCALL_H + +#include "trap_frame.h" + +#define _STR(x) #x +#define STR(s) _STR(s) + +typedef void (*syscall)(TrapFrame *); + +enum { + SYS_GETPID, //0 + SYS_UART_RECV, + SYS_UART_WRITE, + SYS_EXEC, + SYS_FORK, + SYS_EXIT, //5 + SYS_MBOX, + SYS_KILL_PID, + SYS_SIGNAL, + SYS_SIGKILL, + SYS_SIGRETURN, //10 + NUM_syscalls +}; + +extern syscall syscall_table[]; +void syscall_handler(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab5/include/thread.h b/lab5/include/thread.h new file mode 100644 index 000000000..69dcbe3ff --- /dev/null +++ b/lab5/include/thread.h @@ -0,0 +1,13 @@ +#ifndef _THREAD_H +#define _THREAD_H +#include "list.h" +#include "utils_s.h" +#include "sche.h" +#define STACK_SIZE 0x2000 + +void thread_kill_zombies(); +void thread_schedule(size_t _); +void thread_init(); +struct task *thread_create(void *func); +void test_thread(); +#endif diff --git a/lab5/include/timer.h b/lab5/include/timer.h new file mode 100644 index 000000000..48edf58a6 --- /dev/null +++ b/lab5/include/timer.h @@ -0,0 +1,38 @@ +#ifndef __TIMER_H +#define __TIMER_H +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int *)(0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int *)(0x40000060)) +#define DEFAULT_TIMEOUT 30LL +#define SCHE_CYCLE 30LL +#define SYSTEM_TIMER_MSG "system_timeout" +#define S(n) (n * 1000LL) +#define MS(n) (n * 1LL) +#define GET_S(n) (n / 1000LL) +#define GET_MS(n) (n % 1000LL) +#include "stddef.h" + +typedef void (*timer_callback)(size_t); + +void core_timer_enable(); +void core_timer_disable(); +void set_expired_time(unsigned long duration); +unsigned long get_current_time(); +void core_timer_handler(); +void set_timeout(char *message, unsigned long time); +void print_message(char *msg); +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duraction); +void timeout_event_init(); +void timer_handler(); + +typedef struct timeout_event +{ + unsigned long register_time; + unsigned long duration; + timer_callback callback; + size_t arg; + struct timeout_event *prev, *next; +} timeout_event; + +extern timeout_event *timeout_queue_head, *timeout_queue_tail; + +#endif diff --git a/lab5/include/trap_frame.h b/lab5/include/trap_frame.h new file mode 100644 index 000000000..593c45d50 --- /dev/null +++ b/lab5/include/trap_frame.h @@ -0,0 +1,12 @@ +#ifndef __TRAP_FRAME_H +#define __TRAP_FRAME_H + +typedef struct +{ + unsigned long regs[31]; // general purpose regs x0~x30 + unsigned long sp; // sp_el0 + unsigned long pc; // elr_el1 + unsigned long pstate; // spsr_el1 +}TrapFrame; + +#endif \ No newline at end of file diff --git a/lab5/include/utils_c.h b/lab5/include/utils_c.h new file mode 100644 index 000000000..b648ec8c9 --- /dev/null +++ b/lab5/include/utils_c.h @@ -0,0 +1,32 @@ +#ifndef _UTILS_C_H +#define _UTILS_C_H + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 +#include +#include + +/* string */ +int utils_str_compare(const char *a, const char *b); +int utils_strncmp(const char *a, const char *b, size_t n); +void utils_newline2end(char *str); +char utils_int2char(int a); +void utils_int2str_dec(int a, char *str); +void utils_uint2str_dec(unsigned int num, char *str); +unsigned int utils_str2uint_dec(const char *str); +void align(void *size, size_t s); // aligned to 4 byte +size_t utils_strlen(const char *s); +uint32_t align_up(uint32_t size, int alignment); + +/* reboot */ +void set(long addr, unsigned int value); +void reset(int tick); +void cancel_reset(); + +/* others */ +void delay(unsigned int clock); +void memcpy(void *dst, const void *src, size_t n); +void *memset(void *s, int c, size_t n); + +#endif diff --git a/lab5/include/utils_s.h b/lab5/include/utils_s.h new file mode 100644 index 000000000..6f5a01825 --- /dev/null +++ b/lab5/include/utils_s.h @@ -0,0 +1,41 @@ +#ifndef __UTILS_S_H +#define __UTILS_S_H + +#define read_sysreg(r) ({ \ + unsigned long __val; \ + asm volatile("mrs %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_sysreg(r, __val) ({ \ + asm volatile("msr " #r ", %0" ::"r"(__val)); \ +}) + +#define read_gpreg(r) ({ \ + unsigned long __val; \ + asm volatile("mov %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_gpreg(r, __val) ({ \ + asm volatile("mov " #r ", %0" ::"r"(__val)); \ +}) + + +// EC,bits[31:26] +#define ESR_ELx_EC(esr) ((esr & 0xFC000000) >> 26) +// ISS,bits[24:0] +#define ESR_ELx_ISS(esr) (esr & 0x03FFFFFF) + +#define ESR_ELx_EC_SVC64 0b010101 +#define ESR_ELx_EC_DABT_LOW 0b100100 +#define ESR_ELx_EC_IABT_LOW 0b100000 + + +void branchAddr(void *addr); +int get_el(); +void switch_to(void *, void *); + +#endif diff --git a/lab5/kernel/exception_c.c b/lab5/kernel/exception_c.c new file mode 100644 index 000000000..a8086d6f5 --- /dev/null +++ b/lab5/kernel/exception_c.c @@ -0,0 +1,94 @@ +#include "utils_s.h" +#include "mini_uart.h" +#include "timer.h" +#include "peripheral/mini_uart.h" +#include "exception_c.h" +#include "current.h" +#include "thread.h" +#include "syscall.h" +#define AUX_IRQ (1 << 29) + +void enable_interrupt() { asm volatile("msr DAIFClr, 0xf"); } +void disable_interrupt() { asm volatile("msr DAIFSet, 0xf"); } +unsigned long disable_irq() +{ + unsigned long flag = read_sysreg(DAIF); + disable_interrupt(); + return flag; +} +void irq_restore(unsigned long flag) +{ + write_sysreg(DAIF, flag); +} + +void default_handler() +{ + unsigned long spsr = read_sysreg(spsr_el1); + unsigned long elr = read_sysreg(elr_el1); + unsigned long esr = read_sysreg(esr_el1); + uart_printf("spsr_el1: %x\n", spsr); + uart_printf("elr_el1: %x\n", elr); + uart_printf("esr_el1: %x\n\n", esr); +} + +void lower_irq_handler() +{ + unsigned long current_time = get_current_time(); + uart_printf("After booting: %d seconds\n\n", current_time); + set_expired_time(2); +} + +void lower_sync_handler(TrapFrame *_regs) +{ + unsigned long esr = read_sysreg(esr_el1); // cause of that exception + unsigned int ec = ESR_ELx_EC(esr); + switch (ec) + { + case ESR_ELx_EC_SVC64: + enable_interrupt(); + syscall_handler(_regs); + disable_interrupt(); + break; + case ESR_ELx_EC_DABT_LOW: + uart_send_string("in Data Abort\n"); + break; + case ESR_ELx_EC_IABT_LOW: + uart_send_string("in Instruction Abort\n"); + break; + default: + return; + } +} + +void irq_handler() +{ + unsigned int irq_is_pending = (*IRQ_PENDING_1 & AUX_IRQ); + unsigned int uart = (*AUX_MU_IIR_REG & 0x1) == 0; + unsigned int core_timer = (*CORE0_INTERRUPT_SOURCE & 0x2); + if (irq_is_pending && uart) + { + uart_handler(); + } + else if (core_timer) + { + timer_handler(); + } +} + +void curr_sync_handler() +{ + uart_send_string("!!! in current sync handler !!!\n"); + return; +} + +void curr_fiq_handler() +{ + uart_send_string("!!! in current fiq handler !!!\n"); + return; +} + +void curr_serr_handler() +{ + uart_send_string("!!! in current serr handler !!!\n"); + return; +} diff --git a/lab5/kernel/exception_c.o b/lab5/kernel/exception_c.o new file mode 100644 index 0000000000000000000000000000000000000000..bd836a7f402a008571a8adb6c7fd9627d67e5b84 GIT binary patch literal 9712 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 PKhH1QXOxwNhpzuWq-|R! literal 0 HcmV?d00001 diff --git a/lab5/kernel/exception_s.o b/lab5/kernel/exception_s.o new file mode 100644 index 0000000000000000000000000000000000000000..ae92e084f40b27474e16e0111c48558d4460f3fe GIT binary patch literal 10160 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 M^S@p2CDHc(KR)CR4FCWD literal 0 HcmV?d00001 diff --git a/lab5/kernel/start.o b/lab5/kernel/start.o new file mode 100644 index 0000000000000000000000000000000000000000..3b475cc18bf4db91b426214dd8fc977dfd081583 GIT binary patch literal 2936 zcmb_d%}*0i5TEUW0hLld1e63@ii(NZLJbKfYS#FLi4hXS5EHX(?ed}hAlsEx4{G8+ zKnMpe-aQ+PSC1y1`A0lyJm}2s%<}rWy*bI-nfIIDyqVq3o4&jI@LtL=K*WHraJ&-~ z;Ma*`+YU_|24NrujTEeA0e&CC{L%h|z4sX45S_!g_SXzpg>Pd=xXGNs^(8g@gYduR zi_fH)hw50KpxF&QV4?0Zj6dl!Z3yt$B;ik~;4|ieR2K2_Rkz78P%jfgC$y^Rs zKGlt(h0S`^D>N%Xab~8lxP0e9q2iY2;HBr+yb3e|*AJ{ltf#^{j2_C?@?DlBf9QE{ z3_xadz!>Z|)8pw2>7j0RUqKz!6CM!nga2W+DqeHRxAFX6>EoY0?)p;ehlWDeA z9@9*&EC$#x!PKE}Z$eia9(|K`JVLr)Op7=b?z_UqP+b|uud5*1BaGV`PFoXt6HvmV zEV|PKrHK`%iG7wNCZv;KJpXhXeio5T!uQFBc-)b3+~p9Dx3O`p1OA``zSsd@>3~1$ zfWuT1s%|6jeAskr8{wk}Q)O_%Rs^RUl$`CrhjqVRb-YT^3F@e30hhDmJrC->Q*s*~ z@=J{dI37K#UiFRV*SV>ks=HOg^r1*!jAH{03W%ES8_6KzG(1G6*&rNeNGvmK(K%7C zM1b52!bf8^fXz0IlH=(Gu%O^W3V)LA6!QBN{Gx_S4yi}@6U>{__!57EajHkXMbeRU zj@r#q1L0~H%Dd?2oKy0u-7Iy{IfVB!Pkmp)rB1my#6QVgQqjGok=$B8SdG`!z%8K; z{77$#6?n}6tg;)pU{RY`zE^QALM@)c5mNR_uQr^@R?S0pY-2BIS@6X$|34RG3#L?rWk0nmD zo_`h{gvswJJc(ZtfVEx^{jX8K+UytAa0QD6?5-<1uHez~B6mmchl&6u3pE~y@ zdXn;I`H#2Bk(8g_QO{3vlg^a;ie@N3SzD|{Nq*5~bcih+(pd(lRS<2R>mZg?{{h#( z%kfk{{mbd~ZzHCkNg)dis 0: + kernel_size -= ser.write(image.read(1)) + ser.read_until(b".") + print(ser.read_until(b"$ ").decode(), end="") + return + +if __name__ == "__main__": + ser = serial.Serial("/dev/ttyUSB0", BAUD_RATE, timeout=5) + send_img(ser,"../build/kernel8.img") + + + diff --git a/lab5/loadImg/loadImg.sh b/lab5/loadImg/loadImg.sh new file mode 100644 index 000000000..171507561 --- /dev/null +++ b/lab5/loadImg/loadImg.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +sudo chmod 666 /dev/ttyUSB0 +source ../.env/bin/activate +python3 ./loadImg.py \ No newline at end of file diff --git a/lab5/rd.o b/lab5/rd.o new file mode 100644 index 0000000000000000000000000000000000000000..2845a800f54eba31cd1dcc36bc3f0053614efdeb GIT binary patch literal 8328 zcmeHMU2GKB6+W}OHpCGB5KBQg!n6Dc0+g)(uuYMewGAN+3C?<>sESg1jkjS{V|(ol zn3&d!cxWp8;E9nEDFP*F9%4!rtExm+ic&YqL#tS76KJ2>X4a6TY9p0E+A^x0>38nT z?2c#GYf>ps-D}O>d(U_N?zv}X?ir6CIDF6}Nn|&Pu26PnQ;81MX2*&cDpW!~3N+)d zE)b}1Z*6XB2%t6A9qiyf&~Tt-Ne`wydm36hnw!DDq?vq>SVGNC>h0m~rS_Vb-cr}r zDDYf+b$fucH3dz70`<1tmF$`NpfquE5Nkaa?e8BflewK79PaNkhhpyMRt6qN90E<2 zU(3d!Zb=+EGRs@Zub@~bex4hN4%hFF9e6nIOBsx!KiJJo&Q z5jgEqTQTkc4^c9-IQHI~v)=AM8tu}D@JCPAkUoDu>DTWg{YC}ppR6JM(^aJZwN}x! z8bwdvujuplDf;yaMZd8|(LY(G=*Yio+BVX)ZHf*(D(hPu`;}N{Df}wI<-_I0<-uk8 zn*8XxVZ5|B_G@9^j*AAHY1q`D+buiqrAukpm7(JrWNT&bA8h}>j=Tc-_jBY6`}-EA`qn9zS7_s4@KFTn@R z$|oC3Zl|#E6s0Qp9(hVhX!MkDf_Y@3H5s~F=Q|XiwtN#d zZczM@MML;1<}*_KjE%cxC!~1LN8!i@CDr3m^!w zH&Chf{ih3FjYrU+vVv2pH2`XNR4KS1kn&$fy+TK?SQjNhab zPnUnQJ{etzF?_*Z#{b5#!C3Rs2g2Vj`0k@B4Lt1c?Bl2{vt)5-lEyU;Vymlvz zWfV^`q#c3IBgs_yEUEjC$t^6aedhgzHaBq#ae2kF&^9G6j8C-@>>$7B%O71O@|>eP z<5xF9Zi_ha@x(WE$DhPk=7?=EuB!ILNVblwxnvnL!sLQH8b z;`%Xi@MAm=wop9AIZ&DmdEg(RckV+PJbZ8F+Y4IgFmpUl+%GR6?(TRhE5sAFc^{;^ zjAxBAo^!a*OTVFbV(+xgW^TP^zx$P4D(~q%@F5LM=6jj>Diqy=@q7j8emrl*y$)PF zi;!EdAun(Ss^(`e$D4bWv7gszJV!Hf{7iK}vslM9#1=Bh)z&n6oJ;UtrVnnfI(Wx? z|6dXB|IC@90cVP4oGHGIGsS+KDcVW@>|yxY?lFDlp3e|xB~{yrz9hL$dzw;4H>Kv= zNxkls)E=KQt@voV#}`B|O>3ZwGXc&eY=7u0erNsGI#0ZnwLge6%?RwDg#9ttABX+3 zu>WJW?=$Uk&vx6rs(1#K!v0a%f7Y_UIoEy~_O+i%@IktSvzFco``YjD3<7PR7%Qp8 zu@5bO%y%vk&EQhcc#|RQOUjjj^X&uA_4hwWgmfL%_E<>_6eZ;BoNo0skPp?bhTW>_A)Se!7!45fK5sl)?KXno+-?+odcc(K55~e3!5(bd$Ty+ zXLK`*i`ZGPvo33H5_R3(*Nb&_VYX6TmZ=v92cqz?POg_5${OV+c~4oh+#cS73(m^Hp52)cB@bwR+p{A z?xr646Y2)*+%M`1``mBWL!SfhG|%2k>Y*(K>V+ZjHv(5oxxDpIxBxx_xdiY+_0S8z z3)Mq!6wqIZn&JHd@&Vu)@a5{APT)6yFIVpj0bl*^{PoTRu(u1;J6sQ~UtGT4;dd}Az literal 0 HcmV?d00001 diff --git a/lab5/requirements.txt b/lab5/requirements.txt new file mode 100644 index 000000000..4d1aaa2b8 --- /dev/null +++ b/lab5/requirements.txt @@ -0,0 +1 @@ +pyserial==3.5 \ No newline at end of file diff --git a/lab5/src/_cpio.c b/lab5/src/_cpio.c new file mode 100644 index 000000000..bb0b05af7 --- /dev/null +++ b/lab5/src/_cpio.c @@ -0,0 +1,119 @@ +#include "_cpio.h" +#include "utils_c.h" +#include "dtb.h" +#include "mini_uart.h" +#include "timer.h" +#include "mm.h" + +#define KSTACK_SIZE 0x2000 +#define USTACK_SIZE 0x2000 + +unsigned int hex2dec(char *s) +{ + unsigned int r = 0; + for (int i = 0; i < 8; ++i) + { + if (s[i] >= '0' && s[i] <= '9') + { + r = r * 16 + s[i] - '0'; + } + else + { + r = r * 16 + s[i] - 'A' + 10; + } + } + return r; +} + +char *findFile(const char *name) +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + if ((utils_str_compare((char *)(addr + sizeof(cpio_header)), name) == 0)) + { + return addr; + } + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + addr += (headerPathname_size + file_size); + } + return 0; +} +void cpio_ls() +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_send_string(addr + sizeof(cpio_header)); // print the file name + uart_send_string("\n"); + + addr += (headerPathname_size + file_size); + } +} + +void cpio_cat(const char *filename) +{ + char *target = findFile(filename); + if (target) + { + cpio_header *header = (cpio_header *)target; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + char *file_content = target + headerPathname_size; + for (unsigned int i = 0; i < file_size; i++) + { + uart_send(file_content[i]); // print the file content + } + uart_send_string("\n"); + } + else + { + uart_send_string("Not found the file\n"); + } +} + +size_t cpio_load_program(const char *filename, void **target_addr) +{ + char *prog_addr = findFile(filename); + if (prog_addr) + { + cpio_header *header = (cpio_header *)prog_addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_printf("load the %s\n",prog_addr + sizeof(cpio_header)); + + char *file_content = prog_addr + headerPathname_size; + *target_addr = kcalloc(file_size); + memcpy(*target_addr, file_content, file_size); + return file_size; + } + else + { + uart_send_string("Not found the program\n"); + return -1; + } +} diff --git a/lab5/src/_cpio.o b/lab5/src/_cpio.o new file mode 100644 index 0000000000000000000000000000000000000000..fcf10e186825d3bb0b7518c78aae50860f78feca GIT binary patch literal 10536 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 0) + send_sapce(space); + + uart_send_string("}\n"); + break; + + case FDT_NOP: + break; + + case FDT_PROP: + send_sapce(space); + uart_send_string(name); + break; + + case FDT_END: + break; + } +} + +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size) +{ + if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-start")) + { + initramfs_start = (char *)(uintptr_t)get_le2be_uint(data); + } + else if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-end")) + { + initramfs_end = (char *)(uintptr_t)get_le2be_uint(data); + } +} + +uintptr_t dtb_end,dtb_start; + +int fdt_traverse(fdt_callback cb, void *_dtb) +{ + dtb_start = (uintptr_t)_dtb; + // uart_send_string("\ndtb loading at:"); + // uart_hex(dtb_start); + // uart_send('\n'); + fdt_header *header = (fdt_header *)dtb_start; + + if (get_le2be_uint(&(header->magic)) != 0xd00dfeed) + { + uart_printf("header magic ==%x != 0xd00dfeed\n",get_le2be_uint(&(header->magic))); + return -1; + } + uint32_t totalsize = get_le2be_uint(&(header->totalsize)); + uintptr_t struct_ptr = dtb_start + get_le2be_uint(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_start + get_le2be_uint(&(header->off_dt_strings)); + parse_struct(cb, struct_ptr, strings_ptr, totalsize); + + dtb_end = dtb_start + get_le2be_uint(&(header->totalsize)); + return 0; +} diff --git a/lab5/src/dtb.o b/lab5/src/dtb.o new file mode 100644 index 0000000000000000000000000000000000000000..e2978fb21077b173c6ad9f04471b583bdb5b6d85 GIT binary patch literal 11984 zcmbVSeQaFEao=~xC67FQQxv~s^HHKcD;`Njmg$(3PL>>5A66M#4xB{6>3H{eWOckd z-Mv#NOOa(H4wTqIMSy5rRC1KqL7XCOWgvB}R%w~k35>#Sm7pJEJz_&BMnVp%P{e18E?4w6M7H}NF#SwoZ${eFYOl~dHQAI|@TG1)) zd|v!`xlXJs*F{&BTcB=TJ2m3tw?Nh} z#HoQhcaHVD!Jp#a?Xy34O}GCu-M&k#-0Bc3KZm}2fboHkTOH9ASBMvuH;a{Nu)Pet zvU>pJNVkGtXtR7EdcA*8oI24Ujxiky6WuCKErrVTW31CCPPsLN1AVcc=o)eAsvtT9 zIstL)QS=QyFrHs@MOT92!V>{;;U^cwp7%JW=Kxc&L7q!-Lu_Nz)@Z~3 zU-zuW{|V#R6IJ7jxq)&0eT)I^f3Pol{pZLBq3(952Ly zPBRT-v{Xwt(BG*en#T+EVZ4@LymqPh%JUHVPjixTLAfpCVzErCIorlOtjX)^?_m$; zx2elCtV1>D{{ZHai2-f+5{sB?Th4O|*AuRl0M&Zk{N?|hTgcBXNBf2NVU6f@qt+nc zYHz^xiE|a^3;PG%73laHm3y%9{VFzK+q$QX)p6d?a{$)$tuX$nSk!o+KlTmzT7f+T z{&cLkUtN9wYfoHt{xlDB>!gc54OzJz=JP`P7K|I^uqS|Qarr@*XUMynM||uA)9iKzcS) zoZmj1nf3F@p@JXJ`&w}o?q!nHT+Dd!q?dQ+;;Gq$J2A0w-gVu933p^ZIWm%*_Pk_+ z_yNo#DI8d}Lg2g>_u<1VZ^|+k)QU|JfP#TK6a;H@71EUh>mFsQQG1P?&GuvKGpXa)AGG8q^WhV6{3bQ#mAP~w$?F7q(VBrjF1*0 zS)<5KBtwc^i)5oByO7j|x{+L?&>kea71@jAIz{#&=_+y^l7l+J+WUexfK$=d_P0(# z7wi9*F8m-RL6O1%JY6lxVU( zhzyqcOJJv|&H#Q7fgS^R27q&619%>Rjxx}IhUz+-_d?YLdr1J@b?X@z3M+>@5LW%b z2Z`1+V1FJ*5fZAiB;Ja&dlD_Vx)T>e+k3MZz-`TqTY z1s0xGlJi?X3(~;Cq?$cnXhW^Q!o1>MXjTy{_=e+#72*W*R+ufQ_mYxn_!fRx*49CL*TDU6mqtNOv4(Axze&<{s1BC$!!DDk9wZ4jM$~tP+%dal*fomgNn*-FWZa~;ao0aycyBkNof#D$7xYh zh}AEa)R#~_Ct5aAW|W`yUW8%DTk~E)bnuXix(BeGBSoEY&^dk%Jt_c+ir48es~1=mQ5D&T?I%{^^SdtJ2qoKkPvq#|!# zr6bXtsnrs8kcAx#0$Xjpt1|KwI z>L+AV=!=MUN6@^HzFS#mRllnQ$)6m%dug(H6k}FS`N!?pOSrGE+U%_>0|{0Fk<=^B8vWO zx)3Y)dE7)!d-=j_HY3vUf*(s{=W;PdlKxZ-uP`wnL}4bI_g%b06lS0CV!p`bfl;DZ ztO(>sb^z#S{dgJ`L_9s4%EXE}k%`ZF+39Hkf3Z1lE|xExo{Q(oF({w$yeH5|&d-CD zl;_9N-i|3x85Zi66`z|fsAwSUV#1GsrbuTqDOWu(E_9Iev0ES)Q`szZCs&+J#&R=f z3R)M{ra_1DfMg<`PEW-XCl&7J7nLSh*eF^r@ zsh z9n+|Cs-~Mp)dZau>dGw=#k@{`J~0f@MiOFpCOhX1&!_zzBO}AV`Q-kC!|C|c1J&R{ z9$FL&`QdmxpP1RTb4XqEhfM0TCdauP~yP8eIIqVJT+C!_(hrXX8wMsud!cU((&ZLqR#le&F%>}j@JP{qEL9d!y51_H7^H`{^R@V?t}74 z#G$CG&)(+AD-AE#2Z~w&<$RMCZCRzS@zuvPD+Gl)VVNz}K>@dk3MD9-Dxm0B4ewpDU}^T0MLPaA{i0Wf z6&2L4s}_p(OV`$t3?peX^2wQnYmdUY$6Rk9yp=34J_>xhF}@c`9wpr5QFIvo*aq@k zjst;q-X?&r_OrlO(m!1Vf0pdLN>>@R4gmWS;oRldfX8wf{wmr3L%=aVyiP-?4CM{@ zL)=9M3gb&aWBjjCBKhs@UBD~Zr;TYaDF)~1WU@ElGLMJ9bru^N@LgN)s;z$29iwy^ zC|?@TZrPJMVM|R)R|41&)tQgAJ{|DLE}haU0@~)GzgS+2?ET~_4zXG0L+Ys+l8v5~$p>NvxMHPHI%^%y2OIsHAi^qSE zaPAl5TL`!NwcW6TYmUo^VaLSB3_I%62Q`QqxS6;8hJDOG&%wtG`zC&*ik(Trjv3D} z!;XocsG^^&qMtMLF&@sFZ|Ix&JmGde&lz^icrF-rO#HWS39Q%7eVOT{C++3&lfd>oPS06bwD<%#5CO%{6V}8a+KW*rn zxKFqp&le2bjOUVJzmsfZwP@Hk@f(J|Yv?Z-`X>H%75#Ur=>LpxjNgp&!zwsmjd;8! zDW)2_8u55BuD?<1{dT<(|2opQ{cf*(#QK97PiCpF#NF> z3*(@V_Dc zO$+}t+5et}*AV_!7XB-W^QRUbCw|$&-zWZ;7Cuh)|I5P95wE@$0?qm4y|R(oF}{xU zyDXgjt+(*Q#1C2c^VF}0ES&T3sD-x>f7Zey6wene{AsekVBw2|U$*c!$j-Mcyh!|a zsm45+=impZ{kAH`n`z2JTWUSUD6g=l@@b@3wHB#~-oqlVt0th2z$C7kySexG^8(%+@ci`OljVDT3g9w))O7XB9D|6t)M;{VOUw^E$E zZa7YOB~v9#_Y=7n-Xx}ISw@1^4r-<$VE zM15$FOce?ulFw>JNt51GF$LdUrn8`<==juB-a8Fy*qESvJd=Vi?j{DGyFG3K{+L7< zKkkbN{Bkts!LJvQ4E)3pf!{FnPYz_nn~6>5;fEmV)&IY8p(zZ-U0+P2fMKzJ%A{qb zh4930Gl)gu&n(yIWz(et49{Zp6C$Noj0UaB|cJIYz7gOF)c?~nOK(*!H%;(Z$1+w=cTYJbye&-r8c zbs#F`Uu@ADmq-!EA5+5ZdHz=NjZH3M11S8Ra}Cf4+3j&oSwjSf5I5JVO8mX9N>4ji S7*nP8mni= literal 0 HcmV?d00001 diff --git a/lab5/src/exec.c b/lab5/src/exec.c new file mode 100644 index 000000000..6fbef01bf --- /dev/null +++ b/lab5/src/exec.c @@ -0,0 +1,75 @@ +#include "exec.h" +#include "_cpio.h" +#include "sche.h" +#include "mm.h" +#include "trap_frame.h" +#include "utils_c.h" +#include "current.h" +#include "thread.h" +#include "mini_uart.h" + +static void replace_user_context(void *prog, size_t data_size) +{ + struct task *_task = current; + + memset(_task->user_stack, 0, STACK_SIZE); + kfree(_task->user_prog); + _task->user_prog = prog; + _task->user_prog_size = data_size; + + TrapFrame *trapframe = (TrapFrame *)((char *)_task->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memset(trapframe, 0, sizeof(TrapFrame)); + + trapframe->sp = (unsigned long)_task->user_stack + STACK_SIZE - 0x10; +} + +void jump_user_prog(void *target_addr, char *kernel_sp, char *user_sp) +{ + asm volatile("mov x0, 0 \n"); + asm volatile("msr spsr_el1, x0 \n"); // daif=0 + asm volatile("msr elr_el1, %0 \n" ::"r"(target_addr)); + asm volatile("msr sp_el0, %0 \n" ::"r"(user_sp)); + if (kernel_sp) + { + asm volatile("mov sp, %0 \n" ::"r"(kernel_sp)); + } + asm volatile("eret \n"); +} + +static void init_user_prog() +{ + jump_user_prog(current->user_prog, 0, (char *)current->user_stack + STACK_SIZE - 0x10); +} + +int do_exec(const char *path, const char *argv[]) +{ + void *target_addr; + size_t data_size = cpio_load_program(path, &target_addr); + if (data_size == -1) + { + uart_send_string("!! do_exec fail !!\n"); + return -1; + } + + replace_user_context(target_addr, data_size); + jump_user_prog(current->user_prog, current->kernel_stack + STACK_SIZE - sizeof(TrapFrame), current->user_stack + STACK_SIZE - 0x10); + return 0; +} + +void exe_new_prog(char *filename) +{ + void *target_addr; + size_t data_size = cpio_load_program(filename, &target_addr); + if (data_size == -1) + { + uart_send_string("!! exe_new_prog fail !!\n"); + return; + } + struct task *prog = thread_create(init_user_prog); + prog->user_stack = kmalloc(STACK_SIZE); + memset(prog->user_stack, 0, STACK_SIZE); + + prog->user_prog = target_addr; + prog->user_prog_size = data_size; + return; +} diff --git a/lab5/src/exec.o b/lab5/src/exec.o new file mode 100644 index 0000000000000000000000000000000000000000..3c78725f33348224d484ffc105e25f6271631de3 GIT binary patch literal 9896 zcmbVSeQ;b=6+iF2ec4SnO*YviO`5dXV4(q;O;TD2v?&`}gxFFlE%M>VcDwtMtljLc zyKf=1h;=~i;1`)PW6^>ZM}&^U$oPeWI7J*sM;)OGe$0p|e&IjPAnKTLYCY%Pb9Og3 z>5Su@=G}9C_k7>`?z``8KXm=Bx7(Hl(k%EE)Hp!_2KsAsLXipRgbp~r9bP{2(&#Jm zL0Fg%CKiyNJMAQ2J$Lx|r_MPrH{SvaXTz}Y&-3R$GrtODRwWi-G_hdA17|EaatoSz zSYcZcXZmbQV!_&~WzU9@PH5WNgfg$)eU9x@Ffm86G`_Ev= zD2Mv@!a`rndF9;U7oViq&fgC&OI)vG+yF<;K%(oFdGs5j9`k^4?9q20z?=I4_Axy- z?|lAMvV}G{&+n={-@+W9#~h=W$8*?Q7zf2bvA&M+V6JE8o#-jbk@Vj}+vg5{PsMZY z@OQM0z1CAyqqCUX{EIM0d8pb@UHTB~!*~Ml%nKL~+Ia~7=Exq#-xdXEpYOrkQRXE2 z|18IHoMPd+ZNgX{UM9A)PWvf|4Q<`>*52`_&K>^#qS&Zj^IzncuukN+KBkjKOr01{ zeT?%xRObiOe5<@LR%;Y(VsEa8v$#eGS8ITCqBWrBP{-BZAIlVy-mI67O{TKBSbzTt zbO(Sqg2}vhcd}S2Ow|UTZ~vr+C15LiEde*1_aPDrkYpo`M4X1mbJ$zNIH5M8h3O_H1c76! z!;91C5ZxNF+(2U(Rg{+75G5MyauM8MbR5ZlwH4Fgh7=7JE)Gn-QE?#)+DW1ZH9Ck` ztFv@h*gru|W!%shxdMj+qj>4uju-bMIHco^HH1U62;o0~hLvqMQm>ij_Vq}h0~%>* zrAQ;3WJ7D{3yABXXoP5H+QXkh8k3}el=onRs`sj3fNTdt)~|3x&#t;!>T0X2!zwGC zXHZBLbUN4)I*wCm&yHLT!B$-Ydv@b61lx24kQsqsR51}`HbSsnF(+=w^pY61=GE57qhv-=^v_O#lSfDW<5Iixoq2fg_hRZN~11X4bEyk{z{+ z*$e~+!e2t>Aw6Cf>UbnbQ!U zWf36fVU&c>n&2m}E8v)`R)j(u!_6N-g#KI_h5$`W6H(#D&k;%&2xJH#bj8{brSY5$ zxkN#Lbd^@9?`0ZNwv(~suGQQ$^pchxuDYltkQGDW0j`Hq4R5BhRufps<>2bHt9zQNqxMy+p_i&9P0a-| z)`_(OH8G*`w?aMR$YZTZXeBt!*Mzr(uMST{M{$~M1VZ(Ivkt=HZDFSw*G3D3`$H4B z!?`X{*Wi+Nzpd46^c>t&XODnTXB~jMM$~ee!(r`!_R19lINpnn!*T1{Zi!`m_e6AS zH;p&d!Tk;EyEVG9)w;Mj8g}}6`dY2FU}P0Q^Cc>z77iD8w+M!dhFhan*sVEiTa+M{ zKf0&{2((+)M3j7Y^rOikG||~%tyj^k3Rv61VJub6URPa!;q~1VPNM5xCEdMvXd+ra zxH?`fjKKJySgfH34k=^3ajcwnyV%Q`+JJaCgm=x_utn-P#~Wz2@sGEBMbV}H8C(UC z7{!go#l1d@bilIy-MkVkY{=ms5`A@x4J})Jc8glsB%vMEDCPHmxwsZI>LAfbm)q0t zT4Mow#9h79Z5?*qxEmRxYiGaPGv;2k&5guecg($Xm)j9{x5wOQ+_i?Tb={r){X=eO z$Zg!_y2Gy3f34d-=Jv$gD`M_7G1rZ`*3?aI*PU+Y4iX`oBP=lxbBC0~{%CcQqOrLszzq#VKbGc}XAqRB6idlc`Lm1pCJK z?o8e`KCy3N_YF`id3QlE{Q;%#M09# zHZ!q%Vjon>UMY!>xO6dFNahNuj5>XlQZw3=wn6GjkWOYv3JVTSmOONaHdDD|x{&wD z;SIZQjcp&fDmF3_-xME?4bDt?d9Rep4VJvA@?asKy9cpc*7tMXpqI~NQ+ec52eM~wCOf`jM@~%`4D_fY-sV@@rvol_yf~A}; zl>FGDp}gm1k|nR4p7t`3N%<*VrfJM1=at}~SIT=iDzslp6(_O29!zF)UY-awskhv^ zdpAw$`ztfWx+?Mkiwlw8Y0O{@@8&&wuHON)U^#|N znU+a1U%@4%mx~l7snie7q;k1J8t}}63pbZ7*R3_crGFR3UCgD@p00|lwV~<4j5jo! z^EVC;58b?X$HY)Bbzn1;OX(qcxrnFX!V)mQ=GwsLFx}oNVl7W=KL69El{|Nrd8xOHyr-uK3wpIhjTZZrHy4n%Kat2P%2L z!uQGGNJX(D_ifx5AKr8+!?Xcni|7ulL$~0uZLQVQ)Tdt1PQtD%~5pw)yF??B5EJb}nk z>v%(40KW|O~=Q#4z@T1JKb{@X~ zE?dUBS!2^%cGofAF3Ht|7F{L1|tVO;zQ-p;t`x3|uYBH3T8&Q3kPj&ZWn%dt~8T!*VSE*{%c zhj-M;%T8dUou)cm-v0=vyX_esYvZ19x*w!QGN*#GShcovCg%{;&}DUY>UWEgI-LAI z!2Fd4&TRD!SmOK;`k}T{cX;I2@xPmK`p`&C@Py(3?%-bVTRGVM2A*O(XW(yRylmi) zu-`)lzMJ_E8~6y@p?!jy#PfH?PinY|Z(;sv1CKHPf`N;jUmCcqk8=ioH~a17JR}}j z_X7t0GRw>UDe@DHztfQa5##SO@E4gsXy6k6JqG?b$NfDXDuH=rOxVe8P36=fq$Fjw;K2%#&;QbfaAH1afwIn=e!|*G0*$G2JUb^4;r|{ z`G|o_oKGA0E{^jXj7vPg_zw;Fe=zGQaeGKuzq=Xcp?v50sZY*Kgx-k-wjLdY_;s_=B2-6!(IEn)yism-mK)2L1)+ ziw6D`<|Qt3UgWHZp9>eA$E41J%evji_5_#vNcKO$<$ip~ke7W!^h93vH;9+-nZd7X z*!v~jPYYG@a;dob@)xI1UJyS}E3$@fw=bl0dzSYP;iYGD z!m1DUWb^;kr}IA9G~J1Rc^?pm62I_tznd}9*k9P-Dc;XS-jt<%WV!mi!7oVz?2zh5 zd!YE2`n>}&(qxZK4fB~fAwTkiD^SsQxl>m{Yln0#Nc(-H*wJuoZ=(QT>o#d{!1drz0^!qlfVWlWJ$JW3Oe?Ue4S VS2KT#X*vDrm{vKhyXw`{|1a`fa}xjn literal 0 HcmV?d00001 diff --git a/lab5/src/fork.c b/lab5/src/fork.c new file mode 100644 index 000000000..666208ba2 --- /dev/null +++ b/lab5/src/fork.c @@ -0,0 +1,47 @@ +#include "fork.h" +#include "stddef.h" +#include "sche.h" +#include "thread.h" +#include "exception_c.h" +#include "exception_s.h" +#include "utils_c.h" +#include "current.h" +#include "mm.h" + +static struct task *fork_context(TrapFrame *_regs) +{ + struct task *child = kmalloc(sizeof(struct task)); + + unsigned long flags = disable_irq(); + *child = *current; // copy the current to child entirely + child->pid = task_count++; + irq_restore(flags); + + child->need_resched = 0; + + child->user_stack = kmalloc(STACK_SIZE); + memcpy(child->user_stack, current->user_stack, STACK_SIZE); + + child->kernel_stack = kmalloc(STACK_SIZE); + TrapFrame *trapframe = (TrapFrame *)((unsigned long)child->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memcpy(trapframe, _regs, sizeof(TrapFrame)); + + child->user_prog = kmalloc(current->user_prog_size); + memcpy(child->user_prog, current->user_prog, current->user_prog_size); + + trapframe->regs[30] = (unsigned long)child->user_prog + (_regs->regs[30] - (unsigned long)current->user_prog); // using x30 as link return register while function call on AArch64 + trapframe->sp = (unsigned long)child->user_stack + (_regs->sp - (unsigned long)current->user_stack); + trapframe->pc = (unsigned long)child->user_prog + (_regs->pc - (unsigned long)current->user_prog); + trapframe->regs[0] = 0; // child process : return 0 + + child->cpu_context.sp = (unsigned long)trapframe; + child->cpu_context.lr = (unsigned long)restore_regs_eret; + return child; +} + +size_t do_fork(TrapFrame *_regs) +{ + struct task *child = fork_context(_regs); + add_task(child); + return child->pid; +} diff --git a/lab5/src/fork.o b/lab5/src/fork.o new file mode 100644 index 0000000000000000000000000000000000000000..de3a36aee4200cddc5348b72b628bb5aa6934496 GIT binary patch literal 8680 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 GxBoX;6Wcui literal 0 HcmV?d00001 diff --git a/lab5/src/list.c b/lab5/src/list.c new file mode 100644 index 000000000..9d3ab1fe3 --- /dev/null +++ b/lab5/src/list.c @@ -0,0 +1,47 @@ +#include "list.h" + +void list_init(list *node) { + node->next = node; + node->prev = node; +} + +void insert_head(list *head, list *v) { + v->next = head->next; + v->prev = head; + head->next->prev = v; + head->next = v; +} + +void insert_tail(list *head, list *v) { + v->next = head; + v->prev = head->prev; + head->prev->next = v; + head->prev = v; +} + +list *remove_head(list *head) { + list *ptr; + ptr = head->next; + head->next = head->next->next; + head->next->prev = head; + + return ptr; +} + +list *remove_tail(list *head) { + list *ptr; + ptr = head->prev; + head->prev = head->prev->prev; + head->prev->next = head; + + return ptr; +} + +void unlink(list *node) { + list *next, *prev; + next = node->next; + prev = node->prev; + + next->prev = prev; + prev->next = next; +} \ No newline at end of file diff --git a/lab5/src/list.o b/lab5/src/list.o new file mode 100644 index 0000000000000000000000000000000000000000..9b4f46bd7f2fffe38a4c6fe5782e4738c9966fd1 GIT binary patch literal 5576 zcmbtYO>7%g5Ps|RCU%`4H>uKw6l|kFT2%j}3jIlO>XQBtQ7Gz<3S7e4-q=>1b+lf$ zX+eP0OA!Yei9-*SxD=_qAfZZd?F9*mBE$hy35h0`(kllJQ4eM2y_tCZ>RezX@63E} z{@(vfJ~?*sc*rmWlOetrZH-YOevG%}f)op4n-~^PXT`6py<&Z}x3InjKk#kKVX>Y_ zn!ka~$~|-bceY(Km5m_^>#HXD0GIyYgRum(tzjGKQij-@#$$iVZ-gl}#{->X$XY3O zN4%@;zF_{F(RxFf%PLAikc{!DDT1#(ow~Paq}OLpexWe zEX9?otR|+EWvL7)Wl31Kz)%*QK!~XwZ6EYmMoWxRw8)b0i6li+z9ZdzJ@y^x@ZHY7 zvIm2l^Boe5o446-a0i)2FN#4WE~$RYSwe@l*PrYa33x@=YXFT6Q}!OkJ@^4KZpz-7 zvJ0V=WkAM7EH)D}!2>4H9GFfShhhg~bHkw>Fz6ZM@F-)co{7<|#!zoz$CXiI7^bUV znuiXhB4~dg1`BFX#8QztXzZDySgG9{thXar@5Jcba4=j1JR&N4iqc1+Acn?OMO(HS zFAWUG%*0p%o#WeK#ZeDnkotxVb08L*j$s$D#{Lm3L#kNS0F@wtc5h%{aDe2{z}gE^ za1#XapFpv|c0cg2VLTb=7X}b$@B<+sXPZ4jMj|vQ5wuX}XUN(qqADdo+pKstZy9-O zV#XTITm6}=70p{C8Gs4x&#MM2nr-8W87rEzM)KB9uuM`@U(Pa8RwB1)(`e4xlFM81 z8O#_mq27AKtt90KH*d4r@cd-UZPqHTQ%)k}Ig5>p&b)8e>Y}5e<~AMApRYQ0S&%G^ zBp@Spn7fU#0|Dwa_d+{PscL&del|)t@%Fjo?BxFBWUGxuC%att_vUihQ)iCOW$SkF)y-gV zgpn@QTQHIoAjqmhoS2=RPVPEaY`K1mMle0ulIrBgd-rB?Q@aUgMghF!E4fJo!e!IYXRvxh?=3C;TJe zNQ~z|M*I5`ZQtat5gwOJek1vbya$rwxb{^3ICbwSaVJ6R_jblFq zdE^U$>XUB}kP*js(hA{2#1Rk9(ujt0+jE5D9T8l8uLSIat6(yKW8N0&2Q-{#{IG_n zNk6XP=ShD{!|~;VbXKvA{=Q3iQNyp1UeoZaq%UbWsp67`pQQM_PI#POC;T(b{siG) zYIu?GuQiIu>E99OdEs^Tvu4lz{6oXJp2r%_^*qt=6zO5Am-F(vA0s>j9OwNs z+3(lz3h4#n9EbPSdCi{VG&P*p$FdfO=i>{_p5xrn@M)^^8!Zl>3qNS~9Ot2i?;-t> z7Kg$M{6hwb$A{;IPh7-VM!PtEfOveACd7**pgrzU)?e1}gQN%dDca`=pVI7)k)feeVL_e2bA$6T&g0B^80UE`YjN(A&h2c^>yY;s6D)3-hXh55k?P3vML&0X-v)zi*=>i9{ z!!D45MTF<2UTQ2ZI`Fp2xbULOz>`tE@F=iTonP?mMTa{2KiL@gKL$VvFkw`&58mkRIb91$2)J z+X^z;VXa8`K0w0#(k=fg`SogznkwH9I)-uoqJhSDMUZscH=(gx{kQ1?Wq+(6?|;4i zGGKa4fW&tBe-0sjK_x)C?L4$~%m0A#-zHzoABCTuAMaC)$#sG#=@I4UbDeR{&m8}U z(#`)pdhEQOrI`RAMX-z9%Oe>e>LF~{?SWwt^7ko7R>_~okK^$8 zv3?7LZsY$cJ%O*2A&x&n?9b~L>(O(g%QZ5LQ{xa|aro)}IH&sF1xVbW{c{SH0O|e5 Ry1MztF&WTZ#WudW|G#DFW>)|J literal 0 HcmV?d00001 diff --git a/lab5/src/mailbox.c b/lab5/src/mailbox.c new file mode 100644 index 000000000..83bbd7e5c --- /dev/null +++ b/lab5/src/mailbox.c @@ -0,0 +1,65 @@ +#include "peripheral/mailbox.h" +#include "utils_c.h" +#include "mini_uart.h" + +unsigned int __attribute__((aligned(16))) mailbox[8]; + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox) +{ + unsigned int readChannel = (((unsigned int)((unsigned long)_mailbox) & ~0xF) | (channel & 0xF)); + while (*MAILBOX_STATUS & MAILBOX_FULL) + { + } + *MAILBOX_WRITE = readChannel; + while (1) + { + while (*MAILBOX_STATUS & MAILBOX_EMPTY) + { + } + if (readChannel == *MAILBOX_READ) + { + return _mailbox[1] == MAILBOX_RESPONSE; + } + } + return 0; +} + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + // printf("0x%x\n", mailbox[5]); // it should be 0xa020d3 for rpi3 b+ + uart_hex(mailbox[5]); + uart_send_string("\n"); + return mailbox[5]; +} + + +void get_arm_memory() +{ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + uart_send_string("Arm base address: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("Arm memory size: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); +} diff --git a/lab5/src/mailbox.o b/lab5/src/mailbox.o new file mode 100644 index 0000000000000000000000000000000000000000..75eb9d551369bd9a56cfae5c970a445171444231 GIT binary patch literal 6952 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 IOG7jMKT|$!?*IS* literal 0 HcmV?d00001 diff --git a/lab5/src/memzero.o b/lab5/src/memzero.o new file mode 100644 index 0000000000000000000000000000000000000000..701048ad2f6f73558c5b18bd8e03b78499aad454 GIT binary patch literal 2248 zcmbtW&1(};5TBQAv{joAEwotBq_o9@?8Zu^7a@utC{o2L9>Z?CwuOA)W-ZZ+UKEc# zdeW=^fOzfEi&y^-4?@9{He@>K|v2cXk08M$@o=5yP9}O zKLaz_(p<_6EJs8+GHgR?B<1b?ctj^@DX7M%&N}d#}T2;0~3wjAhGUrm014 zh#Dax=B+{I^L2B!>QojhE0uF)Spv9>X38U}k}c#aWGE07Z%kzZ-@BVn8#lHZYwpzz zl{(RM^5nBP2b|2-h6Czwcp)7>w+UH_gXdEu4xB22v8&o372&{1<&8}TX2*`Q95}7K z)FkG$qIs7`aLcebINdkG?O*64#EOJs zwa~jmHUBmL8s^$HslN2zBu9xIdj;2u=0D>3N1RLZ)BUpNzlj*tY~e@CCw4pyqAmSJ zKU0_v{lU&94Hm>cMy!bc25;yg=M#V8Zu8$pOt^4pqJFb8r$Mys*n=k literal 0 HcmV?d00001 diff --git a/lab5/src/memzero.s b/lab5/src/memzero.s new file mode 100644 index 000000000..c3720caf7 --- /dev/null +++ b/lab5/src/memzero.s @@ -0,0 +1,7 @@ +.globl memzero +memzero: + str xzr, [x20], #8 + subs x21, x21, #8 + b.gt memzero + ret + \ No newline at end of file diff --git a/lab5/src/mini_uart.c b/lab5/src/mini_uart.c new file mode 100644 index 000000000..0d0d73605 --- /dev/null +++ b/lab5/src/mini_uart.c @@ -0,0 +1,258 @@ +#include "peripheral/mini_uart.h" +#include "peripheral/gpio.h" +#include "sprintf.h" +#include "utils_c.h" +#include +#include +#include "mini_uart.h" + +#define ENABLE_RECEIVE_INTERRUPTS_BIT (1 << 0) +#define ENABLE_TRANSMIT_INTERRUPTS_BIT (1 << 1) +#define AUX_INT_BIT (1 << 29) + +#define BUFFER_MAX_SIZE 256u + +char read_buf[BUFFER_MAX_SIZE]; +char write_buf[BUFFER_MAX_SIZE]; +int read_buf_start, read_buf_end; +int write_buf_start, write_buf_end; + + +void enable_uart_interrupt() { *ENB_IRQS1 = AUX_IRQ; } + +void disable_uart_interrupt() { *DISABLE_IRQS1 = AUX_IRQ; } + +void set_transmit_interrupt() { *AUX_MU_IER_REG |= 0x2; } + +void clear_transmit_interrupt() { *AUX_MU_IER_REG &= ~(0x2); } + +void uart_init() +{ + unsigned int selector; + + selector = *GPFSEL1; + selector &= ~(7u << 12); // clean gpio14 + selector |= 2u << 12; // set alt5 for gpio14 + selector &= ~(7u << 15); // clean gpio15 + selector |= 2u << 15; // set alt5 for gpio 15 + *GPFSEL1 = selector; + + *GPPUD = 0; // set the required control signal (i.e. Pull-up or Pull-Down ) + delay(150u); // provides the required set-up time for the control signal + *GPPUDCLK0 = (1u << 14) | (1u << 15); + delay(150u); + *GPPUDCLK0 = 0u; + *AUX_ENABLE = 1u; // Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0u; // Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 1u; // Enable receive + *AUX_MU_LCR_REG = 3u; // Enable 8 bit mode + *AUX_MU_MCR_REG = 0u; // Set RTS line to be always high + *AUX_MU_BAUD_REG = 270u; // Set baud rate to 115200 + *AUX_MU_IIR_REG = 6; + + *AUX_MU_CNTL_REG = 3; // Finally, enable transmitter and receiver + + read_buf_start = read_buf_end = 0; + write_buf_start = write_buf_end = 0; + // enable_uart_interrupt(); +} + +void uart_send(const char c) +{ + /* + bit_5 == 1 -> writable + 0x20 = 0000 0000 0010 0000 + ref BCM2837-ARM-Peripherals p5 + */ + if (c == '\n') + { + uart_send('\r'); + } + while (!(*(AUX_MU_LSR_REG)&0x20)) + { + } + *AUX_MU_IO_REG = c; +} +char uart_recv() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp == '\r' ? '\n' : temp; +} + +char uart_recv_raw() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp; +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +void uart_send_uint(unsigned int num, int newline) +{ + char str[256]; + utils_uint2str_dec(num, str); + uart_send_string(str); + if (newline) + { + uart_send_string("\n"); + } +} + +void uart_hex(unsigned int d) +{ + unsigned int n; + int c; + uart_send_string("0x"); + for (c = 28; c >= 0; c -= 4) + { + n = (d >> c) & 0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n += n > 9 ? 0x57 : 0x30; + uart_send(n); + } +} +void uart_dec(unsigned int num) +{ + if (num == 0) + uart_send('0'); + else + { + if (num >= 10) + uart_dec(num / 10); + uart_send(num % 10 + '0'); + } +} + +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +/* + async part +*/ + +void uart_handler() +{ + disable_uart_interrupt(); + int RX = (*AUX_MU_IIR_REG & 0x4); + int TX = (*AUX_MU_IIR_REG & 0x2); + if (RX) + { + char c = (char)(*AUX_MU_IO_REG); + read_buf[read_buf_end++] = c; + if (read_buf_end == BUFFER_MAX_SIZE) + read_buf_end = 0; + } + else if (TX) + { + while (*AUX_MU_LSR_REG & 0x20) + { + if (write_buf_start == write_buf_end) + { + clear_transmit_interrupt(); + break; + } + char c = write_buf[write_buf_start++]; + *AUX_MU_IO_REG = c; + if (write_buf_start == BUFFER_MAX_SIZE) + write_buf_start = 0; + } + } + enable_uart_interrupt(); +} + +char uart_async_recv() +{ + // wait until there are new data + while (read_buf_start == read_buf_end) + { + asm volatile("nop"); + } + char c = read_buf[read_buf_start++]; + if (read_buf_start == BUFFER_MAX_SIZE) + read_buf_start = 0; + return c == '\r' ? '\n' : c; +} + +void uart_async_send_string(char *str) +{ + + for (int i = 0; str[i]; i++) + { + if (str[i] == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + continue; + } + write_buf[write_buf_end++] = str[i]; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + } + set_transmit_interrupt(); +} + +void uart_async_send(char c) +{ + if (c == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + set_transmit_interrupt(); + return; + } + write_buf[write_buf_end++] = c; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + set_transmit_interrupt(); +} + +void test_uart_async() +{ + enable_uart_interrupt(); + delay(15000); + char buffer[BUFFER_MAX_SIZE]; + size_t index = 0; + while (1) + { + buffer[index] = uart_async_recv(); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + uart_async_send_string(buffer); + disable_uart_interrupt(); +} diff --git a/lab5/src/mini_uart.o b/lab5/src/mini_uart.o new file mode 100644 index 0000000000000000000000000000000000000000..f4471833b48853fb2ef1bc91dfd06c1a72e302b6 GIT binary patch literal 15528 zcmcgze{kHzb>HuuR!BPimTgIvknUswCbmwJG1w+2`}`w-LHvj@U>7s;Njm))PA75q zl`XJrA5A8>DQT?YAutghw_yfDot9>3V@;im1DR<$LkD6AB~!O^GNkDrbeg8LwI+7d z_jcdATdnU)()`h7e7pPE&%XEe?b{!>I*xv!_YR-q2u_apuE^II6=L;D<7ew}zUpnIDUC?i?HR%7zd4Jyrne85U$yYA~KSq9ZE<@#zXkE9YZz0Z9ORdSd zdg%MFUiFKajL2LNAWwk2Y^#8O(K#_uQ=2P`x^=noM5TdOE1dh!LqC+CsnzmYp?tnJ zvkQiLLey!@5ih7Q+BkAELXRsXGKwS0bzQaP#;MyfrMfM~+_F4ZROs>#LL`T{KVUA& z&Gi-HIM_IYdLUP2^liSJ$3KgM^LF*no2PN^*tglEVpH~LbW`hU@kC6B-KQMw59DUZ zX7sxdO|>BViT#UXwa71#7tbGZd{ZvoxwK`!XVvQLO*QLq8z z%%GjWi#+a|8)KDNCO>i$T6_^@Vj1na`>Hv% zx0c2LttsR^jrN0Vl(Q1;0b5XasUvoyU8i1raaZQWxm0la)HlVI{qKos|AWZAWVA)8 z&4IS8-}#(yTY%#P#8m5pTZOnMh<2VAHEi!vfByyhXkmU_EL=*9g^v!3g^v%3g`XW2 z3;*&ZvGDU}#6os^(MLbo9APk487OjRZHE{8mx) zM5s6)U!Y^I1LufhFDk|ERTvuu_6XF!MTo~^IzCT8-y9FyKFgNi$o`GlKCqqFeV<ZPD8wIvZEEk_igW#2+V-cgzu9y9S^nQf{02ie#0==p z$C4jn34C~b8^qFf@O>NDWyX`Oub?k*-vBv!->}9A@x1l2Id|3`VxA-a559o0pIGsK zh~Y~|3$G_TW>GGmWmgaBy&p00;4^AZT>Lto9pZ!!_OR^NqYLu`uy$dcav9?e&(c%4 zS3^7ab0!OY{&R7$9^;!a?6(E`L9XP3OuZ)bSpk?R!w*PZQ{pixgcME*R%`I%di*ex zTbi%=N`NlZVIYb=sNV`@U&(a{`HFO=3BKwg1!}oIpKf#DtOTY{$*3!mqe)jRD=B{l zLCsu_W$?ZbK`AakrtHcfkSmqsO4X|LBs4bUO3k7IWn6-Pm1y1~j1E#&F-j}-V;PeI zs|$fO5(Qe!n&kz++Ct3Q6-$}*sIB<=%DW)Tz`7~^eXOgG=dh^?KYZ2CV-s>zlScjW z6-M=p{Q|j|rgbKq*?C|n=YCp-1N6^aKCG($Remc}eKS)KCXnXw1JgyFLC-QD&`1j!I+%c2a%X|Q{tUfXtr-=q*}GWM-h`o#f3^7w{Hea3t;n`D3;SK z6`a`&2y+I+-<7de6^bu2agYVh{tps&?Gdk(l3Zu^9&wr~Q?Oy_G)Vb}TJE1!YPkpC zmO|+m<)C%0R<|A$q7hN&gqjv2s4Y*yvyVWW_=m<^aUzIA_RpL?veFq$yW;sW)im?r zk?WB8Vm;2Gf9C8FClzL45jF)9cLv~$@MSoAtMvww`5l9OZNSTpuT z|EUQ(L=3~I_mDa$4iPcoB*kH+5M~($cZ40K1x&DjUMe`VEg)IxnrPE@UOC)^jn2dx z^fAVcgY%rCP|6(9qDDx9*g*wnb|;EL?#L=EVw{!#5wxnQ|2_0FrwA3C*~36oUK`9! zzM}V<^apbEGfaOtM+Za*7AW@Qs6T-Q2<1o?aKufE_-D{D>-gjsLf5e z0mZfFWGY-mNda6fYQ#AXoms_)d$vw_TsZ56zvT9i^ZCH0z|J}!wD{UZAh0>$uLP^5 z-B=WMwlw-Hb%#*#O^r29?RC+H=|-mxb}f)aO(1JaBT6flVkb0Rx1~EwHp{XC3!KQ_8DEAXI{yD;#HM9YU2Mu%r{_w2C?gV9Yp# zh%&x9;Gh6FW@?-pD(eFN)}~ejs==GJD{x@Qhj9r}M;6v zwsy&oBfG-#^QzqK$W5*cb;(;Cx!ILYx2*1#mEq2wo*pTCpd@9NEQilfr>usoQ)eMr zgB7^~TjX+8&VPm!-l^~|EU)U4%OdiIVYxgaosliFWScDAECXG#63%`nC|fa$$Z}ni z-Evu2I-S6{u`r{iTb4y+FogW#2z>g04_Q%hsQWi`Di28qNj<7QbIku4$F=E{|OWqCxd z?35L~vTCyowaMxsS<@Agoo%w#l@)tsb68DFM1A@XfJY*-Iw+;T0^AYWA_FkOHrdo7 zZ}^HVb7jL`SrU;Ao$~q~F!oxn%u+SCbg2W~)98juu`%Q3qfOoA9flfXB@&9dEPBCef^U|eP}3jSW05Qt{YePL84tj!%Le zxdt)mjwaG-jO*aw?Hh~_h{UVg6UvvMEj5}P&iBMY z#8SiQ{7A%|_dOKc-n}8%-5p*Z?h1B{4abx5R4mbviVvqd#*>LB0ZWX!ZX(_RqaKYV zp&siW?MY1Bwm#S~9PAhxO2uIsz`>vks>$&VHOh{O)VQl`1W--zNNPMeKAG;AOdf=J z=y1_#X=v2+fkZ4l!ktFPlN1EGVWaVC=m*jhFf4aSz)TFmoaVdLc*RuVMXt+FxfZS>Lq$%Gs)gzZ&MO&#FdIn3V-QCkYG@GY z)IjGLtOON<;Q`S(GCmgXoJzRsy1F{=e{jdn&P1&LRxcQOLrf1OCI{oflwy{3EDeN5 z4918^yMu%AApj%&lcNc@V>G#0kYfQ9cW&Q)dvNtb{gX*|l7ge7ds0=qkE~l4?pl8{ z!MV$~^VBX;G}YoXmA5JkPghKw<0TzWTTCVvRY?9ihCF-(!NgazW+?N`RNe5lRt8@x zI_dX4^w0kUH!FAo6yg~C!?XuKsC~C?R*zJt5r?F1om(rbcR|NxP(P0#Bz4yW{9eFO z-iHbm`XWs7?k9QJewo_UoqKELDc?)&Cs%zjZ%>0d?e*gd*wgh=@k!Zl^xsJB>iYr7 zA28bYEbV{X_fp%*5D7s2Q`D}$MzKF0(E@N>FHrj|+6m)|)3{zITz%;yyL@-#?S7Zq zFY12E&y!?V5U^iR`?PM?<9>_?h*1IM+G<8sS}#W8%H!WhkQ@dyn}Z;ZsP4#NQ0nJ zUE?;YF1psOBzJ4gT`Y3fH@qw7@4SVshRDDhhw7^?i-^z-BX?g?t$Y(!75mnbzlSeT zo`AiwN^XDANpAXl%y#QQSg%Pss_5B_lvKA(FiKlerhI%W;N ziN9>f=e+|>I&JVxoX<~`Z{lxw@Xs0Yb8kr?|GdFBaXw$spYZpuT*6mROg7#?>l*QP zO;Mjg18+0%F2d1%^)x|k>j_8yoA^c#IlC=6d;;#V9WB$@di4-aNbS5&4lB;oA_D}ewPRT0m9J_xi@GqDq+Ym_p1p* zj)_khd~@EX4Zev#Yw%4u#|^%T&wB7rdGJpgd^2v(7<>~yXYftE=MBDzzw5z&--ExJ zHZ^vj*SPd(PmS_>T;}srPMzZ{im{_*oBrIUP*6?s9(aSV&zft`S3qMKq z?_2m0s{hEs`F-Id3$Lef;X4E-oL}=?zO3P#pN|s1h;rnc>#l-u_J1$=q0!)*=XjgN z|263g8+?vQY}#P)Pm}!Z2H(7o^;-PDBKiEjiuRlPK+NJtNdD6n&hHuDu<$s^=kJf~ zhdT-XHt|s}istu@A6jz0KziS^@F|jW$->JB|2g3-pWj&mB#-UEcNPm;cnl`TNObOa8B^?x*jMJT89c z+C(_};VJUNh=m^{Ib)U_en)%G;$I~G3l^W>AMJdW@O_lqe&DwS_`%7NdkfDS<2)}r zNDkx7+hgGzCp-@3v;Axr;~dXtEIGVherVym9xqxruj?xo&ih6)#XIZe{U>7KypQd( zaNZ}UEu8n~SqtZVp5H%NFP|ekZpQgM`qYxc=b#9upB#f92SDzobUwnR6#S$k?8c{D z5gv@WF%j-hr$sn5t}Ci_Fy22o41d!f8V8Ol$NKwI@dH4^&IG|9<%i?gHIJzum{2?D zb=;48NSvKXf1=@sYlvRBS9xv+}!VLFkIE;q}gvqExVd znMT_k)6{oa#F)zbByo zaE@3%`w#a=TPF5wr$4cN$7-~y;xUi@AJ9h6`w_~-WcSB?s*wGeTNGVzf3zQ6V%z@& zV75%`S*-q#0U_?NCf4TSeppEV>!iPgI-q`>OI!b8z>varLQ$n&`jS!Rp`YzI2JAxp zAEqw_&yzgPxF6>)c=Z2-`eS^XiTiQ>C(y`clh?ojVuA&@e@&Pj|J?sKt)IVy{)PO1 zmJagV->-m&Q)>GkZMSs;Bv#V}?g11I38w?+(C&{hWla$v@OzaOm5G-u=U7!`Q=$GN Ox9R@pb(Z_I`~NSt(|D8s literal 0 HcmV?d00001 diff --git a/lab5/src/mm.c b/lab5/src/mm.c new file mode 100644 index 000000000..892aba206 --- /dev/null +++ b/lab5/src/mm.c @@ -0,0 +1,450 @@ +#include "mm.h" +#include "mini_uart.h" +#include "list.h" +#include "utils_c.h" +#include "_cpio.h" +#include "dtb.h" +#include "exception_c.h" + +// #define DEBUG + +#define FRAME_BASE ((uintptr_t)0x0) +// get from mailbox's arm memory +#define FRAME_END ((uintptr_t)0x3b400000) + +#define PAGE_SIZE 0x1000 // 4KB +#define FRAME_BINS_SIZE 12 +#define MAX_ORDER (FRAME_BINS_SIZE - 1) +#define FRAME_MAX_SIZE ORDER2SIZE(MAX_ORDER) +#define ORDER2SIZE(order) (PAGE_SIZE * (1 << (order))) + +#define FRAME_ARRAY_SIZE ((FRAME_END - FRAME_BASE) / PAGE_SIZE) + +#define CHUNK_MIN_SIZE 32 +#define CHUNK_BINS 7 +#define CHUNK_MAX_ORDER (CHUNK_BINS - 1) + +#define FRAME_FREE 0x8 +#define FRAME_INUSE 0x4 +#define FRAME_MEM_CHUNK 0x2 +#define IS_INUSE(frame) (frame.flag & FRAME_INUSE) +#define IS_MEM_CHUNK(frame) (frame.flag & FRAME_MEM_CHUNK) + +// for mm_int +extern char _skernel, _ekernel; +extern void *_dtb_ptr; + +FrameFlag *frames; +list frame_bins[FRAME_BINS_SIZE]; +Chunk *chunk_bins[CHUNK_BINS]; + +unsigned long *smalloc_cur = (unsigned long *)STARTUP_MEM_START; + +//////////////////////////////////////////////////////////////////////////////////////////////// +// utils // +//////////////////////////////////////////////////////////////////////////////////////////////// +static unsigned align_up_exp(unsigned n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n; +} +static int addr2idx(void *addr) +{ + return (((uintptr_t)addr & -PAGE_SIZE) - FRAME_BASE) / PAGE_SIZE; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// startUp // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *smalloc(size_t size) +{ + align(&size, 4); // allocated the memory size is mutiple of 4 byte; + unsigned long *smalloc_ret = smalloc_cur; + if ((uint64_t)smalloc_cur + size > (uint64_t)STARTUP_MEM_END) + { + uart_printf("[!] No enough space!\r\n"); + return NULL; + } + smalloc_cur += (unsigned int)size; + // uart_printf("return addr at %x\n",smalloc_ret); + return smalloc_ret; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// others // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void mm_init() +{ + init_buddy(); + memory_reserve((uintptr_t)0, (uintptr_t)0x1000); // Spin tables for multicore boot + + memory_reserve((uintptr_t)&_skernel, (uintptr_t)&_ekernel); // Kernel image in the physical memory + + fdt_traverse(get_initramfs_addr, _dtb_ptr); + memory_reserve((uintptr_t)initramfs_start, (uintptr_t)initramfs_end); // Kernel image in the physical memory + + memory_reserve((uintptr_t)STARTUP_MEM_START, (uintptr_t)STARTUP_MEM_END); // simple simple_allocator + + memory_reserve(dtb_start, dtb_end); // Devicetree + + merge_useful_pages(); +} + +void memory_reserve(uintptr_t start, uintptr_t end) +{ + + start = start & ~(PAGE_SIZE - 1); + end = align_up(end, PAGE_SIZE); + for (uintptr_t i = start; i < end; i += PAGE_SIZE) + { + int idx = addr2idx((void *)i); + frames[idx].flag |= FRAME_INUSE; + frames[idx].order = 0; + } +#ifdef DEBUG + uart_printf("reserve addr from %x ~ %x\n", (unsigned long)start, (unsigned long)end); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// buddy system // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int pages_to_frame_order(unsigned pages) +{ + pages = align_up_exp(pages); + return __builtin_ctz(pages); +} + +void init_buddy() +{ + frames = (FrameFlag *)smalloc(sizeof(FrameFlag) * FRAME_ARRAY_SIZE); + for (int i = 0; i < FRAME_BINS_SIZE; i++) + { + list_init(&frame_bins[i]); + } + for (int i = 0; i < FRAME_ARRAY_SIZE; i++) + { + frames[i].flag = 0; + frames[i].order = 0; + } +} + +void merge_useful_pages() +{ + for (int order = 0; order < MAX_ORDER; order++) + { + int page_idx = 0; + void *page_addr = 0; + int buddy_page_idx = 0; + while (1) + { + buddy_page_idx = page_idx ^ (1 << order); + if (!IS_INUSE(frames[page_idx])) + { + if (!IS_INUSE(frames[buddy_page_idx]) && + order == frames[buddy_page_idx].order && + buddy_page_idx < FRAME_ARRAY_SIZE) + { + insert_tail(&frame_bins[order + 1], page_addr); + frames[page_idx].order = order + 1; + } + else + { + insert_tail(&frame_bins[order], page_addr); + frames[page_idx].order = order; + } + } + else + { + if (buddy_page_idx < FRAME_ARRAY_SIZE && + !IS_INUSE(frames[buddy_page_idx])) + { + insert_tail(&frame_bins[order], (list *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE)); + frames[buddy_page_idx].order = order; + } + } + + page_idx += (1 << (order + 1)); + if (page_idx >= FRAME_ARRAY_SIZE) + { + break; + } + page_addr = (void *)(FRAME_BASE + page_idx * PAGE_SIZE); + } + } +} + +static void *split_frames(int order, int target_order) +{ + list *ptr = remove_head(&frame_bins[order]); + +#ifdef DEBUG + uart_printf("split frame: %x\n", (unsigned long)ptr); +#endif + + for (int i = order; i > target_order; i--) + { /* insert splitted frame to bin list */ + list *half_right = (list *)((char *)ptr + ORDER2SIZE(i - 1)); + + insert_head(&frame_bins[i - 1], half_right); + frames[((uintptr_t)half_right - FRAME_BASE) / PAGE_SIZE].order = i - 1; + +#ifdef DEBUG + uart_printf("insert frame at %x\n", (unsigned long)half_right); +#endif + } + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; +} + +void *alloc_pages(unsigned int pages) +{ + int target_order = pages_to_frame_order(pages); + if (frame_bins[target_order].next != &frame_bins[target_order]) + { + list *ptr = remove_head(&frame_bins[target_order]); +#ifdef DEBUG + uart_printf("return page at: %x\n", (unsigned long)ptr); +#endif + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; + } + else + { + for (int i = target_order; i < FRAME_BINS_SIZE; i++) + { + if (frame_bins[i].next != &frame_bins[i]) + { + return split_frames(i, target_order); + } + } + } + + uart_send_string("alloc page return NULL"); + return NULL; +} + +void free_pages(void *victim) +{ + int page_idx = ((uintptr_t)victim - FRAME_BASE) / PAGE_SIZE; + if (!IS_INUSE(frames[page_idx])) + { + uart_printf("Error! double free the memory at %x\n", (uintptr_t)victim); + return; + } + unsigned int order = frames[page_idx].order; + int buddy_page_idx = page_idx ^ (1 << order); + frames[page_idx].flag &= ~FRAME_INUSE; + + while (order <= MAX_ORDER && + !IS_INUSE(frames[buddy_page_idx]) && + order == frames[buddy_page_idx].order) + { + void *buddy_victim = (void *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE); + unlink((list *)buddy_victim); + +#ifdef DEBUG + uart_printf("merge buddy frame: %x \n", (unsigned long)buddy_victim); +#endif + order += 1; + victim = page_idx < buddy_page_idx ? victim : buddy_victim; + page_idx = page_idx < buddy_page_idx ? page_idx : buddy_page_idx; + buddy_page_idx = page_idx ^ (1 << order); + } + + insert_head(&frame_bins[order], victim); + frames[page_idx].order = order; + +#ifdef DEBUG + uart_printf("attach frame: %x \n\n", (unsigned long)victim); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// chunks // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int size_to_chunk_order(unsigned int size) +{ + size = align_up_exp(size); + size /= CHUNK_MIN_SIZE; + return __builtin_ctz(size); +} + +static void *get_chunk(uint32_t size) +{ + int order = size_to_chunk_order(size); + + void *ptr = chunk_bins[order]; + if (ptr) + { + chunk_bins[order] = chunk_bins[order]->next; + int idx = addr2idx(ptr); + frames[idx].ref_count += 1; + +#ifdef DEBUG + uart_printf("detach chunk at %x\n", (unsigned long)ptr); +#endif + } + + return ptr; +} + +static void alloc_chunk(void *mem, int size) +{ + int count = PAGE_SIZE / size; + int idx = addr2idx(mem); + int order = size_to_chunk_order(size); + frames[idx].flag |= FRAME_MEM_CHUNK; + frames[idx].ref_count = 0; + frames[idx].chunk_order = order; + for (int i = 0; i < count; i++) + { + Chunk *ptr = (Chunk *)((uintptr_t)mem + i * size); + ptr->next = chunk_bins[order]; + chunk_bins[order] = ptr; + +#ifdef DEBUG + uart_printf("insert chunk at %x\n", (unsigned long)ptr); +#endif + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// dynamic memory simple_allocator // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *kmalloc(unsigned int size) +{ + unsigned int aligned_page_size = align_up(size, PAGE_SIZE); + if (aligned_page_size > FRAME_MAX_SIZE) + { + return NULL; + } + + size = size < CHUNK_MIN_SIZE ? CHUNK_MIN_SIZE : size; + + size_t flag = disable_irq(); + + void *ptr; + if (align_up_exp(size) < PAGE_SIZE) // just allocate a small chunk + { + size = align_up_exp(size); + ptr = get_chunk(size); + + if (!ptr) + { + void *mem = alloc_pages(1); + alloc_chunk(mem, size); + ptr = get_chunk(size); + } + } + else + { + unsigned int pages = aligned_page_size / PAGE_SIZE; + ptr = alloc_pages(pages); + } + irq_restore(flag); + return ptr; +} +void *kcalloc(unsigned int size) +{ + void *p = kmalloc(size); + if (!p) + { + return NULL; + } + if (size < PAGE_SIZE) + { + size = align_up_exp(size); + } + else + { + size = align_up(size, PAGE_SIZE); + } + memset(p, 0, size); + + return p; +} + +void kfree(void *ptr) +{ + int idx = addr2idx(ptr); + if (idx >= FRAME_ARRAY_SIZE) + { + uart_send_string("Error! kfree wrong address\n"); + return; + } + size_t flag = disable_irq(); + if (IS_MEM_CHUNK(frames[idx])) + { + int order = frames[idx].chunk_order; + ((Chunk *)ptr)->next = chunk_bins[order]; + chunk_bins[order] = ptr; + frames[idx].ref_count -= 1; + +#ifdef DEBUG + uart_printf("free chunk at %x\n", (unsigned long)ptr); +#endif + } + else + { + free_pages(ptr); + } + irq_restore(flag); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// test // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void test_buddy() +{ + int test_size = 5; + void *a[test_size]; + uart_send_string("\n\n----- Malloc -----\n"); + for (int i = 0; i < test_size; i++) + { + a[i] = alloc_pages(test_size); + } + uart_send_string("\n\n----- Free -----\n"); + for (int i = 0; i < test_size; i++) + { + free_pages(a[i]); + } +} + +struct test_b +{ + double b1, b2, b3, b4, b5, b6; +}; + +void test_dynamic_alloc() +{ + uart_send_string("allocate a1\n"); + int *a1 = kmalloc(sizeof(int)); + uart_send_string("allocate a2\n"); + int *a2 = kmalloc(sizeof(int)); + uart_send_string("allocate b\n"); + struct test_b *b = kmalloc(sizeof(struct test_b)); + + uart_send_string("free a1\n"); + kfree(a1); + uart_send_string("free b\n"); + kfree(b); + uart_send_string("free a2\n"); + kfree(a2); +} diff --git a/lab5/src/mm.o b/lab5/src/mm.o new file mode 100644 index 0000000000000000000000000000000000000000..30856205ea823d09fd73a267c3cff04672df9fe9 GIT binary patch literal 25592 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 != &running_queue) + { + count++; + head = head->next; + } + return count; +} + +void add_task(struct task *t) +{ + size_t flags = disable_irq(); + insert_tail(&running_queue, &t->list); + irq_restore(flags); +} + +void kill_task(struct task *_task, int status) +{ + size_t flags = disable_irq(); + + _task->state = TASK_STOPPED; + _task->need_resched = 1; + unlink(&_task->list); + _task->exitcode = status; + insert_head(&stopped_queue, &_task->list); + + irq_restore(flags); + thread_schedule(0); +} + +void restart_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_WAITING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_RUNNING; + unlink(&_task->list); + insert_tail(&running_queue, &_task->list); + + irq_restore(flags); +} + +void pause_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_RUNNING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_WAITING; + _task->need_resched = 1; + unlink(&_task->list); + insert_head(&waiting_queue, &_task->list); + + irq_restore(flags); +} + +void sleep_task(size_t ms) +{ + size_t flags = disable_irq(); + + add_timer((timer_callback)restart_task, (size_t)current, ms); + pause_task(current); + irq_restore(flags); + + thread_schedule(0); +} + +void free_task(struct task *victim) +{ + if (victim->kernel_stack) + kfree(victim->kernel_stack); + kfree(victim); +} + +struct task *create_task() +{ + struct task *new_task = kmalloc(sizeof(struct task)); + new_task->cpu_context.lr = new_task->cpu_context.sp = new_task->cpu_context.fp = 0; + new_task->kernel_stack = NULL; + new_task->user_stack = NULL; + new_task->user_prog = NULL; + new_task->user_prog_size = 0; + new_task->state = TASK_INIT; + new_task->pid = task_count++; + new_task->need_resched = 0; + new_task->exitcode = 0; + new_task->timeout = get_current_time() + DEFAULT_TIMEOUT; + new_task->signal = NULL; + new_task->sig_context = NULL; + return new_task; +} + +struct task *pick_next_task() +{ + if (list_empty(&running_queue)) + { + while (1) + { + }; + } + struct task *next_task = list_first_entry(&running_queue, struct task, list); + unlink(&next_task->list); + insert_tail(&running_queue, &next_task->list); + + return next_task; +} + +void switch_task(struct task *next) +{ + if (current == next) + { + return; + } + switch_to(¤t->cpu_context, &next->cpu_context); +} + +struct task *get_task(pid_t target) +{ + struct task *_task; + list_for_each_entry(_task, &running_queue, list) + { + if (_task->pid == target) + { + return _task; + } + } + return NULL; +} \ No newline at end of file diff --git a/lab5/src/sche.o b/lab5/src/sche.o new file mode 100644 index 0000000000000000000000000000000000000000..896030018d5679a10cfff399682089b8647c232a GIT binary patch literal 14968 zcmbtbeQ;dWb-!uY68vSn!{8(V<2yK)4viG|m(!BPOD+Mp29R1^*}l?RLmrVrnF=_6iiDprlF~)p$R5H=nN2(G7Sm*QJQ~nTI!y2 z?>W17ue9mc9qZkDe&_R^`|<93Z+-7o*IwgT|{+us%UWnNF_n_V-#E0j){$!o#6&=7|JnfFZiE<0CZhwPib^JoBcmYfvhrh*h zZgJixMCZBI*bBlV+Rp*+oLkvO9=0v;!}93siT}JXh4O6k)4RX(r=PmPR;xg{6X&`> zuN8EbT#N6y#kW{j@uaO2{UP@opWgkwr!ZDs|Gh35Th+#Hv2egT1~GxX0c?L&wb8b; z2l#tku@|h9HN25eAr@XkokqS@d=&e!*bDt0ar=@GQ-I4{A-_fC>U=-Nq{s1_`nytJ zm-!RR{dJH(+4uh@5C2#Hl?xXh{Tb%b7^^(sDn>PCE9dXK)v=djJ{mjUFT}?SkT<5K z4V(|v-2W|&yV4as3kQ^p%6X_kUG}p@hnb(&134oG3e?OfH$vl`^HWlPiaixk?QCg|LMM zS0UEoWdmOHa>i4myh_mPg56IDuSZpWRassMx@@evJa#5m7GA%ky8ZSXDk$|fY&W5l z=gqD?h$|^?n{*XGPMhUz`x~g`HgEYmu+2md5`JO-5meHQ)#S!@+iAG;v{|;NsSWg` zs_hM8TewRFVf%vU?UQwdq_F+6Ev)r`2)jvAeoOSCLgrPSta_kRO$#R|4z zn~2Up8rsm)5Ma`~&npww=kuU#pWk{1IL*+ct0mhmd3BS@YWH&>Bm+$QTK$i~tai_j z>=3?ol>+ztwy5xRs0;uxB78wfv;nbA_&O!g4a8@JZ;d2EK#U6CT1gB6ahdRSNg@iw z<-*r3iS0mqR`_}(5d&ho@U4@?xO=7`eCuU<6352ZE891^vqj>R(Sl-}6ku4}IC$Uss)xVvUg#`Rv2NA%CWt^@( zs4Q85rWCU9BJ47w%}sY9D*GhGtfAuwR4>9l&9c_kCz+*8u3q�yQ7j#sA0>(t_&D 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 +#define BUFFER_MAX_SIZE 256u +#define COMMNAD_LENGTH_MAX 20u + +extern void *_dtb_ptr; + +int split(const char *buf, char *outbuf[], int n) +{ + const char *ps, *pe; + int idx = 0; + ps = pe = buf; + + while (idx < n) + { + while (*pe && *pe != ' ') + { + pe++; + } + + int size = pe - ps; + if (size) + { + outbuf[idx] = kmalloc(size + 1); + memcpy(outbuf[idx], ps, size); + outbuf[idx][size] = '\0'; + idx++; + } + + if (*pe) + { + while (*pe == ' ') + pe++; + ps = pe; + } + else + { + break; + } + } + + return idx; +} + +void read_command(char *buffer) +{ + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); +} + +void parse_arg(char *buffer, int *argi) +{ + int i = 0; + int argi_index = 0; + argi[argi_index] = i; + while (buffer[i] != '\0') + { + if (buffer[i] == ' ') + { + buffer[i] = '\0'; + argi[++argi_index] = ++i; + continue; + } + i++; + } +} + +void help() +{ + uart_send_string("help :"); + uart_send_string("print this help menu\n"); + uart_send_string("hello :"); + uart_send_string("print Hello World!\n"); + uart_send_string("reboot : "); + uart_send_string("reboot the device\n"); + uart_send_string("info : "); + uart_send_string("the mailbox hardware info\n"); + uart_send_string("ls : "); + uart_send_string("list the all file\n"); + uart_send_string("cat : "); + uart_send_string("print the file content\n"); + uart_send_string("dtb : "); + uart_send_string("print the device name tree \n"); + uart_send_string("async : "); + uart_send_string("test uart async send and recv\n"); + uart_send_string("set : "); + uart_send_string("set the timeout (set message second)\n"); + uart_send_string("buddy : "); + uart_send_string("test the page allocate and free\n"); + uart_send_string("dynamic : "); + uart_send_string("test the dynamic memory simple_allocator\n"); +} + +void hello() +{ + uart_send_string("Hello World!\n"); +} + +void info() +{ + get_board_revision(); + get_arm_memory(); +} + +void parse_command(char *buffer) +{ + // int argi[BUFFER_MAX_SIZE]; + if (utils_str_compare(buffer, "") == 0) + { + return; + } + else if (utils_str_compare(buffer, "help") == 0) + { + help(); + } + else if (utils_str_compare(buffer, "hello") == 0) + { + hello(); + } + else if (utils_str_compare(buffer, "ls") == 0) + { + cpio_ls(); + } + else if (utils_str_compare(buffer, "cat") == 0) + { + uart_send_string("Filename: "); + char buffer[BUFFER_MAX_SIZE]; + read_command(buffer); + cpio_cat(buffer); + } + else if (utils_str_compare(buffer, "exe") == 0) + { + exe_new_prog("user2.img"); + } + else if (utils_str_compare(buffer, "wtf") == 0) + { + uart_printf("Current task count :%d\n",get_the_cur_count()); + } + else if (utils_str_compare(buffer, "thread") == 0) + { + test_thread(); + uart_async_send_string("exit the test_thread\n"); + } + else if (utils_str_compare(buffer, "reboot") == 0) + { + uart_send_string("rebooting...\n"); + reset(1000); + } + else if (utils_str_compare(buffer, "info") == 0) + { + info(); + } + else if (utils_str_compare(buffer, "dtb") == 0) + { + fdt_traverse(print_dtb, _dtb_ptr); + } + + else if (utils_str_compare(buffer, "async") == 0) + { + test_uart_async(); + } + else if (utils_strncmp(buffer, "set", 3) == 0) + { + char *args[3]; + split(buffer, args, 3); + unsigned long time = (unsigned long)utils_str2uint_dec(args[2]); + set_timeout(args[1], S(time)); + } + else if (utils_str_compare(buffer, "buddy") == 0) + { + test_buddy(); + } + else if (utils_str_compare(buffer, "dynamic") == 0) + { + test_dynamic_alloc(); + } + else + { + uart_send_string("commnad '"); + uart_send_string(buffer); + uart_send_string("' not found\n"); + } +} + +void clear_buffer(char *buf) +{ + for (int i = 0; i < BUFFER_MAX_SIZE; i++) + { + buf[i] = '\0'; + } +} + +void shell() +{ + while (1) + { + char buffer[BUFFER_MAX_SIZE]; + clear_buffer(buffer); + uart_send_string("$ "); + read_command(buffer); + parse_command(buffer); + } +} \ No newline at end of file diff --git a/lab5/src/shell.o b/lab5/src/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..d1b68ea33cd8a11fc55fd39e34127e6b6efa15c1 GIT binary patch literal 16936 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 == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sig_return(void) +{ + asm volatile( + "mov x8, 10\n" + "svc 0\n"); +} + +void sig_context_update(TrapFrame *_regs, void (*handler)()) +{ + struct signal_context *sig_context = kmalloc(sizeof(struct signal_context)); + sig_context->trapframe = kmalloc(sizeof(TrapFrame)); + sig_context->user_stack = kmalloc(STACK_SIZE); + memcpy(sig_context->trapframe, _regs, sizeof(TrapFrame)); + + current->sig_context = sig_context; + + _regs->regs[30] = (unsigned long)&sig_return; + _regs->pc = (unsigned long)handler; + _regs->sp = (unsigned long)sig_context->user_stack + STACK_SIZE - 0x10; +} + +void sig_context_restore(TrapFrame *_regs) +{ + memcpy(_regs, current->sig_context->trapframe, sizeof(TrapFrame)); +} + +signal_handler signal_table[] = { + [0] = &sig_ignore, + [1] = &sig_ignore, + [2] = &sig_ignore, + [3] = &sig_ignore, + [4] = &sig_ignore, + [5] = &sig_ignore, + [6] = &sig_ignore, + [7] = &sig_ignore, + [8] = &sig_ignore, + [SIGKILL] = &sigkill_handler, +}; \ No newline at end of file diff --git a/lab5/src/signal.o b/lab5/src/signal.o new file mode 100644 index 0000000000000000000000000000000000000000..6382ab85748d3ef1f1eb65121342c472bebd39b6 GIT binary patch literal 9184 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'0' && *fmt<='9') { + len *= 10; + len += *fmt-'0'; + fmt++; + } + // skip long modifier + if(*fmt=='l') { + fmt++; + } + // character + if(*fmt=='c') { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } else + // decimal number + if(*fmt=='d') { + arg = __builtin_va_arg(args, int); + // check input + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + // convert to string + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]='0'+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]='-'; + } + // padding, only space + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=' '; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // hex number + if(*fmt=='x') { + arg = __builtin_va_arg(args, long int); + // convert to string + i=16; + tmpstr[i]=0; + do { + char n=arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i]=n+(n>9?0x37:0x30); + arg>>=4; + } while(arg!=0 && i>0); + // padding, only leading zeros + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]='0'; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // string + if(*fmt=='s') { + p = __builtin_va_arg(args, char*); +copystring: if(p==(void*)0) { + p="(null)"; + } + while(*p) { + *dst++ = *p++; + } + } + } else { +put: *dst++ = *fmt; + } + fmt++; + } + *dst=0; + // number of bytes written + return dst-orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char* fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst,fmt,args); +} \ No newline at end of file diff --git a/lab5/src/sprintf.o b/lab5/src/sprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..7b8641a48e20d79be03ea7aa0f00714ac1087e10 GIT binary patch literal 6656 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 Ch33%! literal 0 HcmV?d00001 diff --git a/lab5/src/syscall.c b/lab5/src/syscall.c new file mode 100644 index 000000000..efd12341b --- /dev/null +++ b/lab5/src/syscall.c @@ -0,0 +1,149 @@ +#include "syscall.h" +#include "stddef.h" +#include "trap_frame.h" +#include "current.h" +#include "peripheral/mailbox.h" +#include "mini_uart.h" +#include "signal.h" +#include "exec.h" +#include "exception_c.h" +#include "mm.h" +#include "fork.h" + +void sys_getpid(TrapFrame *_regs) +{ + _regs->regs[0] = current->pid; +} +void sys_uartrecv(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + buf[i] = uart_recv(); + } + _regs->regs[0] = count; +} +void sys_uartwrite(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + uart_send(buf[i]); + } + _regs->regs[0] = count; +} +void sys_exec(TrapFrame *_regs) +{ + const char *path = (char *)_regs->regs[0]; + const char **args = (const char **)_regs->regs[1]; + _regs->regs[0] = do_exec(path, args); +} +void sys_fork(TrapFrame *_regs) +{ + _regs->regs[0] = do_fork(_regs); +} +void sys_exit(TrapFrame *_regs) +{ + kill_task(current, _regs->regs[0]); +} +void sys_mbox_call(TrapFrame *_regs) +{ + unsigned int channel = _regs->regs[0]; + unsigned int *mailbox = (unsigned int *)_regs->regs[1]; + mailbox_call(channel, mailbox); +} +void sys_kill_pid(TrapFrame *_regs) +{ + pid_t target = _regs->regs[0]; + if (current->pid == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sys_signal(TrapFrame *_regs) +{ + int sig_num = _regs->regs[0]; + signal_handler _hand = (signal_handler)_regs->regs[1]; + + struct signal *new_signal = kmalloc(sizeof(struct signal)); + new_signal->sig_num = sig_num; + new_signal->handler = _hand; + new_signal->list.next = new_signal->list.prev = &new_signal->list; + + if (!current->signal) + { + current->signal = new_signal; + } + else + { + insert_tail(¤t->signal->list, &new_signal->list); + } +} + +void sys_sigkill(TrapFrame *_regs) +{ + int target = _regs->regs[0]; + int SIGNAL = _regs->regs[1]; + int is_find = 0; + if (current->signal) + { + struct signal *cur = current->signal; + do + { + if (cur->sig_num == SIGNAL) + { + is_find = 1; + sig_context_update(_regs, cur->handler); + break; + } + cur = list_entry(cur->list.next, struct signal, list); + } while (cur != current->signal); + } + else if (!current->signal && !is_find) + { + (signal_table[SIGNAL])(target); + } +} +void sys_sigreturn(TrapFrame *_regs) +{ + sig_context_restore(_regs); + + disable_interrupt(); + kfree(current->sig_context->trapframe); + kfree(current->sig_context->user_stack); + kfree(current->sig_context); + current->sig_context = NULL; + enable_interrupt(); +} +syscall syscall_table[NUM_syscalls] = { + [SYS_GETPID] = &sys_getpid, + [SYS_UART_RECV] = &sys_uartrecv, + [SYS_UART_WRITE] = &sys_uartwrite, + [SYS_EXEC] = &sys_exec, + [SYS_FORK] = &sys_fork, + [SYS_EXIT] = &sys_exit, + [SYS_MBOX] = &sys_mbox_call, + [SYS_KILL_PID] = &sys_kill_pid, + [SYS_SIGNAL] = &sys_signal, + [SYS_SIGKILL] = &sys_sigkill, + [SYS_SIGRETURN] = &sys_sigreturn, +}; + +void syscall_handler(TrapFrame *_regs) +{ + unsigned int sys_index = _regs->regs[8]; + if (sys_index >= NUM_syscalls) + { + uart_send_string("!!! Invalid system call !!!\n"); + return; + } + (syscall_table[sys_index])(_regs); +} diff --git a/lab5/src/syscall.o b/lab5/src/syscall.o new file mode 100644 index 0000000000000000000000000000000000000000..b929ca1ff1dd770136a5e82ef8f3b74ccb140e9b GIT binary patch literal 15424 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 literal 0 HcmV?d00001 diff --git a/lab5/src/thread.c b/lab5/src/thread.c new file mode 100644 index 000000000..b647e65c0 --- /dev/null +++ b/lab5/src/thread.c @@ -0,0 +1,76 @@ +#include "thread.h" +#include "mini_uart.h" +#include "timer.h" +#include "sche.h" +#include "list.h" +#include "mm.h" +#include "exception_c.h" +#include "current.h" +#include "trap_frame.h" + +void thread_kill_zombies() +{ + unsigned long flags = disable_irq(); + while (!list_empty(&stopped_queue)) + { + struct task *victim = list_first_entry(&stopped_queue, struct task, list); + unlink(&victim->list); + free_task(victim); + } + irq_restore(flags); +} + +void thread_schedule(size_t _) +{ + if (!current->need_resched) + { + return; + } + + unsigned long flags = disable_irq(); + struct task *next = pick_next_task(); + next->need_resched = 0; + irq_restore(flags); + + switch_task(next); +} + +void thread_init() +{ + struct task *init = create_task(); + set_thread_ds(init); // init the thread structure +} + +static void foo() +{ + for (int i = 0; i < 5; ++i) + { + uart_printf("Thread id: %d i=%d\n", current->pid, i); + // sleep_task(500); + delay(1000000); + } + kill_task(current, 0); + thread_schedule(0); +} + +struct task *thread_create(void *func) +{ + struct task *new_thread = create_task(); + new_thread->kernel_stack = kmalloc(STACK_SIZE); + new_thread->state = TASK_RUNNING; + new_thread->cpu_context.lr = (unsigned long)func; + new_thread->cpu_context.sp = (unsigned long)new_thread->kernel_stack + STACK_SIZE - sizeof(TrapFrame); + + add_task(new_thread); + + return new_thread; +} + +void test_thread() +{ + for (int i = 0; i < 3; ++i) + { + thread_create(&foo); + } + uart_printf("end of test_thread\n"); +} diff --git a/lab5/src/thread.o b/lab5/src/thread.o new file mode 100644 index 0000000000000000000000000000000000000000..3d6dc080cb3bfc8f1c8981f7f5e8c6f27c9194e5 GIT binary patch literal 11232 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 literal 0 HcmV?d00001 diff --git a/lab5/src/timer.c b/lab5/src/timer.c new file mode 100644 index 000000000..a17bc0ccd --- /dev/null +++ b/lab5/src/timer.c @@ -0,0 +1,155 @@ +#include "timer.h" +#include "utils_s.h" +#include "mm.h" +#include "mini_uart.h" +#include "utils_c.h" +#include "thread.h" +#include "exception_c.h" +#include "current.h" + +timeout_event *timeout_queue_head = 0, *timeout_queue_tail = 0; +void core_timer_enable() +{ + /* + cntpct_el0 >= cntp_cval_el0 -> interrupt + cntp_tval_el0 = cntpct_el0 - cntp_cval_el0 + */ + write_sysreg(cntp_ctl_el0, 1); // enable + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(SCHE_CYCLE)); // set expired time + *CORE0_TIMER_IRQ_CTRL = 2; // unmask timer interrupt +} + +void core_timer_disable() +{ + write_sysreg(cntp_ctl_el0, 0); // disable + *CORE0_TIMER_IRQ_CTRL = 0; // mask timer interrupt +} + +void set_expired_time(unsigned long duration) +{ + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(duration)); // ms +} + +unsigned long get_current_time() +{ + // cntpct_el0: The timer’s current count. + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + unsigned long current_count = read_sysreg(cntpct_el0); + return (unsigned long)(current_count / frq); +} + +void set_timeout(char *message, unsigned long time) +{ + add_timer((timer_callback)print_message, (size_t)message, time); +} + +void print_message(char *msg) +{ + unsigned long current_time = get_current_time(); + uart_printf("\ncurrent time : %d.%ds\n", GET_S(current_time), GET_MS(current_time)); +} + +void timeout_event_init() +{ + timeout_queue_head = 0; + timeout_queue_tail = 0; + unsigned long cntkctl_el1; + cntkctl_el1 = read_sysreg(CNTKCTL_EL1); + cntkctl_el1 |= 1; + write_sysreg(CNTKCTL_EL1, cntkctl_el1); +} + +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duration) +{ + timeout_event *new_event = (timeout_event *)kmalloc(sizeof(timeout_event)); + new_event->register_time = get_current_time(); + new_event->duration = duration; + new_event->callback = cb; + new_event->arg = arg; + new_event->next = 0; + new_event->prev = 0; + + size_t flag = disable_irq(); + if (timeout_queue_head == 0) + { + timeout_queue_head = new_event; + timeout_queue_tail = new_event; + core_timer_enable(); + set_expired_time(duration); + } + else + { + unsigned long timeout = new_event->register_time + new_event->duration; + timeout_event *cur = timeout_queue_head; + while (cur) + { + if ((cur->register_time + cur->duration) > timeout) + break; + cur = cur->next; + } + + if (cur == 0) + { // cur at end + new_event->prev = timeout_queue_tail; + timeout_queue_tail->next = new_event; + timeout_queue_tail = new_event; + } + else if (cur->prev == 0) + { // cur at head + new_event->next = cur; + (timeout_queue_head)->prev = new_event; + timeout_queue_head = new_event; + set_expired_time(duration); + } + else + { // cur at middle + new_event->next = cur; + new_event->prev = cur->prev; + (cur->prev)->next = new_event; + cur->prev = new_event; + } + } + irq_restore(flag); +} + +static inline void set_resched(unsigned long current_time) +{ + if (current_time >= current->timeout) + { + current->need_resched = 1; + } +} + +void timer_handler() +{ + unsigned long current_time = get_current_time(); + timeout_event *cur_event = timeout_queue_head; + timeout_event *next_event = cur_event->next; + if (next_event) + { + next_event->prev = 0; + timeout_queue_head = next_event; + set_expired_time(next_event->register_time + next_event->duration - current_time); + } + else + { + timeout_queue_head = timeout_queue_tail = 0; + core_timer_disable(); + } + + if (cur_event->callback == (timer_callback)&thread_schedule) + { + set_resched(current_time); + add_timer((timer_callback)thread_schedule, (size_t)0, MS(SCHE_CYCLE)); + enable_interrupt(); + thread_schedule(0); + disable_interrupt(); + } + else if (cur_event->callback) + { + cur_event->callback(cur_event->arg); + } + kfree(cur_event); +} \ No newline at end of file diff --git a/lab5/src/timer.o b/lab5/src/timer.o new file mode 100644 index 0000000000000000000000000000000000000000..ab117ef2d484461068803c10db6a64293458eeb4 GIT binary patch literal 14240 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 TqwiZ;{4XZoQ!*vew@`loZP|L= literal 0 HcmV?d00001 diff --git a/lab5/src/trans_el.s b/lab5/src/trans_el.s new file mode 100644 index 000000000..066bc1c7a --- /dev/null +++ b/lab5/src/trans_el.s @@ -0,0 +1,9 @@ +.globl from_el2_to_el1 +from_el2_to_el1: + mov x0, (1 << 31) // EL1 uses aarch64 + msr hcr_el2, x0 + mov x0, 0x3c5 // EL1h (SPSel = 1) with interrupt disabled + msr spsr_el2, x0 + msr elr_el2, lr + eret // return to EL1 + \ No newline at end of file diff --git a/lab5/src/utils_c.c b/lab5/src/utils_c.c new file mode 100644 index 000000000..bab9a7af5 --- /dev/null +++ b/lab5/src/utils_c.c @@ -0,0 +1,176 @@ +#include "utils_c.h" +#include "mini_uart.h" +#include + +/* + string part +*/ + +int utils_str_compare(const char *a, const char *b) +{ + char aa, bb; + do + { + aa = (char)*a++; + bb = (char)*b++; + if (aa == '\0' || bb == '\0') + { + return aa - bb; + } + } while (aa == bb); + return aa - bb; +} + +int utils_strncmp(const char *a, const char *b, size_t n) +{ + size_t i = 0; + while (i < n - 1 && a[i] == b[i] && a[i] != '\0' && b[i] != '\0') + i++; + return a[i] - b[i]; +} +void utils_newline2end(char *str) +{ + while (*str != '\0') + { + if (*str == '\n') + { + *str = '\0'; + return; + } + ++str; + } +} + +void utils_int2str_dec(int num, char *str) +{ + // num=7114 digit=4 + int digit = -1, temp = num; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +void utils_uint2str_dec(unsigned int num, char *str) +{ + // num=7114 digit=4 + unsigned int temp = num; + int digit = -1; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +unsigned int utils_str2uint_dec(const char *str) +{ + unsigned int value = 0u; + + while (*str) + { + value = value * 10u + (*str - '0'); + ++str; + } + return value; +} + +size_t utils_strlen(const char *s) +{ + size_t i = 0; + while (s[i]) + i++; + return i + 1; +} + +/* + reboot part +*/ + +void set(long addr, unsigned int value) +{ + volatile unsigned int *point = (unsigned int *)addr; + *point = value; +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} + +/* + others +*/ + +void align(void *size, size_t s) +{ + unsigned int *x = (unsigned int *)size; + if ((*x) & (s - 1)) + { + (*x) += s - ((*x) & (s - 1)); + } +} + +uint32_t align_up(uint32_t size, int alignment) +{ + return (size + alignment - 1) & -alignment; +} + +void delay(unsigned int clock) +{ + while (clock--) + { + asm volatile("nop"); + } +} + +void memcpy(void *dst, const void *src, size_t n) +{ + char *_dst = dst; + const char *_src = src; + + while (n--) + { + *_dst++ = *_src++; + } +} + +void *memset(void *s, int c, size_t n) { + char *p = s; + for (size_t i = 0; i < n; i++) { + p[i] = c; + } + return s; +} \ No newline at end of file diff --git a/lab5/src/utils_c.o b/lab5/src/utils_c.o new file mode 100644 index 0000000000000000000000000000000000000000..e6db5cf88f825ea956aed405454c23f9992b7afa GIT binary patch literal 10296 zcmb_hYiwM{bv}15$0E6WFRgdPB_&ZRWA2iytXMWBtwO&f%GSei;=pOhqivJf~xftXFwP)>goh4aI88YFF!l4^k%?H{>li?FuJ zerM*)a(6_zXxag|Gv}N0nloq4+(ZqYNeGY z>FvdJw7lfg^5VMKvR6fOOQ4Bj`xej8zC~X!%xmm4urslJZA71+CHlnTX)}HW<0ars zhlvKOiCQgvkm!-{wUvr_*qvMOhkmm1L)dSG{U9x0f!&o2v|I(*#SO7#f-j4p*)NRW zUIGSP|8gY&TaB@0=7FteJotJgXy_Pd_LFVC;#Kl7&VDblufosr7LR`bAItPIe#NIQ zmlrk$;kWUBz{D@eKC_=}V>f;N362eD*xSdkkTuM4tV?|GCH`M4pI8~Fh{Zhb1<`EF zVwC0=8)Nf}AEo(v*74EU{L))zPhNiOQqG%cf2sY0;dk0+0wJ1d3t=6D%(obg%_COL zS{D4g-lMR=_~I^_-vvEknmxI=o#t2CXucNo(ss=GUKbU%JwW6IX{zl3o?mPeUEo{7 zcyU*3p5yuq^dV03i;xS~Eo`Q()Itl??4j5Bf;F?>tT#}1c{BHiX1p!XJ&3)AE!kVn zIp~DHC)hV0v%j_P!(Z@l?ApTq-luTCt2|3*2vgtN+fUpk}K2F|HIn>Ztg<(xjZ$Z@PkpF?|& zycNg`kE;WwQxESJ~xbuyQ=j9U+_pI95`U6!0K^3SVsv$SWd69!e?)2<;>MQ{G;`X_fM;!H($j zPv9pT4x#g_*D>W+>8|cx4QVdF3CWEaqudV|K2NLj1Dd72N~N;}qtEYJ&%zDW)n8kc zYUHstSGBqIcQHm>i7u|2<4)SJ^xnBJR_^8LVk=Jv=El4PUEJ~oJx+RAy14UJJ$@)K zNw3v>MUN-79~e?U|DXlZbg9uWP7!IR&zl*dF&TL0o?uhSe1Xn~tg(D9LFaeyL||?h z=FazsIUR;qg2v#Krv9k;_cY%mReuSCrfN2!ZM|S^?J3#%4mfnwUf9GD3e3%zFg#cL zP0NhFr^Ns7mjAh}%m98Z{amLB#gsAhw3RKC1aHF$(5z3llomx#x0z)O2d3zm5VHj4 zrl^`dX=X|9j27YHs>>~UX1X-P+!{LfMQdZa$+$B^p?s=sud zyByE9ZF0U$0&G<5lWhw!@Xqaok6xTMw#g=XBeXGM#(ZWs-X>=jo^LKCMk|YZH5Dpn zODdtRX8WqTnm$n%h{q{d%LObjcP210Lcs<@z%x&waNgeT-4WauJRAya1kWB9@pn)# zcp&IE5LIEap@Llny=Jckn|Kp6RZgvocn3FGto^24o0u`S@$pSwh^V@eg6-9ZF{&wN z3+~!WO)rfNL3KBnsW)%qxY zqiQ1ss=R)+;ecvBsu~BCx4&1_4XR+fs%=*-cc{G)wb`(AaCbzlH(eLHKty$NcSPNe z&X1_Q+#ON%J*xE~)qF&G?L8_ORrMXJE}~j`RDD#{VC+x#tLBLE{F+FwsyU!;jxbk4 z$DC^3ry33^6=9JUFo#tmtL#wi+$Gf(bnuov3f!++x$9RArmN=;i{h@R*xP{rSicpi z^@IJ&iyl-h2UJbe*em{@?1hXyZ8mJoe)>bq!e)os(4oSo)JGz!G0a}n?K_4TA>f$Q z0k6M9)g4g{J@E8awRJyFc>513wO?)fv{G2WAc!b-X>dS=_N&^c3Ss>bRUKxbP(*Er zsBlDWiKq~eu<{OI!4U3OJHu)_LJngHH8!Dn8z+I+cb^Ils%F^lQ5!o{Lq98Q4y$^Z zR=ba?nnBeVReo6AgcbYnle>Pkjk`N+0@dCJ<$(Y)v{*=I@W`~NC^k_U& zOs#4fN=%GT#&apkOk_vH`iHeaim&Vv9Zx26G&#XjTGMz6qeMKLNM(j{sS;~)qBxSV z+S!plI6IU~C8(Iq!+}&XoEVGe;Oy$SDynCvy{pRH87E0~pUwXA@(&iR?r%-(Ac;md+--3vsL}k4eLx$i(wwRwzA@ zm0hUtUoTUKuM*BoBp%UwMML~FX=0~CN<;jxnM{wS3sgvhtF+sF93m4%of3#?Hi6BL zj!lfGqEnedUr$f;*aLSSj%MN`w-WS5jcg*4_z)&aXA_xXGDXp1J{OJ0bBVFNd%BTq z#i{PmY%wa+(UEi^FV3*SRn_@IGMPFR8Kc7VWGasy06gtxce5bro`Hee!@D0GDP{{r z*|+ZAq9%L4(AO8~+4EZhqoOu(kwxbIMmQ|LhxaYl6eq1)X)>SyFu%j5?nveF+O1MX9Z7k54)cdJ+BIW zr{Ko~Ul5${Dds;6d@F`O6o`E}h~W1MZuJccJ}fx)h4u721e{|#CHS!5p9KD4joGW{y_L0ie7;-P zXg=vH^tu@zn%t(}QE#ZH^Z;5R=9`Dz3XBQgc~-CtzIo%cWU2S5t~4$m_=K;CYc!wm z1<7e9d`&vHoGJKYv%GS~r|W~xuU;)>ahMg6?Sfl+LGWI|W3mN0|A7q%epc|X^bZPt zNuFu!`wZs?+g*??)A&h{eNQM68c>(8Kr|G9C8jyrnnefOlpZ$CZFIXHi7<#yiDgUejE?>RVsfaLZw2X7VnKc%

    K2zBvq-pzH zWbs*z%KK3nzum{A%v*k&hxXpExIIVDJN)*XUUG1I-v83UZTXa%B3XRJ zh~P7c`Klp`Q)5G?a`Ew$MDaK8!Vu+ZIlA-uW17~ZPf3vcf(h4b0v@J_yPa#z5?hi}72l;;IzPC_?WsJn#to$3XFf)+jq zt|kyhl0e)SSyA5tdg51u6PZjl(~xo2nM^`pf?Q>1%gxojU^<`At*kCR%6Yak3w~__ z_JXSCmwe0DP!>xiL3C5amgQNCdf*?iFZv-p)GyBW$<#<{A~m3`TEpi$sz!fNt~k0S zPs{=}lxsHBq3Z`vpN}o9j!j!Lb6RLeC|f@v_LJOMOfZljO^P$LEJf@i;dG33AfZP$ zV=SR7#yXI2N;hLH;arS$AmNN|Mwl|E+k7ugF7amNi_E8^XzeFk2d8FlZ&Vh_*=YCX;V!Sdg21-64as5Nv&p}?&NV3qB_2Fvk% zuxhSnTV>bT+bnt2Z5Q9gxP(D14%O{fJIcX!oSOTl<+Y7_x#?ogMhc4lFGBlB`=i!D zB`q*8&$&5&8T6xg^Td7TcvF$DE|X}`O#Ey74U9E&Qhrr`oeWJ(U%KDun+lo_!H3*X zoq3v1@>BCW%skCG+u3h~VCI>lQDbx3LhxlD~G}lF)E0xbf(60X?ktiyj`ls8{?0+9QDy94oM)HO0 z(|qWn`qy>i|4sJ-_`wcE)^v}Y#mB5qcZoT>lxd2|F)}n!brnVTTf6vu{{D~3k+m8B E7gpt$FaQ7m literal 0 HcmV?d00001 diff --git a/lab5/src/utils_s.s b/lab5/src/utils_s.s new file mode 100644 index 000000000..83f30cb94 --- /dev/null +++ b/lab5/src/utils_s.s @@ -0,0 +1,32 @@ +.global branchAddr +branchAddr: + br x0 + + +.globl get_el +get_el: + mrs x0, CurrentEl + lsr x0, x0, #2 + ret + +.global switch_to +switch_to: + mov x9, sp + stp x19, x20, [x0, #0x0] + stp x21, x22, [x0, #0x10] + stp x23, x24, [x0, #0x20] + stp x25, x26, [x0, #0x30] + stp x27, x28, [x0, #0x40] + stp fp, x9, [x0, #0x50] + str lr, [x0, #0x60] + + ldp x19, x20, [x1, #0x0] + ldp x21, x22, [x1, #0x10] + ldp x23, x24, [x1, #0x20] + ldp x25, x26, [x1, #0x30] + ldp x27, x28, [x1, #0x40] + ldp fp, x9, [x1, #0x50] + ldr lr, [x1, #0x60] + mov sp, x9 + msr tpidr_el1, x1 + ret diff --git a/lab5/users/user1/main.c b/lab5/users/user1/main.c new file mode 100644 index 000000000..4a8ceeea0 --- /dev/null +++ b/lab5/users/user1/main.c @@ -0,0 +1,286 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} + +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + + +unsigned int __attribute__((aligned(16))) mailbox[8]; + + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + int pid = getpid(); + uart_printf("[User1] pid:%d\n", pid); + + exit(); + return 0; +} From 72b2b2b0eadf8bf8a856c02bc1bf65978a675e30 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Wed, 8 May 2024 22:17:44 +0800 Subject: [PATCH 15/24] Add files via upload --- lab5/users/user2/linker.ld | 26 ++++ lab5/users/user2/main.c | 303 +++++++++++++++++++++++++++++++++++++ lab5/users/user2/main.o | Bin 0 -> 13616 bytes 3 files changed, 329 insertions(+) create mode 100644 lab5/users/user2/linker.ld create mode 100644 lab5/users/user2/main.c create mode 100644 lab5/users/user2/main.o diff --git a/lab5/users/user2/linker.ld b/lab5/users/user2/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab5/users/user2/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab5/users/user2/main.c b/lab5/users/user2/main.c new file mode 100644 index 000000000..2db3521bf --- /dev/null +++ b/lab5/users/user2/main.c @@ -0,0 +1,303 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} +int fork(void) +{ + return (int)syscall(SYS_FORK, 0, 0, 0, 0, 0, 0); +} +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +unsigned int __attribute__((aligned(16))) mailbox[8]; + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + // char buf1[0x10] = {0}; + int pid = getpid(); + uart_printf("[User2] pid:%d\n", pid); + + unsigned int revision = get_board_revision(); + uart_printf("[User2] Revision: %x\n", revision); + + pid = fork(); + + if (pid == 0) + { + uart_printf("[User2] child: exec user1.img\r\n"); + exec("user1.img", NULL); + } + else + { + uart_printf("[User2] parent: child pid: %d\n", pid); + } + uart_printf("[User2 ] exit\n"); + exit(); + return 0; +} diff --git a/lab5/users/user2/main.o b/lab5/users/user2/main.o new file mode 100644 index 0000000000000000000000000000000000000000..e4a618f7dbbecd9c7adfaae0b4960576088e633b GIT binary patch literal 13616 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 Date: Wed, 8 May 2024 22:55:35 +0800 Subject: [PATCH 16/24] Add files via upload --- lab5/users/user1/linker.ld | 26 ++++++++++++++++++++++++++ lab5/users/user1/main.o | Bin 0 -> 12632 bytes 2 files changed, 26 insertions(+) create mode 100644 lab5/users/user1/linker.ld create mode 100644 lab5/users/user1/main.o diff --git a/lab5/users/user1/linker.ld b/lab5/users/user1/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab5/users/user1/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab5/users/user1/main.o b/lab5/users/user1/main.o new file mode 100644 index 0000000000000000000000000000000000000000..4253fbe316f6c128eacd29e73d31f20f9525ab11 GIT binary patch literal 12632 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 E0X`llUH||9 literal 0 HcmV?d00001 From f6d3855ffe5340618e15cb0087a83868e2790356 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 16 May 2024 19:25:03 +0800 Subject: [PATCH 17/24] Create ReadMe.md --- lab5_2/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab5_2/ReadMe.md diff --git a/lab5_2/ReadMe.md b/lab5_2/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab5_2/ReadMe.md @@ -0,0 +1 @@ + From 08680740772f95d7d3964054d2051872e49fdff1 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Tue, 28 May 2024 13:30:49 +0800 Subject: [PATCH 18/24] Create ReadMe.md --- lab6/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab6/ReadMe.md diff --git a/lab6/ReadMe.md b/lab6/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab6/ReadMe.md @@ -0,0 +1 @@ + From 339f2d09310354b9d0f88510b9845330cf0dea25 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Tue, 28 May 2024 13:32:24 +0800 Subject: [PATCH 19/24] Add files via upload --- lab6/Makefile | 105 ++++++ lab6/archive/TA/initramfs.cpio | Bin 0 -> 247296 bytes lab6/archive/TA/vm.img | Bin 0 -> 247488 bytes lab6/archive/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 31790 bytes lab6/archive/rootfs/one | 3 + lab6/archive/rootfs/two | 3 + lab6/bootloader/linker.ld | 28 ++ lab6/bootloader/main.c | 48 +++ lab6/bootloader/start.S | 46 +++ lab6/include/_cpio.h | 33 ++ lab6/include/current.h | 16 + lab6/include/dtb.h | 39 +++ lab6/include/exception_c.h | 17 + lab6/include/exception_s.h | 6 + lab6/include/exec.h | 7 + lab6/include/fork.h | 8 + lab6/include/list.h | 45 +++ lab6/include/mini_uart.h | 22 ++ lab6/include/mm.h | 47 +++ lab6/include/mmu.h | 53 +++ lab6/include/peripheral/base.h | 9 + lab6/include/peripheral/gpio.h | 12 + lab6/include/peripheral/mailbox.h | 36 ++ lab6/include/peripheral/mini_uart.h | 30 ++ lab6/include/sche.h | 64 ++++ lab6/include/shell.h | 7 + lab6/include/signal.h | 27 ++ lab6/include/sprintf.h | 31 ++ lab6/include/syscall.h | 29 ++ lab6/include/thread.h | 13 + lab6/include/timer.h | 39 +++ lab6/include/trap_frame.h | 12 + lab6/include/utils_c.h | 33 ++ lab6/include/utils_s.h | 41 +++ lab6/kernel/exception_c.c | 109 ++++++ lab6/kernel/exception_s.S | 214 ++++++++++++ lab6/kernel/linker.ld | 34 ++ lab6/kernel/main.c | 36 ++ lab6/kernel/start.S | 62 ++++ lab6/loadImg/loadImg.py | 30 ++ lab6/loadImg/loadImg.sh | 5 + lab6/requirements.txt | 1 + lab6/src/_cpio.c | 117 +++++++ lab6/src/dtb.c | 143 ++++++++ lab6/src/exec.c | 98 ++++++ lab6/src/fork.c | 47 +++ lab6/src/list.c | 47 +++ lab6/src/mailbox.c | 64 ++++ lab6/src/memzero.S | 7 + lab6/src/mini_uart.c | 258 +++++++++++++++ lab6/src/mm.c | 460 ++++++++++++++++++++++++++ lab6/src/mmu.c | 174 ++++++++++ lab6/src/sche.c | 153 +++++++++ lab6/src/shell.c | 226 +++++++++++++ lab6/src/signal.c | 63 ++++ lab6/src/sprintf.c | 152 +++++++++ lab6/src/syscall.c | 151 +++++++++ lab6/src/thread.c | 76 +++++ lab6/src/timer.c | 155 +++++++++ lab6/src/trans_el.S | 9 + lab6/src/utils_c.c | 176 ++++++++++ lab6/src/utils_s.S | 34 ++ lab6/users/user1/linker.ld | 26 ++ lab6/users/user1/main.c | 286 ++++++++++++++++ lab6/users/user2/linker.ld | 26 ++ lab6/users/user2/main.c | 305 +++++++++++++++++ 66 files changed, 4653 insertions(+) create mode 100644 lab6/Makefile create mode 100644 lab6/archive/TA/initramfs.cpio create mode 100644 lab6/archive/TA/vm.img create mode 100644 lab6/archive/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab6/archive/rootfs/one create mode 100644 lab6/archive/rootfs/two create mode 100644 lab6/bootloader/linker.ld create mode 100644 lab6/bootloader/main.c create mode 100644 lab6/bootloader/start.S create mode 100644 lab6/include/_cpio.h create mode 100644 lab6/include/current.h create mode 100644 lab6/include/dtb.h create mode 100644 lab6/include/exception_c.h create mode 100644 lab6/include/exception_s.h create mode 100644 lab6/include/exec.h create mode 100644 lab6/include/fork.h create mode 100644 lab6/include/list.h create mode 100644 lab6/include/mini_uart.h create mode 100644 lab6/include/mm.h create mode 100644 lab6/include/mmu.h create mode 100644 lab6/include/peripheral/base.h create mode 100644 lab6/include/peripheral/gpio.h create mode 100644 lab6/include/peripheral/mailbox.h create mode 100644 lab6/include/peripheral/mini_uart.h create mode 100644 lab6/include/sche.h create mode 100644 lab6/include/shell.h create mode 100644 lab6/include/signal.h create mode 100644 lab6/include/sprintf.h create mode 100644 lab6/include/syscall.h create mode 100644 lab6/include/thread.h create mode 100644 lab6/include/timer.h create mode 100644 lab6/include/trap_frame.h create mode 100644 lab6/include/utils_c.h create mode 100644 lab6/include/utils_s.h create mode 100644 lab6/kernel/exception_c.c create mode 100644 lab6/kernel/exception_s.S create mode 100644 lab6/kernel/linker.ld create mode 100644 lab6/kernel/main.c create mode 100644 lab6/kernel/start.S create mode 100644 lab6/loadImg/loadImg.py create mode 100644 lab6/loadImg/loadImg.sh create mode 100644 lab6/requirements.txt create mode 100644 lab6/src/_cpio.c create mode 100644 lab6/src/dtb.c create mode 100644 lab6/src/exec.c create mode 100644 lab6/src/fork.c create mode 100644 lab6/src/list.c create mode 100644 lab6/src/mailbox.c create mode 100644 lab6/src/memzero.S create mode 100644 lab6/src/mini_uart.c create mode 100644 lab6/src/mm.c create mode 100644 lab6/src/mmu.c create mode 100644 lab6/src/sche.c create mode 100644 lab6/src/shell.c create mode 100644 lab6/src/signal.c create mode 100644 lab6/src/sprintf.c create mode 100644 lab6/src/syscall.c create mode 100644 lab6/src/thread.c create mode 100644 lab6/src/timer.c create mode 100644 lab6/src/trans_el.S create mode 100644 lab6/src/utils_c.c create mode 100644 lab6/src/utils_s.S create mode 100644 lab6/users/user1/linker.ld create mode 100644 lab6/users/user1/main.c create mode 100644 lab6/users/user2/linker.ld create mode 100644 lab6/users/user2/main.c diff --git a/lab6/Makefile b/lab6/Makefile new file mode 100644 index 000000000..a74042010 --- /dev/null +++ b/lab6/Makefile @@ -0,0 +1,105 @@ +CFLAG = -Iinclude -Wall -ffreestanding -fno-stack-protector -nostdlib -nostartfiles -mgeneral-regs-only +K8=kernel8 +BL=bootloader +LINKER=linker.ld +START=start +CPIO:=archive/initramfs.cpio +TA_CPIO:=archive/TA/initramfs.cpio +TA_IMG:=archive/TA/vm.img + +DTB:=archive/bcm2710-rpi-3-b-plus.dtb +USER_DIR:=users/user +USER1:=user1 +USER2:=user2 +BUILD:=build/ + +BUILD_ELF:=$(shell find build/ -name '*.elf') +BUILD_IMG:=$(shell find build/ -name '*.img') +ARC_ROOTFS_IMG:=$(shell find archive/rootfs -name '*.img') + +SRC_C:=$(shell find src/ -name '*.c') +SRC_S:=$(shell find src/ -name '*.S') + +KER_C:=$(shell find kernel/ -name '*.c') +KER_S:=$(shell find kernel/ -name '*.S') + +BL_C:=$(shell find bootloader/ -name '*.c') +BL_S:=$(shell find bootloader/ -name '*.S') + +USER1_C:=$(shell find users/user1/ -name '*.c') +USER1_OBJS:= $(USER1_C:%.c=%.o) + +USER2_C:=$(shell find users/user2/ -name '*.c') +USER2_OBJS:= $(USER2_C:%.c=%.o) + +OBJS:= $(SRC_C:%.c=%.o) \ + $(SRC_S:%.S=%.o) \ + + +KERNEL_OBJS:=$(KER_C:%.c=%.o) \ + $(KER_S:%.S=%.o) + + + +BL_OBJS:=$(BL_C:%.c=%.o) \ + $(BL_S:%.S=%.o) \ + src/mini_uart.o src/utils_c.o src/utils_s.o src/memzero.o src/sprintf.o + + + + +all: $(BUILD)$(USER1).img\ + $(BUILD)$(USER2).img \ + $(BUILD)$(K8).img \ + $(BUILD)$(BL).img \ + rd.o + + + +rd.o:$(CPIO) + aarch64-linux-gnu-ld -r -b binary -o rd.o $(CPIO) + + +%.o: %.S + aarch64-linux-gnu-gcc -g -o $@ -c $< + +%.o: %.c + aarch64-linux-gnu-gcc -g -o $@ $(CFLAG) -c $< + + +$(BUILD)$(K8).img: $(OBJS) $(KERNEL_OBJS) + aarch64-linux-gnu-ld -T kernel/$(LINKER) -o $(BUILD)$(K8).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(K8).elf $@ + +$(BUILD)$(BL).img: $(BL_OBJS) + aarch64-linux-gnu-ld -T bootloader/$(LINKER) -o $(BUILD)$(BL).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(BL).elf $@ + +$(BUILD)$(USER1).img:$(USER1_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)1/$(LINKER) -o $(BUILD)$(USER1).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER1).elf $@ + cp $@ archive/rootfs/ + +$(BUILD)$(USER2).img:$(USER2_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)2/$(LINKER) -o $(BUILD)$(USER2).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER2).elf $@ + cp $@ archive/rootfs/ + +$(CPIO): + cp $(TA_IMG) archive/rootfs + cd archive/rootfs&&find . | cpio -o -H newc > ../initramfs.cpio + +on: + sudo screen /dev/ttyUSB0 115200 +qe: $(BUILD)$(K8).img + qemu-system-aarch64 -M raspi3 -kernel $< \ + -serial null -serial stdio -s \ + -initrd $(CPIO) \ + -dtb $(DTB) \ + +clean: + $(RM) $(BUILD_ELF) $(CPIO) \ + $(OBJS) $(KERNEL_OBJS) $(BL_OBJS) $(USER1_OBJS) $(USER2_OBJS)\ + $(ARC_ROOTFS_IMG) \ + $(BUILD_IMG) \ + \ No newline at end of file diff --git a/lab6/archive/TA/initramfs.cpio b/lab6/archive/TA/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..0676fb1584617bc4d73624b3b212a12133e97d8e GIT binary patch literal 247296 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
    LaIRxxGkGu2Nc^r*p2nQQ3R%~CR5{JU3A)Ai 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 Y|NVQD{zsGk@BjU0zWVPb{hucNe;je&3jhEB literal 0 HcmV?d00001 diff --git a/lab6/archive/bcm2710-rpi-3-b-plus.dtb b/lab6/archive/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..3934b3a26eb82fd65dbcdfca6f6916da427a3fae GIT binary patch literal 31790 zcmcg#eUKbSb)P-mN%oxp+1OwLHYcC3Wn1Ih-Mf=c4u&(5k!4G^kYr>NV7<3HcemDl zd3W#h5h4^IfD=fZP=#Ft0#z}ABBp}#RZ!#)^G662ML|9YseA#I6rr3CQX!R4MS=7C zz3$i3GdsI?XPb1@%yhqg{rdIm*ROlJdwRb9f}i|*5WMZ?APDXVg4RFdxf|DIxOU)z z+kPkDA2xoy+b9j1XU+z<;7J-mr`&BXMxD;Nc5Tm0*l1Owdbk+2>#N;hu~TX6S*$dQ z^E3O1$~0HunmDd$CXdx7XC{v_(d6rHQk+qE$Q$!w8iprv`Qbe_oGaIBYEjtWkrT&pj(&Vo=rzc@de zpEf0$E0tHPwHDBX=H+;v5d88gaha(SWS$eaPMJJgtIaAxCfyjGZy{VDF|D%TRvTr> zcVB|m6mTPnuQhuR{c5`xR$9$or&X^<9m8nRX3o4{it9naKU3~iR;sOK;ION_Y%aPm-wVS=B?0}&x>)rLvWVcwHAet%!6`&kHp7yla@Pi-k-ur*B^QP zfZ?T4k!+X|fN|tnn^=!O>^={zT%t?V9ADOwaf)`0)^+Ur&tx zVk*Ak@z40LNc?Jd5%l-ZQ-A=%k^il@zBXNts?zEV>=MBKO42MX!Yg>xnQscLw-R+4 zwlOB_>IK00mf)1n*4j~LiHYGGl+$)vq-SVyZEQFP6qjsxgEctdKG=R0J8aARvt8RRT-XdHI3D!9NVj*g#*o{Wq(7bv<|}iJuiG5e$r$-^e4CY%rig!Zm{+6 z0~Q7rrHu0k=PD>bt+^aF%5AH5jwj*Eno!cBtqr=hM!Oz`i|B{wEDuBb74}WfT)^$M zxY*e&*vpEOG`1tA^%OjG#DlZ6h1dNE=Xz(`P}jWItObXCn%^nTg+L?>jx;EP^A{vn z>F*RqmdFmvMcAbXK3uJJse4s~>3kk;L0Du`X`|IO!AilIS>nr6zF+Y!=ZUv3{#cqQ6YTF!N{MM#m@Nd=jpCJPtqgOT+XdFT;CwHzT;TPf7k8 z=%5Mo`3*jM5#a?7Mmf@Hxxi=c(*~5_;gx`i{QA4G0r?Zr5Q^nBDS$u3oiGS5$NWi` zdcY^k!8o|w=WtUwd>MYmYuq=yxTn21()ab#OHS}L#BdyE4t_bI@x zJbbWp;^1uo9|w*E@D>7i3c;achwmvJI&kDJ@y*G7Z*bz+;nIQI3#GfQFK>NE51+V4 zKu7O6aacScVv-h$lD04toV@Q~Avn$(i5K>o$3F9zH;?`DDCW(>U=|I9;*0^#nulSj zXs8tT1$P`gdbo7Qv4iC3effD4FPZo3Jkt?J%fxD7N6*5};39K#xU%x5{h{0_TcNw$uGCNGMOsoQ zFCELl`t<2|VWIPy1f7D=Vcv9_j&!IK8fM+4>9AXi`7v~6rS{@ z=wg^^YR@!I;?NG0H#)E1$>fjiE=i~8^h@b*Y<4v+LOP&^@Gd+m(ipEr{5q zOt6Vkf21mREInb-SRRvZGqxw)CTRbq zj`1pKbeE%jL-z_>cG^nlO``Ac`AyTj6Szs5Gh&9AMrlsLzY7=J#&x*T_Bl=SF5oCl zql*|%z>%hwe^CGB^Gd%BOWhwqSm|1eAdT0jyBjz+;G(^wZOCdnX}U*&Cv^GRXarlZ zrcd(McBp-?2>iYY82JUK#Zs4&!`gNM7bzhQ}$D0|+Fs;(lc0G*V{Ynpge5qS6uSI@OVR(W3 z*X=7*x3w+4N$I*i&1edFxx&(;Eo9$JJ=>0pHhUPaKZkhABiBCDu%<_vo~EJAB^?cC zjUnFLPs6nZ@Z-wq(@59BTl#32>eMvkgLSFlEI!`q(XdTPMr@jfG}7{*yllMKic&uf zPSYrkl!bk}(j*`0vOHj6l&Rrkmcx9PhJ2)TGR;T1pN8ufRi>dwGfN(eN`vo#h55x= zuT*K5t1JFXA2EYWeoB>@hZAe?dQ$CT|XN+j)UH2-mM47QFx28d2?-fqw;z_d0I;Fw3qsq zkeBiVv<>OqMtK`1r{!#(oSg31pk6&6ysY%|lG#2tBd5*i`!G4xhVmA-!;Q%6`Qqt8 z<%wFzRQr8^qf@4=`Gm88YA5Q9A{iNs9c?l74>KEfK1L`5l9J8lExxHB8G%Db9w(KJ(f?Yd+Ct*BBXm=O~H}ZDe z=x6y;YbFAF7;)Oxi3fXmj#TUyXXLR&Pb3C7yY^HLKZ~*_rup zQH&kHHvPy4g7Aw^*)VO)N8q2prH**uW9Zr+tvKZ-^@6E)EdCYq@shjbMY%a%usLTg zG!sh%GY`mtbutMrO^JhPov>aNk39NyktG|-^$Fl@pNz-qu+J<=X;%<|}z)Tp)HM-fkoL_v;A|k%o@^ zL7uc5$KcJ>lPf*E=Sxp0$IFA=2G zyRPi6wKyy<@)+3$T6q#IRl2oOwd=Q=LAs56L@zl`A{~~2@BJJz*|3!12844Ut;(ly zo76L*)dnq^d7SGgeKnWMPIm23~)Nq?$;L}O00>u`f`z=_u*n1)Q{`u zX+zjX_t-e}g(HV5txgoQYiA>=HkH@VdK*#?QkD+rn{sqbIrb;Z!Fo#em#Al3Q1Wcc z@d(kVXbMyNNWCI#1NxOC5v>c@DkqCcz$pukL-{P=B2DVxq4vtTAnI1iZC^4b{%Sn- zk=@ebxn2~AuUhRCoewnVNNbRskl&U&5zqQyo!YX9>{up|UH`UM7;7wsF2W>lp$_&1Qk26Rse4rNqAN;5w!AE94$BqV0^E`i{En)4iDSPDuc1Q4# z-_ZV;{P;HC@8_nF7BmCaI-f;c%zLB#T*38og_8Dj;sXsj(i$WuRe6~2dr#NS}d1yM0)wO+s&cL$$)aa(Zdr0%U4`X(+KY(Ac8n#RM5L!9ZSV&D4chQ>`aob80aLxDGLvu8;gj})Prk$P$+pWU+clpY>+#9H zf={+TKB>oiQeXLe`8rSS->{~=597#_KASU=n5)9^FW@*?kxl%u9+ouNKuY-VvpuUQ`9H~X_VNxus? zK96%@yO9ouXR2aCEbY-LB=Kdn&kNJ`oxecs3369l2tGy+^I+OZz|{6rZ^-l2_DQ{A zSl<~SyOBd{Gt~g!Ow~%YMtM03R*HLPgIbq5EA;RfJ!t)u6WhujTvF!#&-^4!f4cx8 z($JAd(=K)_Fw9aYO#3nNOPJ=zc@4==UfI{m^|eTbwR`Q*gSc!1DVg&9UXb&QgVTI4 zwtWCWir2w3Z|J1J2K9%^6K!%9Px_VRdOQ`FIh@B6WuD2C&c&|B)6au|@Ra?joa9BF z@a446|L6))F+V#e5fpt)Wdwl4Kll2~}@*-ctn~r^+)x6-vV<1D7aeQjM zv0Q0BpX=BMyl0MUsGm}nwaAR)R1qx?{rV3?#L+2_7{@(;V4^IPFKshB3&qp&smurI z0NRurcXE!G=~eb`gJ1Yfw4eF>Ms>A_^mNJ-cps>%;}&lapUTrO08e=0XN_ph`@IDw z=EJ_w*VDO>hy)rwAUN2-Mz^=qN1l{5(omOS6rQ>M=GP(L6-Wd9;pjy? zS*O$u7Lst4qn0TLI}S1OO+WEIMtf%DxK^1BY3z-&JVS<05r85ay5PZ$PqZ$5z7&SC zWtKtt;(Dmm?{a%pX=k*H$}A({th@%%9Q|eB==e_axCof!QEyes^%6!5l?C%+9FIrS z_HJ)jFNDNIS~@3(1qnJGLTJO|1LcQpRQSP^MCy}p$!8a{NX&cv^yV&5XU}Sm0vwKh z6gSEx%bt_&pgD|dY&yszJ%{1OxTK5tU=kOd4a>M9k8tixZK*b7yq~ZOvopp0;Zmbq z5mE_SzX%ZPLh56w)@hu6Qy!={V3l>m?!Zme^$7LC*h~F;ly0j zdNOzy(j{b&IyYp4GN7u749K6B$(MnS1AG~9&%$P8!2Uza{5;8E^z)#}@~iAvSHEOo zIqwJu#;5H!)(ZO0crZEgXZT|?C))efUA2w;LWw-v|<;@d#-{`?zFK)q{})?@S^;NF`}0L z5vIqbVbWuIDd$>6KRcIru`_-dQ}NI<;pyF)K04dxwo3#hJ?9{@`BE%{2dshLtIvbA zD_?iAbkE(vsUy4}J9S(>%sw6*x$W-K@q6zM?miG4xb0|(--PF#uRt&y%bC@8Des)K zXW6Cv?bey7g8&@U_3^KDoWdim$APbUg>d?vUF5{JEcqnQB1n9bavgAdo3}SytE|)> z@n6?HqGUpIt!s)gFxf5FPXM>-#+j=lV_^GB})XN@nJcB~luRzKmu4Ya{^= z5~n%8OkGq>LsmHH zupN8hE&IH5h~IK~Zr2aJc#$i0z~*^cr`HMFTt3OU@ylQFVKh<0ua=MRN3Qg!)B`;o~=YRF7UxI4rxcfCm|OWp4kS4XH4Z`s?5DVyo$Ko3yS?4z36OMo|}0v{uX9Gl6NEFu^CP*|ki{2#aMcW+8BX*Wg#U*_W)B6M5 zBu|`olhxS_=;p5vWKCbooC?Wu7 z`P?)gEDzIegb(VpFOMmNojhg`fP1!lFdeUr@bRBqN_|^>VLe zl%I4(_Z=7`8(1QMB~P@OvE3Mp7eXKq2*)&VW1OF+Kg)K~*1Q83cxJpf;zH+zuU~;b z<|(=FdZTt~P#>guywA%c|18U$A5!l1@_&CK|DR47f7Q#QR9$T}&at2X!mU@gu+vhv zp`?ooI;c)nuD=G_Qg@|NYYpcJVxw!fgoPzKriB~36F2qW@A)g9{~_zY5BRh{JEe~d zmpaiyt5LIZ?v^}&!L^ytsZ8juOsMklPMaTfl4GM+b$jKWcg`2#th4Jf;GYEi`hNJ> z2LRulf^)6q30#-O@Ec;Ukqh&B64#Ah1o=eTu}7IUvm_=haX!wpLvTp{D6X4Q^a+0u z*PaYG`=&4jzY2N%0pK@FKg8-bna<@+?T}}TcgLP`I7_WgCBhcj)@uP09l%&_?5i#w zF=4&dsPzm1i-Z1Y>~9@THCkLXN=*7tgRy_Yb9w*|`2ldIWqH4atB@)e;A8&<_|+*m zWV;ppTyXUe*}fP!tmB)TttMJcqqW9vQi?0(1?{aFn8p{wi zZz~5_GaTl2Z<&QxXc2yU3@3`fF<#nwig0s=pFOcF>~(6(%l^2A=_$$C47$A-o}l|~ z!q=gTdC#pM1m0YuR_V0x>eAj5MNw!DHmt_7z&zX54<+$>XTv%s+hmB9&;gd|6G>bg zR3~S{b`_CzO1#eu!V}3E8BGH3b4k2v>rAt|Qd{bU_{d6; z{W$Of$}@~3$d}s3N8rzq^KykEmNe)CxBeYqc>>^wPuO=(M^RfKG3@)8BKGl6ha`I?`7Q8gn&F`zWw3?2V=E3$NwD9!vpjZi)I2j?h0YhnK zjT{*K9rU=U0#so}p=>Yl^#gLT_;lKy3o&*ABe zLp~A5c(l1~ccmuU};cag zmQUKo=X&NZ^nBZ*H12=s%o8lT7Cd($c=8%XvkQ5&9UbXF0gXr1=C5l9bBW>b;b{%|cA_adE z_~uOC3|_n=)0FmK4x*hr7ENelZD`wfGVrk-z(4Lxa9JS?>IhxDiX0=sJAs88(BZnMrGn=k|jF#X+H!m@EB&iee z(M|E5$?Jh@&Ir%K^^WoJcww5~%;3e)_tKbSi5ySAH!uzJHpf-jc7BODZ##=8!QBhB z6T0N(%LD29yvR_^@$wG?(pbSuQztK^|MWmykG>}#%Ks+=(R*p$Abn1~O1b?F;2@Lij>hLgBxAD6y412=Va zlGGD%SBB!obxPdcFkHKepgdg6#=7$M|0>{}%)ry5R45ya z-^TCHz(Jpok57*<`Zft%{C5NY-e6AgSWj@hV^2tzdABogIZi;d<1ee<0FJy0kq+ju z$Fs(E`nA56!TeJq#aHsk5y_LXdo+VD?}!k=gN+&gXa=6?bKKD%4mWG;M_lhH4~P3l z8FW*}bqFrT@az6h12$mmbwV%xKvE8apH3c9K{;KHYrX$!4Eyf|)35ViiZMeU8X@YD z{BH$i|CHg?i=PH^`~^PwB;J<>;+eN(Tb}W+3m!B^@{2dFGX4diWByM;t+OAA1I{?i z4FykVTK5l**v24!-2At~rj>tuB=i1PNe?R`dB-0|D{tR7@qHg1+xVgXlVRPj_n#Eh z{rG=N9&z2v$FT$I{yF|LWc){xSO15LTApG5WP$FCKO^ZeX##oq9}n8}6JrwJ{}G+W zUn=qaAGc}#!~VHK-TjKB$ATyFPyh1-J@ACF`F_0rgAp#2+TV`o_b=XFxI;+)(mwj@ zrl00#H`7Wl^*s%F{{Q|@5bW)Q8S7<#G@-KYN?H3qGGIK`nVm`GOn|L>8 z;pygQ&>}s~Q>^!&8Omzdzhn?Uaf{^DzcE~Seoa3w@kVUR3+%$gor2fDIoir*;vSPv z-=<&2V=Zdpgv8s;x0WttaZ2C=Hq2VQD}ZO-;rchSl0Izbgc-voicaPrS)U)Bdi&vo{YB2k$kT z`o|d8Gt&Q9;yka>i+EEDY3~4EPue2mk=UogxX<}HEW#22QM-%4U{&BT{D z^Js-f`j}^)_^QBoGgGGu|BD#z#%aX=W(+TCeuV#h42PLDe2~ZQOmo3Hx!}t@FmFHc zw25Rn&1%2Fpt^5~@H(fO_ zgXJSwNl<8tK8oC1CL9+58yydg=uR^*nW00Qg=*yg3bmC~J~ zNKg#4KgU4ujD_UBrRca7eS3Z@rd2*fJNwgc-#lk7G@Mwf@O^=$9 zV2VF1vX#Mi67TnY!IS|=r8%+*1P>}$l0XGujx-9Jgty}MYR?Ku40#C6F7r%Cs>X6txAdjMVW-@K zoTo78wG6>@QVq{pVsTxWvc}7-G!bm6-5`c}ORpZ(UugBfsWs4Gil6TqeG@rK5bdFf zKXNw8-P7Qb`(NJwc2AC>c!Y8kA`Y78`nR3t6pJf|YjF z)`Y(U*=c-YiQUwyixX~}s|{3ZuN>CP{IMJx2p&c;DO^(!iW;&t?3U|i%ICTv^w%s` z<9B+!l~y&t+hVN}m3rrJ9un8fI#E5sKSDzqL~l)#6{0Dz!V3csuGE%S0(Kx+eyuh` zIULLdO$4hgh9kt?cqM8X;wvjriOsDf_6I5{rmnOIdrCzSa~FrYRoQnVO%BGgBs(rJ zsnTKq50Jw43I@zRiZ16X+|~^eE0$`fo2@fvR?1j~ueM;(4Af;vLNIEjR0o;IAG zf_R)Nmt;9#U}(%G*<2CS%ZoVeOBcIoUn6VM6{gw63)Zo2#4wr%X=`gO{1nZDV~3;% z=k8_xOA)G5((Z>p>Wh~w{RK(q$AY8tV?i;oV3=4D^a7aV_CvEKq|0>@<<{d+-MZT5 zyjVqYek^LiuZv;M3$UB_##)xQR;6ALNvg64s#lV+k=CW1v9WXvEwoyQfu6R@b7_1Uwn#Zn1K=S@u&3&==cyxy!Ph{JBn zFc41}8RlzCqTZaDWA*3>i{M(0uR~whtihr|tkmF2E#SFHnEw%@B7b`oOTxDqoZ1ji zHlViL0Rx4AA9%;%Vj$lJ^J`mtbsNNQ+Z?_&JJKU9VVA%ADly>4d|)llTfxPY?3hp9 zDD}0`yd#<~MDQ9?;zs~{a>R>^jLK^kZXnlQ#rUMXTI6kpy^p*L84q7#*fV)=M-uem dMDSi~tZ|39#DoWH)hf6A$Uam0@kSy3{{wAW_wWD! literal 0 HcmV?d00001 diff --git a/lab6/archive/rootfs/one b/lab6/archive/rootfs/one new file mode 100644 index 000000000..50ecbb596 --- /dev/null +++ b/lab6/archive/rootfs/one @@ -0,0 +1,3 @@ +1 2 3 +4 5 6 +7 8 9 diff --git a/lab6/archive/rootfs/two b/lab6/archive/rootfs/two new file mode 100644 index 000000000..599c97676 --- /dev/null +++ b/lab6/archive/rootfs/two @@ -0,0 +1,3 @@ +hello + world + !!!!! diff --git a/lab6/bootloader/linker.ld b/lab6/bootloader/linker.ld new file mode 100644 index 000000000..2efc319db --- /dev/null +++ b/lab6/bootloader/linker.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x60000; + _stext = .; + .text : { + *(.text.relo) + _bl_entry = .; + *(.text.boot) + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + + _blsize = _ebss - _stext; +} diff --git a/lab6/bootloader/main.c b/lab6/bootloader/main.c new file mode 100644 index 000000000..a18076e82 --- /dev/null +++ b/lab6/bootloader/main.c @@ -0,0 +1,48 @@ +#include "mini_uart.h" +#include "utils_c.h" +#include "utils_s.h" +#include +#define BUFFER_MAX_SIZE 256u + +extern char *_dtb; +void load_img() +{ + char * kernel_addr = (char *)0x80000; + uart_send_string("Please sent the kernel image size:"); + char buffer[BUFFER_MAX_SIZE]; + // read_command(buffer); + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); + unsigned int img_size = utils_str2uint_dec(buffer); + uart_send_string("Start to load the kernel image... \n"); + + unsigned char *current = (unsigned char *)kernel_addr; + while (img_size--) + { + *current = uart_recv_raw(); + current++; + uart_send('.'); + } + uart_send_string("loading...\n"); + // branchAddr(kernel_addr); + ((void (*)(char *))kernel_addr)(_dtb); +} + +void bootloader_main(void) +{ + uart_init(); + uart_send_string("In bootloader_main!\n"); + load_img(); +} \ No newline at end of file diff --git a/lab6/bootloader/start.S b/lab6/bootloader/start.S new file mode 100644 index 000000000..549ee4109 --- /dev/null +++ b/lab6/bootloader/start.S @@ -0,0 +1,46 @@ +.section ".text.relo" +.globl _start + +# need to relocate the bootloader from 0x80000 to 0x60000 +_start: + adr x10, . //x10=0x80000 + ldr x11, =_blsize + add x11, x11, x10 + ldr x12, =_stext // x12=0x60000 + +moving_relo: + cmp x10, x11 //without bootloader + b.eq end_relo + ldr x13, [x10] + str x13, [x12] //move 0x80000 data to 0x60000 + add x12, x12, #8 + add x10, x10, #8 + b moving_relo +end_relo: + ldr x14, =_bl_entry //jump to boot part + br x14 + + +.section ".text.boot" +.globl _start_bl + ldr x20, =_dtb + str x0, [x20] + mrs x20, mpidr_el1 + and x20, x20,#0xFF // Check processor id + cbz x20, master // Hang for all non-primary CPU + +hang: + b hang + +master: + adr x20, _sbss + adr x21, _ebss + sub x21, x21, x20 + bl memzero + + mov sp, #0x400000 // 4MB + bl bootloader_main + +.global _dtb +.section .data +_dtb: .dc.a 0x0 diff --git a/lab6/include/_cpio.h b/lab6/include/_cpio.h new file mode 100644 index 000000000..52e4fd260 --- /dev/null +++ b/lab6/include/_cpio.h @@ -0,0 +1,33 @@ +#ifndef __CPIO_H +#define __CPIO_H +#include +#include "mmu.h" + +/* + cpio archive comprises a header record with basic numeric metadata followed by + the full pathname of the entry and the file data. +*/ +typedef struct cpio_header +{ + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; // determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; // determine when two entries refer to the same file. + char c_mode[8]; // specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +} cpio_header; + +void cpio_ls(); +void cpio_cat(const char *filename); +char *findFile(const char *name); +size_t cpio_load_program(const char *filename, void **put_addr, pd_t *table); +#endif \ No newline at end of file diff --git a/lab6/include/current.h b/lab6/include/current.h new file mode 100644 index 000000000..9cc1e993a --- /dev/null +++ b/lab6/include/current.h @@ -0,0 +1,16 @@ +#ifndef _CURRENT_H +#define _CURRENT_H + +#include "thread.h" + +static inline struct task *get_thread_ds() +{ + return (struct task *)read_sysreg(tpidr_el1); +} +static inline void set_thread_ds(struct task *cur) +{ + write_sysreg(tpidr_el1, cur); +} +#define current get_thread_ds() + +#endif diff --git a/lab6/include/dtb.h b/lab6/include/dtb.h new file mode 100644 index 000000000..461f32cbe --- /dev/null +++ b/lab6/include/dtb.h @@ -0,0 +1,39 @@ +#ifndef _DTB_H +#define _DTB_H +#include +#include +/* + structure block: located at a 4-byte aligned offset from the beginning of the devicetree blob + token is a big-endian 32-bit integer, alligned on 32bit(padding 0) + +*/ + +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef struct fdt_header +{ + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +} fdt_header; + +typedef void (*fdt_callback)(int type, const char *name, const void *data, uint32_t size); +void print_dtb(int type, const char *name, const void *data, uint32_t size); +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size); +int fdt_traverse(fdt_callback cb); + +extern uintptr_t dtb_end, dtb_start; +extern char *initramfs_start, *initramfs_end; + +#endif \ No newline at end of file diff --git a/lab6/include/exception_c.h b/lab6/include/exception_c.h new file mode 100644 index 000000000..c47caa49c --- /dev/null +++ b/lab6/include/exception_c.h @@ -0,0 +1,17 @@ +#ifndef _EXCEPTION_C_H +#define _EXCEPTION_C_H +#include +#include "trap_frame.h" +typedef void (*task_callback)(void *); + +void enable_interrupt(); +void disable_interrupt(); +unsigned long disable_irq(); +void irq_restore(unsigned long flag); + +void default_handler(); +void lower_sync_handler(TrapFrame *_regs); +void irq_handler(); +void curr_sync_handler(); + +#endif diff --git a/lab6/include/exception_s.h b/lab6/include/exception_s.h new file mode 100644 index 000000000..fd2409595 --- /dev/null +++ b/lab6/include/exception_s.h @@ -0,0 +1,6 @@ +#ifndef _EXCEPTION_S_H +#define _EXCEPTION_S_H + +void restore_regs_eret(); + +#endif diff --git a/lab6/include/exec.h b/lab6/include/exec.h new file mode 100644 index 000000000..2676c33ae --- /dev/null +++ b/lab6/include/exec.h @@ -0,0 +1,7 @@ +#ifndef __EXEC_H_ +#define __EXEC_H_ + +void exe_new_prog(char *filename); +int do_exec(const char *path, const char *argv[]); + +#endif \ No newline at end of file diff --git a/lab6/include/fork.h b/lab6/include/fork.h new file mode 100644 index 000000000..3fa7d5d3b --- /dev/null +++ b/lab6/include/fork.h @@ -0,0 +1,8 @@ +#ifndef __FORK_H_ +#define __FORK_H_ +#include +#include "trap_frame.h" + +size_t do_fork(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab6/include/list.h b/lab6/include/list.h new file mode 100644 index 000000000..0f886e233 --- /dev/null +++ b/lab6/include/list.h @@ -0,0 +1,45 @@ +#ifndef __LIST_H +#define __LIST_H +#include +#include + +typedef struct list +{ + struct list *next, *prev; +} list; + +#define container_of(ptr, type, member) ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); }) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +#define list_for_each_entry(entry, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) + +#define LIST_HEAD_INIT(name) \ + { \ + &(name), &(name) \ + } + +static inline int list_empty(const list *head) +{ + return head->next == head; +} + +void list_init(list *node); +void insert_head(list *head, list *v); +void insert_tail(list *head, list *v); +list *remove_head(list *head); +list *remove_tail(list *head); +void unlink(list *node); +#endif diff --git a/lab6/include/mini_uart.h b/lab6/include/mini_uart.h new file mode 100644 index 000000000..2c17055b3 --- /dev/null +++ b/lab6/include/mini_uart.h @@ -0,0 +1,22 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + + +void delay(unsigned int clock); +void enable_uart_interrupt(); +void disable_uart_interrupt(); +void uart_init(); +void uart_send_string(const char* str); +void uart_send(const char c); +char uart_recv(); +char uart_recv_raw(); +void uart_hex(unsigned int d); +void uart_dec(unsigned int num); +void uart_handler(); +void test_uart_async(); +char uart_async_recv(); +void uart_async_send_string(char *str); +void uart_async_send(char c); + +unsigned int uart_printf(char* fmt, ...); +#endif \ No newline at end of file diff --git a/lab6/include/mm.h b/lab6/include/mm.h new file mode 100644 index 000000000..0294a50af --- /dev/null +++ b/lab6/include/mm.h @@ -0,0 +1,47 @@ +#ifndef _MM_H +#define _MM_H + +#include +#include + +#define STARTUP_MEM_START (PHYS_OFFSET + 0x07000000) +#define STARTUP_MEM_END (PHYS_OFFSET + 0x07ffffff) + +typedef struct FrameFlag +{ + unsigned char flag; + unsigned char order; + unsigned short ref_count; + unsigned char chunk_order; +} FrameFlag; + +typedef struct Chunk +{ + struct Chunk *next; +} Chunk; + +// buddy system +void init_buddy(); +void *alloc_pages(unsigned int pages); +void free_pages(void *victim); + +// dynamic mem allocate +void *kmalloc(unsigned int size); +void *kcalloc(unsigned int size); +void kfree(void *ptr); + +// test +void test_buddy(); +void test_dynamic_alloc(); + +// others +void memory_reserve(uintptr_t start, uintptr_t end); +void mm_init(); +void merge_useful_pages(); + +// start up allocation +void *smalloc(size_t size); + + +#endif + diff --git a/lab6/include/mmu.h b/lab6/include/mmu.h new file mode 100644 index 000000000..9dd25eb32 --- /dev/null +++ b/lab6/include/mmu.h @@ -0,0 +1,53 @@ +#ifndef __MMU_H_ +#define __MMU_H_ + +#include "exception_c.h" +typedef unsigned long pd_t; + +#define PHYS_OFFSET 0xffff000000000000 +#define PAR_PA_MASK 0xffffffff000L + +#define PAGE_SIZE 0x1000 +#define USTACK_VA 0xffffffffb000 +#define STACK_SIZE 0x4000 +#define UPROG_VA 0x0 + +#define PD_TABLE 0b11 +#define PD_BLOCK 0b01 +#define PD_PAGE 0b11 +#define PD_ACCESS (1 << 10) // Flag set +#define PD_USER_RW (0b01 << 6) +#define PD_USER_R (0b11 << 6) +#define PD_UXN (1L << 54) // Unprivileged eXecute Never +#define PD_PXN (1L << 53) // Privileged eXecute Never + +// #define pa2va(p) (((unsigned long)(p + PHYS_OFFSET))) +// #define va2pa(p) (((unsigned long)(p - PHYS_OFFSET))) + +static inline void *pa2va(unsigned long p) +{ + return (void *)(p + PHYS_OFFSET); +} + +static inline unsigned long va2pa(void *p) +{ + return (unsigned long)p - PHYS_OFFSET; +} + +#define IDENTITY_TT_L0 ((pd_t *)0x1000L) +#define IDENTITY_TT_L1 ((pd_t *)0x2000L) +#define IDENTITY_TT_L0_VA ((pd_t *)pa2va(0x1000L)) +#define IDENTITY_TT_L1_VA ((pd_t *)pa2va(0x2000L)) + +void setup_identity_mapping(); +void setup_kernel_space_mapping(); +void map_page(pd_t *table, unsigned long va, unsigned long pa, unsigned long flags); +void *alloc_stack(pd_t *table, unsigned long size); +void *alloc_prog(pd_t *table, unsigned long size, const char *file_content); +void setup_peripheral_identity(pd_t *table); +unsigned long get_pte(unsigned long va); +unsigned long el0_va2pa(unsigned long va); +void free_page_table(pd_t *table); +void replace_page_table(); + +#endif diff --git a/lab6/include/peripheral/base.h b/lab6/include/peripheral/base.h new file mode 100644 index 000000000..d9c9422a5 --- /dev/null +++ b/lab6/include/peripheral/base.h @@ -0,0 +1,9 @@ +#ifndef _PERIPHERAL_BASE_H +#define _PERIPHERAL_BASE_H + +#include "mmu.h" + +#define MMIO_BASE PHYS_OFFSET + 0x3F000000 +#define MAILBOX_BASE MMIO_BASE + 0xb880 + +#endif \ No newline at end of file diff --git a/lab6/include/peripheral/gpio.h b/lab6/include/peripheral/gpio.h new file mode 100644 index 000000000..8246c40ae --- /dev/null +++ b/lab6/include/peripheral/gpio.h @@ -0,0 +1,12 @@ +#ifndef _PERIPHERAL_GPIO_H +#define _PERIPHERAL_GPIO_H + +#include "peripheral/base.h" + +#define GPFSEL1 ((volatile unsigned int *)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int *)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int *)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int *)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int *)(MMIO_BASE+0x00200098)) + +#endif \ No newline at end of file diff --git a/lab6/include/peripheral/mailbox.h b/lab6/include/peripheral/mailbox.h new file mode 100644 index 000000000..fc26769a9 --- /dev/null +++ b/lab6/include/peripheral/mailbox.h @@ -0,0 +1,36 @@ +#ifndef _MAILBOX_H +#define _MAILBOX_H + +#include "peripheral/base.h" + +#define MAILBOX_READ ((volatile unsigned int *)(MAILBOX_BASE)) +#define MAILBOX_STATUS ((volatile unsigned int *)(MAILBOX_BASE + 0x18)) +#define MAILBOX_WRITE ((volatile unsigned int *)(MAILBOX_BASE + 0x20)) + +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 +#define MAILBOX_RESPONSE 0x80000000 +#define ARM_MEMORY 0x00010005 + +#define GET_BOARD_REVISION 0x00010002 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +#define MAILBOX_CH_POWER 0 +#define MAILBOX_CH_FB 1 +#define MAILBOX_CH_VUART 2 +#define MAILBOX_CH_VCHIQ 3 +#define MAILBOX_CH_LEDS 4 +#define MAILBOX_CH_BTNS 5 +#define MAILBOX_CH_TOUCH 6 +#define MAILBOX_CH_COUNT 7 +#define MAILBOX_CH_PROP 8 + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox); +unsigned int get_board_revision(); +void get_arm_memory(); + +#endif \ No newline at end of file diff --git a/lab6/include/peripheral/mini_uart.h b/lab6/include/peripheral/mini_uart.h new file mode 100644 index 000000000..0ac714e1c --- /dev/null +++ b/lab6/include/peripheral/mini_uart.h @@ -0,0 +1,30 @@ +#ifndef _PERIPHERAL_MINI_UART_H +#define _PERIPHERAL_MINI_UART_H + +#include "peripheral/base.h" + +#define AUX_ENABLE ((volatile unsigned int *)(MMIO_BASE + 0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int *)(MMIO_BASE + 0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215068)) + + + +#define ARM_IRQ_REG_BASE ((volatile unsigned int*)(MMIO_BASE + 0x0000b000)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b204)) +#define ENB_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b210)) +#define DISABLE_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b21c)) +#define AUX_IRQ (1 << 29) + + + + +#endif \ No newline at end of file diff --git a/lab6/include/sche.h b/lab6/include/sche.h new file mode 100644 index 000000000..740fdc955 --- /dev/null +++ b/lab6/include/sche.h @@ -0,0 +1,64 @@ +#ifndef __SCHE_H +#define __SCHE_H +#include "list.h" +#include "signal.h" +#include "mmu.h" + +typedef unsigned long pid_t; +typedef enum +{ + TASK_RUNNING, + TASK_WAITING, + TASK_STOPPED, + TASK_INIT, +} state_t; + +struct cpu_context +{ + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long fp; + unsigned long sp; + unsigned long lr; +}; + +struct task +{ + struct cpu_context cpu_context; + char *kernel_stack; + char *user_stack; + char *user_prog; + size_t user_prog_size; + state_t state; + pid_t pid; + unsigned need_resched; + int exitcode; + unsigned long timeout; + list list; + struct signal *signal; + struct signal_context *sig_context; + pd_t *ttbr0; +}; + +extern list running_queue, waiting_queue, stopped_queue; +void add_task(struct task *t); +void kill_task(struct task *_task, int status); +void restart_task(struct task *_task); +void pause_task(struct task *_task); +void sleep_task(size_t ms); +void free_task(struct task *victim); +struct task *create_task(); +void switch_task(struct task *next); +struct task *pick_next_task(); +int get_the_cur_count(); +struct task *get_task(pid_t target); +extern pid_t task_count; +#endif \ No newline at end of file diff --git a/lab6/include/shell.h b/lab6/include/shell.h new file mode 100644 index 000000000..08f251990 --- /dev/null +++ b/lab6/include/shell.h @@ -0,0 +1,7 @@ +#ifndef _SHELL_H +#define _SHELL_H + +void shell(); +void read_command(char *str); +void parse_command(char *str); +#endif \ No newline at end of file diff --git a/lab6/include/signal.h b/lab6/include/signal.h new file mode 100644 index 000000000..768e13b87 --- /dev/null +++ b/lab6/include/signal.h @@ -0,0 +1,27 @@ +#ifndef __SIGNAL_H +#define __SIGNAL_H + +#define SIGKILL 9 + +#include "list.h" +#include "trap_frame.h" +#define SIG_NUM (sizeof(signal_table) / sizeof(signal_table[0])) +typedef void (*signal_handler)(int); + +struct signal +{ + unsigned int sig_num; + signal_handler handler; + struct list list; +}; +struct signal_context +{ + TrapFrame *trapframe; + char *user_stack; +}; + +extern signal_handler signal_table[]; + +void sig_context_update(TrapFrame *_regs, void (*handler)()); +void sig_context_restore(TrapFrame *_regs); +#endif diff --git a/lab6/include/sprintf.h b/lab6/include/sprintf.h new file mode 100644 index 000000000..a7c47f848 --- /dev/null +++ b/lab6/include/sprintf.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ +#ifndef __SPRINT_H +#define __SPRINT_H + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +#endif \ No newline at end of file diff --git a/lab6/include/syscall.h b/lab6/include/syscall.h new file mode 100644 index 000000000..f556cf61f --- /dev/null +++ b/lab6/include/syscall.h @@ -0,0 +1,29 @@ +#ifndef __SYSCALL_H +#define __SYSCALL_H + +#include "trap_frame.h" + +#define _STR(x) #x +#define STR(s) _STR(s) + +typedef void (*syscall)(TrapFrame *); + +enum { + SYS_GETPID, //0 + SYS_UART_RECV, + SYS_UART_WRITE, + SYS_EXEC, + SYS_FORK, + SYS_EXIT, //5 + SYS_MBOX, + SYS_KILL_PID, + SYS_SIGNAL, + SYS_SIGKILL, + SYS_SIGRETURN, //10 + NUM_syscalls +}; + +extern syscall syscall_table[]; +void syscall_handler(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab6/include/thread.h b/lab6/include/thread.h new file mode 100644 index 000000000..59d238278 --- /dev/null +++ b/lab6/include/thread.h @@ -0,0 +1,13 @@ +#ifndef _THREAD_H +#define _THREAD_H +#include "list.h" +#include "utils_s.h" +#include "sche.h" +#define STACK_SIZE 0x4000 + +void thread_kill_zombies(); +void thread_schedule(size_t _); +void thread_init(); +struct task *thread_create(void *func); +void test_thread(); +#endif diff --git a/lab6/include/timer.h b/lab6/include/timer.h new file mode 100644 index 000000000..cd987ec6d --- /dev/null +++ b/lab6/include/timer.h @@ -0,0 +1,39 @@ +#ifndef __TIMER_H +#define __TIMER_H +#include "stddef.h" +#include "mmu.h" +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int *)(PHYS_OFFSET + 0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int *)(PHYS_OFFSET + 0x40000060)) +#define DEFAULT_TIMEOUT 30LL +#define SCHE_CYCLE 30LL +#define SYSTEM_TIMER_MSG "system_timeout" +#define S(n) (n * 1000LL) +#define MS(n) (n * 1LL) +#define GET_S(n) (n / 1000LL) +#define GET_MS(n) (n % 1000LL) + +typedef void (*timer_callback)(size_t); + +void core_timer_enable(); +void core_timer_disable(); +void set_expired_time(unsigned long duration); +unsigned long get_current_time(); +void core_timer_handler(); +void set_timeout(char *message, unsigned long time); +void print_message(char *msg); +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duraction); +void timeout_event_init(); +void timer_handler(); + +typedef struct timeout_event +{ + unsigned long register_time; + unsigned long duration; + timer_callback callback; + size_t arg; + struct timeout_event *prev, *next; +} timeout_event; + +extern timeout_event *timeout_queue_head, *timeout_queue_tail; + +#endif diff --git a/lab6/include/trap_frame.h b/lab6/include/trap_frame.h new file mode 100644 index 000000000..593c45d50 --- /dev/null +++ b/lab6/include/trap_frame.h @@ -0,0 +1,12 @@ +#ifndef __TRAP_FRAME_H +#define __TRAP_FRAME_H + +typedef struct +{ + unsigned long regs[31]; // general purpose regs x0~x30 + unsigned long sp; // sp_el0 + unsigned long pc; // elr_el1 + unsigned long pstate; // spsr_el1 +}TrapFrame; + +#endif \ No newline at end of file diff --git a/lab6/include/utils_c.h b/lab6/include/utils_c.h new file mode 100644 index 000000000..16e3f9d24 --- /dev/null +++ b/lab6/include/utils_c.h @@ -0,0 +1,33 @@ +#ifndef _UTILS_C_H +#define _UTILS_C_H +#include +#include +#include "mmu.h" +#define PM_PASSWORD (PHYS_OFFSET + 0x5a000000) +#define PM_RSTC (PHYS_OFFSET + 0x3F10001c) +#define PM_WDOG (PHYS_OFFSET + 0x3F100024) + + +/* string */ +int utils_str_compare(const char *a, const char *b); +int utils_strncmp(const char *a, const char *b, size_t n); +void utils_newline2end(char *str); +char utils_int2char(int a); +void utils_int2str_dec(int a, char *str); +void utils_uint2str_dec(unsigned int num, char *str); +unsigned int utils_str2uint_dec(const char *str); +void align(void *size, size_t s); // aligned to 4 byte +size_t utils_strlen(const char *s); +uint32_t align_up(uint32_t size, int alignment); + +/* reboot */ +void set(long addr, unsigned long value); +void reset(int tick); +void cancel_reset(); + +/* others */ +void delay(unsigned int clock); +void memcpy(void *dst, const void *src, size_t n); +void *memset(void *s, int c, size_t n); + +#endif diff --git a/lab6/include/utils_s.h b/lab6/include/utils_s.h new file mode 100644 index 000000000..6f5a01825 --- /dev/null +++ b/lab6/include/utils_s.h @@ -0,0 +1,41 @@ +#ifndef __UTILS_S_H +#define __UTILS_S_H + +#define read_sysreg(r) ({ \ + unsigned long __val; \ + asm volatile("mrs %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_sysreg(r, __val) ({ \ + asm volatile("msr " #r ", %0" ::"r"(__val)); \ +}) + +#define read_gpreg(r) ({ \ + unsigned long __val; \ + asm volatile("mov %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_gpreg(r, __val) ({ \ + asm volatile("mov " #r ", %0" ::"r"(__val)); \ +}) + + +// EC,bits[31:26] +#define ESR_ELx_EC(esr) ((esr & 0xFC000000) >> 26) +// ISS,bits[24:0] +#define ESR_ELx_ISS(esr) (esr & 0x03FFFFFF) + +#define ESR_ELx_EC_SVC64 0b010101 +#define ESR_ELx_EC_DABT_LOW 0b100100 +#define ESR_ELx_EC_IABT_LOW 0b100000 + + +void branchAddr(void *addr); +int get_el(); +void switch_to(void *, void *); + +#endif diff --git a/lab6/kernel/exception_c.c b/lab6/kernel/exception_c.c new file mode 100644 index 000000000..5d5472def --- /dev/null +++ b/lab6/kernel/exception_c.c @@ -0,0 +1,109 @@ +#include "utils_s.h" +#include "mini_uart.h" +#include "timer.h" +#include "peripheral/mini_uart.h" +#include "exception_c.h" +#include "current.h" +#include "thread.h" +#include "syscall.h" +#define AUX_IRQ (1 << 29) + +void enable_interrupt() { asm volatile("msr DAIFClr, 0xf"); } +void disable_interrupt() { asm volatile("msr DAIFSet, 0xf"); } +unsigned long disable_irq() +{ + unsigned long flag = read_sysreg(DAIF); + disable_interrupt(); + return flag; +} +void irq_restore(unsigned long flag) +{ + write_sysreg(DAIF, flag); +} + +void default_handler() +{ + unsigned long spsr = read_sysreg(spsr_el1); + unsigned long elr = read_sysreg(elr_el1); + unsigned long esr = read_sysreg(esr_el1); + uart_printf("spsr_el1: %x\n", spsr); + uart_printf("elr_el1: %x\n", elr); + uart_printf("esr_el1: %x\n\n", esr); +} + +void lower_irq_handler() +{ + unsigned long current_time = get_current_time(); + uart_printf("After booting: %d seconds\n\n", current_time); + set_expired_time(2); +} + +int data_abort = 0; +int ins_abort = 0; +void lower_sync_handler(TrapFrame *_regs) +{ + unsigned long esr = read_sysreg(esr_el1); // cause of that exception + unsigned int ec = ESR_ELx_EC(esr); + switch (ec) + { + case ESR_ELx_EC_SVC64: + enable_interrupt(); + syscall_handler(_regs); + disable_interrupt(); + break; + case ESR_ELx_EC_DABT_LOW: + if (!data_abort) + { + data_abort = 1; + uart_send_string("in Data Abort\n"); + } + break; + case ESR_ELx_EC_IABT_LOW: + if (!ins_abort) + { + ins_abort = 1; + uart_send_string("in Instruction Abort\n"); + } + break; + default: + return; + } +} + +void irq_handler() +{ + unsigned int irq_is_pending = (*IRQ_PENDING_1 & AUX_IRQ); + unsigned int uart = (*AUX_MU_IIR_REG & 0x1) == 0; + unsigned int core_timer = (*CORE0_INTERRUPT_SOURCE & 0x2); + if (irq_is_pending && uart) + { + uart_handler(); + } + else if (core_timer) + { + timer_handler(); + } +} + +int a = 0; +void curr_sync_handler() +{ + if (!a) + { + uart_send_string("!!! in current sync handler !!!\n"); + a = 1; + } + return; +} + +void curr_fiq_handler() +{ + uart_send_string("!!! in current fiq handler !!!\n"); + return; +} + +void curr_serr_handler() +{ + uart_send_string("!!! in current serr handler !!!\n"); + return; +} diff --git a/lab6/kernel/exception_s.S b/lab6/kernel/exception_s.S new file mode 100644 index 000000000..d9b5fbecf --- /dev/null +++ b/lab6/kernel/exception_s.S @@ -0,0 +1,214 @@ +// save general registers to stack +.macro save_gp_reg + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_gp_reg + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + +// save all gp_regs and exc_regs +.macro kernel_entry el + sub sp, sp, 17 * 16 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + + .if \el == 0 + mrs x0, sp_el0 + stp x30, x0, [sp, 16 * 15] + .else + str x30, [sp, 16 * 15] + .endif + + mrs x0, elr_el1 + mrs x1, spsr_el1 + stp x0, x1, [sp, 16 * 16] + + mov x0, sp +.endm + + +// load all gp_regs and exc_regs +.macro kernel_exit el + ldp x0, x1, [sp, 16 * 16] + msr elr_el1, x0 + msr spsr_el1, x1 + + .if \el ==0 + ldp x30, x0, [sp, 16 * 15] + msr sp_el0, x0 + .else + ldr x30, [sp, 16 * 15] + .endif + + ldp x28, x29, [sp ,16 * 14] + ldp x26, x27, [sp ,16 * 13] + ldp x24, x25, [sp ,16 * 12] + ldp x22, x23, [sp ,16 * 11] + ldp x20, x21, [sp ,16 * 10] + ldp x18, x19, [sp ,16 * 9] + ldp x16, x17, [sp ,16 * 8] + ldp x14, x15, [sp ,16 * 7] + ldp x12, x13, [sp ,16 * 6] + ldp x10, x11, [sp ,16 * 5] + ldp x8, x9, [sp ,16 * 4] + ldp x6, x7, [sp ,16 * 3] + ldp x4, x5, [sp ,16 * 2] + ldp x2, x3, [sp ,16 * 1] + ldp x0, x1, [sp ,16 * 0] + add sp, sp, 17 * 16 + + eret +.endm + +.global restore_regs_eret +restore_regs_eret: + bl replace_page_table + ldp x0, x1, [sp, 16 * 16] + msr elr_el1, x0 + msr spsr_el1, x1 + + ldp x30, x0, [sp, 16 * 15] + msr sp_el0, x0 + + ldp x28, x29, [sp ,16 * 14] + ldp x26, x27, [sp ,16 * 13] + ldp x24, x25, [sp ,16 * 12] + ldp x22, x23, [sp ,16 * 11] + ldp x20, x21, [sp ,16 * 10] + ldp x18, x19, [sp ,16 * 9] + ldp x16, x17, [sp ,16 * 8] + ldp x14, x15, [sp ,16 * 7] + ldp x12, x13, [sp ,16 * 6] + ldp x10, x11, [sp ,16 * 5] + ldp x8, x9, [sp ,16 * 4] + ldp x6, x7, [sp ,16 * 3] + ldp x4, x5, [sp ,16 * 2] + ldp x2, x3, [sp ,16 * 1] + ldp x0, x1, [sp ,16 * 0] + add sp, sp, 17 * 16 + + eret + + + +.macro exception_entry label + .align 7 + b \label // branch to a handler function. + +.endm + + +.global el1_vector_base + +.align 11 +el1_vector_base: + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + + + exception_entry _el1_curr_el_spx_sync + exception_entry _el1_curr_el_spx_irq + exception_entry _el1_curr_el_spx_fiq + exception_entry _el1_curr_el_spx_serr + + + exception_entry _el1_lower_el_aarch64_sync + exception_entry _el1_lower_el_aarch64_irq + exception_entry exception_handler + exception_entry exception_handler + + + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + + +_el1_lower_el_aarch64_sync: + kernel_entry 0 + bl lower_sync_handler + kernel_exit 0 + +_el1_lower_el_aarch64_irq: + kernel_entry 0 + bl irq_handler + kernel_exit 0 + +_el1_curr_el_spx_sync: + save_gp_reg + bl curr_sync_handler + load_gp_reg + eret + +_el1_curr_el_spx_irq: + kernel_entry 1 + bl irq_handler + kernel_exit 1 + +_el1_curr_el_spx_fiq: + save_gp_reg + bl curr_fiq_handler + load_gp_reg + eret + +_el1_curr_el_spx_serr: + save_gp_reg + bl curr_serr_handler + load_gp_reg + eret + +exception_handler: + save_gp_reg + bl default_handler + load_gp_reg + eret diff --git a/lab6/kernel/linker.ld b/lab6/kernel/linker.ld new file mode 100644 index 000000000..e78847942 --- /dev/null +++ b/lab6/kernel/linker.ld @@ -0,0 +1,34 @@ +_skernel = 0xffff000000080000; +_ekernel = 0xffff000000400000; +/* _skernel = 0x80000; +_ekernel = 0x400000; */ + + +ENTRY(_start) +SECTIONS +{ + . = _skernel; + + _stext = .; + .text : { + *(.text.kernel) + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + + . = _ekernel; + +} \ No newline at end of file diff --git a/lab6/kernel/main.c b/lab6/kernel/main.c new file mode 100644 index 000000000..fdead5d8b --- /dev/null +++ b/lab6/kernel/main.c @@ -0,0 +1,36 @@ +#include "mini_uart.h" +#include "dtb.h" +#include "exception_c.h" +#include "utils_s.h" +#include "shell.h" +#include "mm.h" +#include "timer.h" +#include "thread.h" +#include "sche.h" +#include "exec.h" +#include "mmu.h" + +static void idle(void) +{ + while (1) + { + thread_kill_zombies(); + thread_schedule(0); + } +} + +void kernel_main(void *_dtb_ptr) +{ + dtb_start=(uintptr_t)_dtb_ptr; + uart_send_string("Hello, world!\n"); + mm_init(); + + setup_kernel_space_mapping(); + thread_init(); + // thread_create(&shell); + exe_new_prog("vm.img"); + timeout_event_init(); + add_timer((timer_callback)thread_schedule, (size_t)0, MS(SCHE_CYCLE)); + enable_interrupt(); + idle(); +} \ No newline at end of file diff --git a/lab6/kernel/start.S b/lab6/kernel/start.S new file mode 100644 index 000000000..1388af994 --- /dev/null +++ b/lab6/kernel/start.S @@ -0,0 +1,62 @@ +.section ".text.kernel" +.globl _start + +#define PA(p) (p - 0xffff000000000000) + +_start: + ldr x9, =PA(_ekernel) + mov sp, x9 + + /* store dtb pointer */ + sub sp, sp, #0x10 + str x0, [sp] + + mov x9, sp + msr sp_el1, x9 + + /* cpu id pass */ + mrs x20, mpidr_el1 + and x20, x20,#0xFF // Check processor id + cbz x20, master // Hang for all non-primary CPU + +hang: + b hang + +master: + ldr x20, =PA(_sbss) + ldr x21, =PA(_ebss) + sub x21, x21, x20 + bl memzero + + /* setup interrupt vector base */ + ldr x0, =el1_vector_base + msr vbar_el1, x0 + bl from_el2_to_el1 + + bl setup_identity_mapping + + mov x1, #0 + movk x1, #0xffff, lsl 48 // set 0xffff to x1 and shift left 48 bit --> set x1 hight 16 bit + // kernel space start address + mov x0, sp + orr x0, x0, x1 + mov sp, x0 + + mov x0, fp + orr fp, x0, x1 + + ldr x0, [sp] + orr x0, x0, x1 + + ldr x2, =_dtb_ptr + str x0, [x2] + + ldr x9, =kernel_main + br x9 + +hang2: + b hang2 + +.global _dtb_ptr +.section .data +_dtb_ptr: .dc.a 0x0 \ No newline at end of file diff --git a/lab6/loadImg/loadImg.py b/lab6/loadImg/loadImg.py new file mode 100644 index 000000000..6fb3542ce --- /dev/null +++ b/lab6/loadImg/loadImg.py @@ -0,0 +1,30 @@ +#! /usr/bin/python3 + +import os +from socket import timeout +import time +import sys +import serial +from time import sleep + +BAUD_RATE = 115200 + +def send_img(ser,kernel): + print("Please sent the kernel image size:") + kernel_size=os.stat(kernel).st_size + ser.write((str(kernel_size)+"\n").encode()) + print(ser.read_until(b"Start to load the kernel image... \r\n").decode(), end="") + + with open(kernel, "rb") as image: + while kernel_size > 0: + kernel_size -= ser.write(image.read(1)) + ser.read_until(b".") + print(ser.read_until(b"$ ").decode(), end="") + return + +if __name__ == "__main__": + ser = serial.Serial("/dev/ttyUSB0", BAUD_RATE, timeout=5) + send_img(ser,"../build/kernel8.img") + + + diff --git a/lab6/loadImg/loadImg.sh b/lab6/loadImg/loadImg.sh new file mode 100644 index 000000000..171507561 --- /dev/null +++ b/lab6/loadImg/loadImg.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +sudo chmod 666 /dev/ttyUSB0 +source ../.env/bin/activate +python3 ./loadImg.py \ No newline at end of file diff --git a/lab6/requirements.txt b/lab6/requirements.txt new file mode 100644 index 000000000..4d1aaa2b8 --- /dev/null +++ b/lab6/requirements.txt @@ -0,0 +1 @@ +pyserial==3.5 \ No newline at end of file diff --git a/lab6/src/_cpio.c b/lab6/src/_cpio.c new file mode 100644 index 000000000..95d5721ed --- /dev/null +++ b/lab6/src/_cpio.c @@ -0,0 +1,117 @@ +#include "_cpio.h" +#include "utils_c.h" +#include "dtb.h" +#include "mini_uart.h" +#include "timer.h" +#include "mm.h" +#include "mmu.h" + +unsigned int hex2dec(char *s) +{ + unsigned int r = 0; + for (int i = 0; i < 8; ++i) + { + if (s[i] >= '0' && s[i] <= '9') + { + r = r * 16 + s[i] - '0'; + } + else + { + r = r * 16 + s[i] - 'A' + 10; + } + } + return r; +} + +char *findFile(const char *name) +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + if ((utils_str_compare((char *)(addr + sizeof(cpio_header)), name) == 0)) + { + return addr; + } + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + addr += (headerPathname_size + file_size); + } + return 0; +} +void cpio_ls() +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_send_string(addr + sizeof(cpio_header)); // print the file name + uart_send_string("\n"); + + addr += (headerPathname_size + file_size); + } +} + +void cpio_cat(const char *filename) +{ + char *target = findFile(filename); + if (target) + { + cpio_header *header = (cpio_header *)target; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + char *file_content = target + headerPathname_size; + for (unsigned int i = 0; i < file_size; i++) + { + uart_send(file_content[i]); // print the file content + } + uart_send_string("\n"); + } + else + { + uart_send_string("Not found the file\n"); + } +} + +size_t cpio_load_program(const char *filename, void **target_addr, pd_t *table) +{ + char *prog_addr = findFile(filename); + if (prog_addr) + { + cpio_header *header = (cpio_header *)prog_addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_printf("load the %s\n", prog_addr + sizeof(cpio_header)); + + char *file_content = prog_addr + headerPathname_size; + *target_addr = alloc_prog(table, file_size, file_content); + + return file_size; + } + else + { + uart_send_string("Not found the program\n"); + return -1; + } +} diff --git a/lab6/src/dtb.c b/lab6/src/dtb.c new file mode 100644 index 000000000..6c6d0528c --- /dev/null +++ b/lab6/src/dtb.c @@ -0,0 +1,143 @@ +#include "dtb.h" +#include "_cpio.h" +#include "mini_uart.h" +#include "utils_c.h" +/* + It consists of + a small header + + the memory reservation block + space(aligned) + + the structure block + space(aligned) + + the strings block + space(aligned) +*/ +int space = 0; +char *initramfs_start, *initramfs_end; + +uint32_t get_le2be_uint(const void *p) +{ + // transfer little endian to big endian + const unsigned char *bytes = p; + uint32_t res = bytes[3]; + res |= bytes[2] << 8; + res |= bytes[1] << 16; + res |= bytes[0] << 24; + return res; +} + +void send_sapce(int n) +{ + while (n--) + uart_send_string(" "); +} + +int parse_struct(fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr, uint32_t totalsize) +{ + uintptr_t end_ptr = cur_ptr + totalsize; + + while (cur_ptr < end_ptr) + { + uint32_t token = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + switch (token) + { + case FDT_BEGIN_NODE: + // uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char *)cur_ptr, NULL, 0); + cur_ptr += align_up(utils_strlen((char *)cur_ptr), 4); + break; + case FDT_END_NODE: + // uart_send_string("In FDT_END_NODE\n"); + cb(token, NULL, NULL, 0); + break; + case FDT_PROP: + { + // uart_send_string("In FDT_PROP\n"); + uint32_t len = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + cb(token, (char *)(strings_ptr + nameoff), (void *)cur_ptr, len); + cur_ptr += align_up(len, 4); + ; + break; + } + case FDT_NOP: + // uart_send_string("In FDT_NOP\n"); + cb(token, NULL, NULL, 0); + break; + case FDT_END: + // uart_send_string("In FDT_END\n"); + cb(token, NULL, NULL, 0); + return 0; + default:; + return -1; + } + } + return 0; +} + +void print_dtb(int type, const char *name, const void *data, uint32_t size) +{ + switch (type) + { + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_sapce(space); + uart_send_string(name); + uart_send_string("{\n "); + space++; + break; + + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if (space > 0) + send_sapce(space); + + uart_send_string("}\n"); + break; + + case FDT_NOP: + break; + + case FDT_PROP: + send_sapce(space); + uart_send_string(name); + break; + + case FDT_END: + break; + } +} + +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size) +{ + if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-start")) + { + initramfs_start = (char *)pa2va((uintptr_t)get_le2be_uint(data)); + } + else if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-end")) + { + initramfs_end = (char *)pa2va((uintptr_t)get_le2be_uint(data)); + } +} + +uintptr_t dtb_end,dtb_start; + +int fdt_traverse(fdt_callback cb) +{ + // uart_printf("\ndtb loading at:%x\n",dtb_start); + fdt_header *header = (fdt_header *)dtb_start; + + if (get_le2be_uint(&(header->magic)) != 0xd00dfeed) + { + uart_printf("header magic ==%x != 0xd00dfeed\n",get_le2be_uint(&(header->magic))); + return -1; + } + uint32_t totalsize = get_le2be_uint(&(header->totalsize)); + uintptr_t struct_ptr = dtb_start + get_le2be_uint(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_start + get_le2be_uint(&(header->off_dt_strings)); + parse_struct(cb, struct_ptr, strings_ptr, totalsize); + + dtb_end = dtb_start + get_le2be_uint(&(header->totalsize)); + return 0; +} diff --git a/lab6/src/exec.c b/lab6/src/exec.c new file mode 100644 index 000000000..ff6ee53f1 --- /dev/null +++ b/lab6/src/exec.c @@ -0,0 +1,98 @@ +#include "exec.h" +#include "_cpio.h" +#include "sche.h" +#include "mm.h" +#include "trap_frame.h" +#include "utils_c.h" +#include "current.h" +#include "thread.h" +#include "mini_uart.h" +#include "mmu.h" + +static void replace_user_context(void *prog, size_t data_size, pd_t *ttbr0) +{ + struct task *_task = current; + + kfree(_task->user_stack); + free_page_table(_task->ttbr0); + kfree(_task->user_prog); + + _task->user_stack = alloc_stack(ttbr0, STACK_SIZE); + + _task->user_prog = prog; + _task->user_prog_size = data_size; + + _task->ttbr0 = ttbr0; + replace_page_table(); + + TrapFrame *trapframe = (TrapFrame *)((char *)_task->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memset(trapframe, 0, sizeof(TrapFrame)); +} + +void jump_user_prog(void *target_addr, char *kernel_sp, char *user_sp) +{ + asm volatile("mov x0, 0 \n"); + asm volatile("msr spsr_el1, x0 \n"); // daif=0 + asm volatile("msr elr_el1, %0 \n" ::"r"(target_addr)); + asm volatile("msr sp_el0, %0 \n" ::"r"(user_sp)); + if (kernel_sp) + { + asm volatile("mov sp, %0 \n" ::"r"(kernel_sp)); + } + asm volatile("eret \n"); +} + +static void init_user_prog() +{ + jump_user_prog((char *)UPROG_VA, 0, (char *)USTACK_VA + (STACK_SIZE - 0x10)); +} + +int do_exec(const char *path, const char *argv[]) +{ + void *target_addr; + pd_t *ttbr0 = kcalloc(PAGE_SIZE); + size_t data_size = cpio_load_program(path, &target_addr, ttbr0); + if (data_size == -1) + { + uart_send_string("!! do_exec fail !!\n"); + return -1; + } + + setup_peripheral_identity(ttbr0); + replace_user_context(target_addr, data_size, ttbr0); + jump_user_prog((char *)UPROG_VA, current->kernel_stack + STACK_SIZE - sizeof(TrapFrame), (char *)USTACK_VA + (STACK_SIZE - 0x10)); + return 0; +} + +void exe_new_prog(char *filename) +{ + pd_t *ttbr0 = kcalloc(PAGE_SIZE); + setup_peripheral_identity(ttbr0); + + void *target_addr; + size_t data_size = cpio_load_program(filename, &target_addr, ttbr0); + if (data_size == -1) + { + uart_send_string("!! exe_new_prog fail !!\n"); + return; + } + + struct task *prog = thread_create(init_user_prog); + + prog->user_stack = alloc_stack(ttbr0, STACK_SIZE); + + prog->user_prog = target_addr; + prog->user_prog_size = data_size; + + prog->ttbr0 = ttbr0; + + asm( + "dsb ish\n" // ensure write has completed + "msr ttbr0_el1, %0\n" // switch translation based address. + "tlbi vmalle1is\n" // invalidate all TLB entries + "dsb ish\n" // ensure completion of TLB invalidatation + "isb\n" // clear pipeline + ::"r"(ttbr0)); + + return; +} diff --git a/lab6/src/fork.c b/lab6/src/fork.c new file mode 100644 index 000000000..19751756e --- /dev/null +++ b/lab6/src/fork.c @@ -0,0 +1,47 @@ +#include "fork.h" +#include "stddef.h" +#include "sche.h" +#include "thread.h" +#include "exception_c.h" +#include "exception_s.h" +#include "utils_c.h" +#include "current.h" +#include "mm.h" + +static struct task *fork_context(TrapFrame *_regs) +{ + struct task *child = kmalloc(sizeof(struct task)); + + unsigned long flags = disable_irq(); + *child = *current; // copy the current to child entirely + child->pid = task_count++; + irq_restore(flags); + + child->need_resched = 0; + + child->ttbr0 = kcalloc(PAGE_SIZE); + child->user_stack = alloc_stack(child->ttbr0, STACK_SIZE); + memcpy(child->user_stack, current->user_stack, STACK_SIZE); + + child->kernel_stack = kcalloc(STACK_SIZE); + TrapFrame *child_trapframe = (TrapFrame *)((unsigned long)child->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memcpy(child_trapframe, _regs, sizeof(TrapFrame)); + + child->user_prog = alloc_prog(child->ttbr0, current->user_prog_size, current->user_prog); + + setup_peripheral_identity(child->ttbr0); + + child_trapframe->regs[0] = 0; // child process : return 0 + + child->cpu_context.sp = (unsigned long)child_trapframe; + child->cpu_context.lr = (unsigned long)restore_regs_eret; + + return child; +} + +size_t do_fork(TrapFrame *_regs) +{ + struct task *child = fork_context(_regs); + add_task(child); + return child->pid; +} diff --git a/lab6/src/list.c b/lab6/src/list.c new file mode 100644 index 000000000..9d3ab1fe3 --- /dev/null +++ b/lab6/src/list.c @@ -0,0 +1,47 @@ +#include "list.h" + +void list_init(list *node) { + node->next = node; + node->prev = node; +} + +void insert_head(list *head, list *v) { + v->next = head->next; + v->prev = head; + head->next->prev = v; + head->next = v; +} + +void insert_tail(list *head, list *v) { + v->next = head; + v->prev = head->prev; + head->prev->next = v; + head->prev = v; +} + +list *remove_head(list *head) { + list *ptr; + ptr = head->next; + head->next = head->next->next; + head->next->prev = head; + + return ptr; +} + +list *remove_tail(list *head) { + list *ptr; + ptr = head->prev; + head->prev = head->prev->prev; + head->prev->next = head; + + return ptr; +} + +void unlink(list *node) { + list *next, *prev; + next = node->next; + prev = node->prev; + + next->prev = prev; + prev->next = next; +} \ No newline at end of file diff --git a/lab6/src/mailbox.c b/lab6/src/mailbox.c new file mode 100644 index 000000000..501f42f3f --- /dev/null +++ b/lab6/src/mailbox.c @@ -0,0 +1,64 @@ +#include "peripheral/mailbox.h" +#include "utils_c.h" +#include "mini_uart.h" + +unsigned int __attribute__((aligned(16))) mailbox[8]; + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox) +{ + unsigned int readChannel = (((unsigned int)((unsigned long)_mailbox) & ~0xF) | (channel & 0xF)); + while (*MAILBOX_STATUS & MAILBOX_FULL) + { + } + *MAILBOX_WRITE = readChannel; + while (1) + { + while (*MAILBOX_STATUS & MAILBOX_EMPTY) + { + } + if (readChannel == *MAILBOX_READ) + { + return _mailbox[1] == MAILBOX_RESPONSE; + } + } + return 0; +} + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + // printf("0x%x\n", mailbox[5]); // it should be 0xa020d3 for rpi3 b+ + uart_hex(mailbox[5]); + uart_send_string("\n"); + return mailbox[5]; +} + +void get_arm_memory() +{ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + uart_send_string("Arm base address: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("Arm memory size: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); +} diff --git a/lab6/src/memzero.S b/lab6/src/memzero.S new file mode 100644 index 000000000..91c1c4f0f --- /dev/null +++ b/lab6/src/memzero.S @@ -0,0 +1,7 @@ +.global memzero +memzero: + str xzr, [x20], #8 + subs x21, x21, #8 + b.gt memzero + ret + \ No newline at end of file diff --git a/lab6/src/mini_uart.c b/lab6/src/mini_uart.c new file mode 100644 index 000000000..0d0d73605 --- /dev/null +++ b/lab6/src/mini_uart.c @@ -0,0 +1,258 @@ +#include "peripheral/mini_uart.h" +#include "peripheral/gpio.h" +#include "sprintf.h" +#include "utils_c.h" +#include +#include +#include "mini_uart.h" + +#define ENABLE_RECEIVE_INTERRUPTS_BIT (1 << 0) +#define ENABLE_TRANSMIT_INTERRUPTS_BIT (1 << 1) +#define AUX_INT_BIT (1 << 29) + +#define BUFFER_MAX_SIZE 256u + +char read_buf[BUFFER_MAX_SIZE]; +char write_buf[BUFFER_MAX_SIZE]; +int read_buf_start, read_buf_end; +int write_buf_start, write_buf_end; + + +void enable_uart_interrupt() { *ENB_IRQS1 = AUX_IRQ; } + +void disable_uart_interrupt() { *DISABLE_IRQS1 = AUX_IRQ; } + +void set_transmit_interrupt() { *AUX_MU_IER_REG |= 0x2; } + +void clear_transmit_interrupt() { *AUX_MU_IER_REG &= ~(0x2); } + +void uart_init() +{ + unsigned int selector; + + selector = *GPFSEL1; + selector &= ~(7u << 12); // clean gpio14 + selector |= 2u << 12; // set alt5 for gpio14 + selector &= ~(7u << 15); // clean gpio15 + selector |= 2u << 15; // set alt5 for gpio 15 + *GPFSEL1 = selector; + + *GPPUD = 0; // set the required control signal (i.e. Pull-up or Pull-Down ) + delay(150u); // provides the required set-up time for the control signal + *GPPUDCLK0 = (1u << 14) | (1u << 15); + delay(150u); + *GPPUDCLK0 = 0u; + *AUX_ENABLE = 1u; // Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0u; // Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 1u; // Enable receive + *AUX_MU_LCR_REG = 3u; // Enable 8 bit mode + *AUX_MU_MCR_REG = 0u; // Set RTS line to be always high + *AUX_MU_BAUD_REG = 270u; // Set baud rate to 115200 + *AUX_MU_IIR_REG = 6; + + *AUX_MU_CNTL_REG = 3; // Finally, enable transmitter and receiver + + read_buf_start = read_buf_end = 0; + write_buf_start = write_buf_end = 0; + // enable_uart_interrupt(); +} + +void uart_send(const char c) +{ + /* + bit_5 == 1 -> writable + 0x20 = 0000 0000 0010 0000 + ref BCM2837-ARM-Peripherals p5 + */ + if (c == '\n') + { + uart_send('\r'); + } + while (!(*(AUX_MU_LSR_REG)&0x20)) + { + } + *AUX_MU_IO_REG = c; +} +char uart_recv() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp == '\r' ? '\n' : temp; +} + +char uart_recv_raw() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp; +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +void uart_send_uint(unsigned int num, int newline) +{ + char str[256]; + utils_uint2str_dec(num, str); + uart_send_string(str); + if (newline) + { + uart_send_string("\n"); + } +} + +void uart_hex(unsigned int d) +{ + unsigned int n; + int c; + uart_send_string("0x"); + for (c = 28; c >= 0; c -= 4) + { + n = (d >> c) & 0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n += n > 9 ? 0x57 : 0x30; + uart_send(n); + } +} +void uart_dec(unsigned int num) +{ + if (num == 0) + uart_send('0'); + else + { + if (num >= 10) + uart_dec(num / 10); + uart_send(num % 10 + '0'); + } +} + +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +/* + async part +*/ + +void uart_handler() +{ + disable_uart_interrupt(); + int RX = (*AUX_MU_IIR_REG & 0x4); + int TX = (*AUX_MU_IIR_REG & 0x2); + if (RX) + { + char c = (char)(*AUX_MU_IO_REG); + read_buf[read_buf_end++] = c; + if (read_buf_end == BUFFER_MAX_SIZE) + read_buf_end = 0; + } + else if (TX) + { + while (*AUX_MU_LSR_REG & 0x20) + { + if (write_buf_start == write_buf_end) + { + clear_transmit_interrupt(); + break; + } + char c = write_buf[write_buf_start++]; + *AUX_MU_IO_REG = c; + if (write_buf_start == BUFFER_MAX_SIZE) + write_buf_start = 0; + } + } + enable_uart_interrupt(); +} + +char uart_async_recv() +{ + // wait until there are new data + while (read_buf_start == read_buf_end) + { + asm volatile("nop"); + } + char c = read_buf[read_buf_start++]; + if (read_buf_start == BUFFER_MAX_SIZE) + read_buf_start = 0; + return c == '\r' ? '\n' : c; +} + +void uart_async_send_string(char *str) +{ + + for (int i = 0; str[i]; i++) + { + if (str[i] == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + continue; + } + write_buf[write_buf_end++] = str[i]; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + } + set_transmit_interrupt(); +} + +void uart_async_send(char c) +{ + if (c == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + set_transmit_interrupt(); + return; + } + write_buf[write_buf_end++] = c; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + set_transmit_interrupt(); +} + +void test_uart_async() +{ + enable_uart_interrupt(); + delay(15000); + char buffer[BUFFER_MAX_SIZE]; + size_t index = 0; + while (1) + { + buffer[index] = uart_async_recv(); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + uart_async_send_string(buffer); + disable_uart_interrupt(); +} diff --git a/lab6/src/mm.c b/lab6/src/mm.c new file mode 100644 index 000000000..af17b086f --- /dev/null +++ b/lab6/src/mm.c @@ -0,0 +1,460 @@ +#include "mm.h" +#include "mini_uart.h" +#include "list.h" +#include "utils_c.h" +#include "_cpio.h" +#include "dtb.h" +#include "exception_c.h" +#include "mmu.h" + +// #define DEBUG + +#define FRAME_BASE ((uintptr_t)PHYS_OFFSET + 0x0) +// get from mailbox's arm memory +#define FRAME_END ((uintptr_t)PHYS_OFFSET + 0x3b400000) + +#define PAGE_SIZE 0x1000 // 4KB +#define FRAME_BINS_SIZE 12 +#define MAX_ORDER (FRAME_BINS_SIZE - 1) +#define FRAME_MAX_SIZE ORDER2SIZE(MAX_ORDER) +#define ORDER2SIZE(order) (PAGE_SIZE * (1 << (order))) + +#define FRAME_ARRAY_SIZE ((FRAME_END - FRAME_BASE) / PAGE_SIZE) + +#define CHUNK_MIN_SIZE 32 +#define CHUNK_BINS 7 +#define CHUNK_MAX_ORDER (CHUNK_BINS - 1) + +#define FRAME_FREE 0x8 +#define FRAME_INUSE 0x4 +#define FRAME_MEM_CHUNK 0x2 +#define IS_INUSE(frames) (frames.flag & FRAME_INUSE) +#define IS_MEM_CHUNK(frames) (frames.flag & FRAME_MEM_CHUNK) + +// for mm_int +extern char _skernel, _ekernel; +extern void *_dtb_ptr; + +FrameFlag *frames; +list frame_bins[FRAME_BINS_SIZE]; +Chunk *chunk_bins[CHUNK_BINS]; + +unsigned long *smalloc_cur = (unsigned long *)STARTUP_MEM_START; + +//////////////////////////////////////////////////////////////////////////////////////////////// +// utils // +//////////////////////////////////////////////////////////////////////////////////////////////// +static unsigned align_up_exp(unsigned n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n; +} +static int addr2idx(void *addr) +{ + return (((uintptr_t)addr & -PAGE_SIZE) - FRAME_BASE) / PAGE_SIZE; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// startUp // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *smalloc(size_t size) +{ + align(&size, 4); // allocated the memory size is mutiple of 4 byte; + unsigned long *smalloc_ret = smalloc_cur; + if ((uint64_t)smalloc_cur + size > (uint64_t)STARTUP_MEM_END) + { + uart_printf("[!] No enough space!\r\n"); + return NULL; + } + smalloc_cur += (unsigned int)size; + return smalloc_ret; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// others // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void mm_init() +{ + init_buddy(); + memory_reserve((uintptr_t)pa2va(0), (uintptr_t)pa2va(0x1000)); // Spin tables for multicore boot + + memory_reserve((uintptr_t)IDENTITY_TT_L0_VA, (uintptr_t)IDENTITY_TT_L0_VA + PAGE_SIZE); // PGD's page frame + memory_reserve((uintptr_t)IDENTITY_TT_L1_VA, (uintptr_t)IDENTITY_TT_L1_VA + PAGE_SIZE); // PUD's page frame + + memory_reserve((uintptr_t)&_skernel, (uintptr_t)&_ekernel); // Kernel image + + fdt_traverse(get_initramfs_addr); + memory_reserve((uintptr_t)initramfs_start, (uintptr_t)initramfs_end); // Initramfs + + memory_reserve((uintptr_t)STARTUP_MEM_START, (uintptr_t)STARTUP_MEM_END); // Simple allocator + + memory_reserve((uintptr_t)dtb_start, (uintptr_t)dtb_end); // Devicetree + + merge_useful_pages(); +} + +void memory_reserve(uintptr_t start, uintptr_t end) +{ + + start = start & ~(PAGE_SIZE - 1); + end = align_up(end - PHYS_OFFSET, PAGE_SIZE) + PHYS_OFFSET; + for (uintptr_t i = start; i < end; i += PAGE_SIZE) + { + int idx = addr2idx((void *)i); + frames[idx].flag |= FRAME_INUSE; + frames[idx].order = 0; + } +#ifdef DEBUG + uart_printf("reserve addr from %x ~ %x\n", (unsigned long)start, (unsigned long)end); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// buddy system // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int pages_to_frame_order(unsigned pages) +{ + pages = align_up_exp(pages); + return __builtin_ctz(pages); +} + +void init_buddy() +{ + frames = (FrameFlag *)smalloc(sizeof(FrameFlag) * FRAME_ARRAY_SIZE); + for (int i = 0; i < FRAME_BINS_SIZE; i++) + { + list_init(&frame_bins[i]); + } + for (int i = 0; i < FRAME_ARRAY_SIZE; i++) + { + frames[i].flag = 0; + frames[i].order = 0; + } +} + +void merge_useful_pages() +{ + int page_idx = 0; + list *page_addr = (list *)(FRAME_BASE); + { // only insert the 4KB page to frame_bins + while (1) + { + if (!IS_INUSE(frames[page_idx])) + { + insert_tail(&frame_bins[0], page_addr); + } + page_idx++; + if (page_idx >= FRAME_ARRAY_SIZE) + { + break; + } + page_addr = (void *)(FRAME_BASE + page_idx * PAGE_SIZE); + } + } + + for (int order = 0; order < MAX_ORDER; order++) + { // merging the pages by left page + page_idx = 0; + page_addr = (list *)(FRAME_BASE); + int buddy_page_idx = 0; + list *buddy_addr = (list *)(FRAME_BASE); + while (1) + { + buddy_page_idx = page_idx ^ (1 << order); + buddy_addr = (void *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE); + + if (!IS_INUSE(frames[page_idx]) && + frames[page_idx].order == order && + buddy_page_idx < FRAME_ARRAY_SIZE && + !IS_INUSE(frames[buddy_page_idx]) && + frames[buddy_page_idx].order == order) + { + unlink((list *)page_addr); + unlink((list *)buddy_addr); + insert_tail(&frame_bins[order + 1], page_addr); + frames[page_idx].order = order + 1; + } + page_idx += (1 << (order + 1)); + if (page_idx >= FRAME_ARRAY_SIZE) + { + break; + } + page_addr = (void *)(FRAME_BASE + page_idx * PAGE_SIZE); + } + } +} + +static void *split_frames(int order, int target_order) +{ + list *ptr = remove_head(&frame_bins[order]); + +#ifdef DEBUG + uart_printf("split frame: %x\n", (unsigned long)ptr); +#endif + + for (int i = order; i > target_order; i--) + { /* insert splitted frame to bin list */ + list *half_right = (list *)((char *)ptr + ORDER2SIZE(i - 1)); + + insert_head(&frame_bins[i - 1], half_right); + frames[((uintptr_t)half_right - FRAME_BASE) / PAGE_SIZE].order = i - 1; + +#ifdef DEBUG + uart_printf("insert frame at %x\n", (unsigned long)half_right); +#endif + } + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; +} + +void *alloc_pages(unsigned int pages) +{ + int target_order = pages_to_frame_order(pages); + if (frame_bins[target_order].next != &frame_bins[target_order]) + { + list *ptr = remove_head(&frame_bins[target_order]); +#ifdef DEBUG + uart_printf("return page at: %x\n", (unsigned long)ptr); +#endif + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; + } + else + { + for (int i = target_order; i < FRAME_BINS_SIZE; i++) + { + if (frame_bins[i].next != &frame_bins[i]) + { + return split_frames(i, target_order); + } + } + } + + uart_send_string("alloc page return NULL"); + return NULL; +} + +void free_pages(void *victim) +{ + int page_idx = ((uintptr_t)victim - FRAME_BASE) / PAGE_SIZE; + if (!IS_INUSE(frames[page_idx])) + { + uart_printf("Error! double free the memory at %x\n", (uintptr_t)victim); + return; + } + unsigned int order = frames[page_idx].order; + int buddy_page_idx = page_idx ^ (1 << order); + frames[page_idx].flag &= ~FRAME_INUSE; + + while (order <= MAX_ORDER && + !IS_INUSE(frames[buddy_page_idx]) && + order == frames[buddy_page_idx].order) + { + void *buddy_victim = (void *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE); + unlink((list *)buddy_victim); + +#ifdef DEBUG + uart_printf("merge buddy frame: %x \n", (unsigned long)buddy_victim); +#endif + order += 1; + victim = page_idx < buddy_page_idx ? victim : buddy_victim; + page_idx = page_idx < buddy_page_idx ? page_idx : buddy_page_idx; + buddy_page_idx = page_idx ^ (1 << order); + } + + insert_head(&frame_bins[order], victim); + frames[page_idx].order = order; + +#ifdef DEBUG + uart_printf("attach frame: %x \n\n", (unsigned long)victim); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// chunks // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int size_to_chunk_order(unsigned int size) +{ + size = align_up_exp(size); + size /= CHUNK_MIN_SIZE; + return __builtin_ctz(size); +} + +static void *get_chunk(uint32_t size) +{ + int order = size_to_chunk_order(size); + + void *ptr = chunk_bins[order]; + if (ptr) + { + chunk_bins[order] = chunk_bins[order]->next; + int idx = addr2idx(ptr); + frames[idx].ref_count += 1; + +#ifdef DEBUG + uart_printf("detach chunk at %x\n", (unsigned long)ptr); +#endif + } + + return ptr; +} + +static void alloc_chunk(void *mem, int size) +{ + int count = PAGE_SIZE / size; + int idx = addr2idx(mem); + int order = size_to_chunk_order(size); + frames[idx].flag |= FRAME_MEM_CHUNK; + frames[idx].ref_count = 0; + frames[idx].chunk_order = order; + for (int i = 0; i < count; i++) + { + Chunk *ptr = (Chunk *)((uintptr_t)mem + i * size); + ptr->next = chunk_bins[order]; + chunk_bins[order] = ptr; + +#ifdef DEBUG + uart_printf("insert chunk at %x\n", (unsigned long)ptr); +#endif + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// dynamic memory simple_allocator // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *kmalloc(unsigned int size) +{ + unsigned int aligned_page_size = align_up(size, PAGE_SIZE); + if (aligned_page_size > FRAME_MAX_SIZE) + { + return NULL; + } + + size = size < CHUNK_MIN_SIZE ? CHUNK_MIN_SIZE : size; + + size_t flag = disable_irq(); + + void *ptr; + if (align_up_exp(size) < PAGE_SIZE) // just allocate a small chunk + { + size = align_up_exp(size); + ptr = get_chunk(size); + + if (!ptr) + { + void *mem = alloc_pages(1); + alloc_chunk(mem, size); + ptr = get_chunk(size); + } + } + else + { + unsigned int pages = aligned_page_size / PAGE_SIZE; + ptr = alloc_pages(pages); + } + irq_restore(flag); + return ptr; +} +void *kcalloc(unsigned int size) +{ + void *p = kmalloc(size); + if (!p) + { + return NULL; + } + if (size < PAGE_SIZE) + { + size = align_up_exp(size); + } + else + { + size = align_up(size, PAGE_SIZE); + } + memset(p, 0, size); + + return p; +} + +void kfree(void *ptr) +{ + int idx = addr2idx(ptr); + if (idx >= FRAME_ARRAY_SIZE) + { + uart_send_string("Error! kfree wrong address\n"); + return; + } + size_t flag = disable_irq(); + if (IS_MEM_CHUNK(frames[idx])) + { + int order = frames[idx].chunk_order; + ((Chunk *)ptr)->next = chunk_bins[order]; + chunk_bins[order] = ptr; + frames[idx].ref_count -= 1; + +#ifdef DEBUG + uart_printf("free chunk at %x\n", (unsigned long)ptr); +#endif + } + else + { + free_pages(ptr); + } + irq_restore(flag); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// test // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void test_buddy() +{ + int test_size = 5; + void *a[test_size]; + uart_send_string("\n\n----- Malloc -----\n"); + for (int i = 0; i < test_size; i++) + { + a[i] = alloc_pages(test_size); + } + uart_send_string("\n\n----- Free -----\n"); + for (int i = 0; i < test_size; i++) + { + free_pages(a[i]); + } +} + +struct test_b +{ + double b1, b2, b3, b4, b5, b6; +}; + +void test_dynamic_alloc() +{ + uart_send_string("allocate a1\n"); + int *a1 = kmalloc(sizeof(int)); + uart_send_string("allocate a2\n"); + int *a2 = kmalloc(sizeof(int)); + uart_send_string("allocate b\n"); + struct test_b *b = kmalloc(sizeof(struct test_b)); + + uart_send_string("free a1\n"); + kfree(a1); + uart_send_string("free b\n"); + kfree(b); + uart_send_string("free a2\n"); + kfree(a2); +} diff --git a/lab6/src/mmu.c b/lab6/src/mmu.c new file mode 100644 index 000000000..432e64d5b --- /dev/null +++ b/lab6/src/mmu.c @@ -0,0 +1,174 @@ +#include "mmu.h" +#include "utils_s.h" +#include "utils_c.h" +#include "mini_uart.h" +#include "mm.h" +#include "current.h" + +#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16)) +#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30)) +#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB) + +#define MAIR_DEVICE_nGnRnE 0b00000000 +#define MAIR_NORMAL_NOCACHE 0b01000100 +#define MAIR_IDX_DEVICE_nGnRnE 0 +#define MAIR_IDX_NORMAL_NOCACHE 1 + +#define BOOT_PGD_ATTR PD_TABLE // 01 +#define BOOT_PUD_ATTR (PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK) +#define MMU_ENABLE 1 +#define PAGE_SIZE 0x1000 + +#define PERIPHERAL_START 0x3c000000 +#define PERIPHERAL_END 0x3f000000 + +void setup_identity_mapping() +{ + write_sysreg(tcr_el1, TCR_CONFIG_DEFAULT); + size_t mair_attr_01 = + (MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | + (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8)); + write_sysreg(mair_el1, mair_attr_01); + + memset(IDENTITY_TT_L0, 0, 0x1000); // IDENTITY_TT_L0 is the address of the PGD + memset(IDENTITY_TT_L1, 0, 0x1000); // IDENTITY_TT_L1 is the address of the PUD + + // set the entry of the PGD + IDENTITY_TT_L0[0] = (pd_t)IDENTITY_TT_L1 | BOOT_PGD_ATTR; + // set the two entry of the PUD + IDENTITY_TT_L1[0] = 0x00000000 | BOOT_PUD_ATTR; + IDENTITY_TT_L1[1] = 0x40000000 | BOOT_PUD_ATTR; + + write_sysreg(ttbr0_el1, IDENTITY_TT_L0); + write_sysreg(ttbr1_el1, IDENTITY_TT_L0); // also load PGD to the upper translation based register. + unsigned long sctlr = read_sysreg(sctlr_el1); // sctlr_el1 --> System Control Register, EL1 + write_sysreg(sctlr_el1, sctlr | MMU_ENABLE); // Enable the MMU by set the bit 1 of the sctlr_el1 +} + +void setup_kernel_space_mapping() +{ + /* three-level 2MB block mapping */ + + /* 0x00000000 ~ 0x3F000000 for normal mem */ + pd_t *p0 = kcalloc(PAGE_SIZE); + for (int i = 0; i < 504; i++) + { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_BLOCK; + } + /* 0x3F000000 ~ 0x40000000 for device mem */ + for (int i = 504; i < 512; i++) + { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK; + } + + /* 0x40000000 ~ 0x80000000 for device mem */ + pd_t *p1 = kcalloc(PAGE_SIZE); + for (int i = 0; i < 512; i++) + { + p1[i] = 0x40000000 | (i << 21) | PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK; + } + + asm volatile("dsb ish\n\t"); + + IDENTITY_TT_L1_VA[0] = (pd_t)va2pa(p0) | PD_TABLE; + IDENTITY_TT_L1_VA[1] = (pd_t)va2pa(p1) | PD_TABLE; +} + +void map_page(pd_t *table, unsigned long va, unsigned long pa, unsigned long flags) +{ + for (int level = 0; level < 4; level++) + { + unsigned idx = (va >> (39 - 9 * level)) & 0b111111111; + if (!table[idx]) + { + if (level == 3) + { + table[idx] = pa; + table[idx] |= PD_PXN | PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_PAGE | flags; + return; + } + else + { + table[idx] = (pd_t)va2pa(kcalloc(PAGE_SIZE)); + table[idx] |= PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_TABLE; + } + } + + if ((table[idx] & 0b11) == PD_TABLE) + { + table = (pd_t *)pa2va(table[idx] & 0xfffffffff000L); + } + } +} + +void *alloc_stack(pd_t *table, unsigned long size) +{ + void *stack = kcalloc(size); + unsigned long pages = align_up(size, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, USTACK_VA + i * PAGE_SIZE, va2pa(stack + i * PAGE_SIZE), PD_USER_RW | PD_UXN); + } + + return stack; +} + +void *alloc_prog(pd_t *table, unsigned long size, const char *file_content) +{ + void *prog = kcalloc(size); + unsigned long pages = align_up(size, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, UPROG_VA + i * PAGE_SIZE, va2pa(prog + i * PAGE_SIZE), PD_USER_RW); + } + memcpy(prog, file_content, size); + + return prog; +} + +void setup_peripheral_identity(pd_t *table) +{ + unsigned long pages = align_up(PERIPHERAL_END - PERIPHERAL_START, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, PERIPHERAL_START + i * PAGE_SIZE, PERIPHERAL_START + i * PAGE_SIZE, PD_USER_RW); + } +} + +unsigned long get_pte(unsigned long va) +{ + unsigned long flags = disable_irq(); + + asm("at s1e0r, %0\n\t" ::"r"(va)); + unsigned long pte = read_sysreg(par_el1); + + irq_restore(flags); + return pte; +} + +unsigned long el0_va2pa(unsigned long va) +{ + unsigned long entry = get_pte(va); + if (entry & 1) + { + uart_printf("Failed map virtual addr at 0x%x\n", va); + } + unsigned long offset = va & 0xfff; + return (unsigned long)(pa2va((entry & 0xfffffffff000L) | offset)); +} +void free_page_table(pd_t *table) +{ + // free the page table created by translating from map_page() + /* TODO */ +} + +void replace_page_table() +{ + asm( + "dsb ish\n" // ensure write has completed + "msr ttbr0_el1, %0\n" // switch translation based address. + "tlbi vmalle1is\n" // invalidate all TLB entries + "dsb ish\n" // ensure completion of TLB invalidatation + "isb\n" // clear pipeline + ::"r"(current->ttbr0)); +} \ No newline at end of file diff --git a/lab6/src/sche.c b/lab6/src/sche.c new file mode 100644 index 000000000..49f3e4ad2 --- /dev/null +++ b/lab6/src/sche.c @@ -0,0 +1,153 @@ +#include "sche.h" +#include "current.h" +#include "timer.h" +#include "exception_c.h" +#include "mini_uart.h" +#include "mm.h" + +pid_t task_count = 0; + +list running_queue = LIST_HEAD_INIT(running_queue); +list waiting_queue = LIST_HEAD_INIT(waiting_queue); +list stopped_queue = LIST_HEAD_INIT(stopped_queue); + +int get_the_cur_count() +{ + int count = 0; + list *head = &running_queue; + while (head->next != &running_queue) + { + count++; + head = head->next; + } + return count; +} + +void add_task(struct task *t) +{ + size_t flags = disable_irq(); + insert_tail(&running_queue, &t->list); + irq_restore(flags); +} + +void kill_task(struct task *_task, int status) +{ + size_t flags = disable_irq(); + + _task->state = TASK_STOPPED; + _task->need_resched = 1; + unlink(&_task->list); + _task->exitcode = status; + insert_head(&stopped_queue, &_task->list); + + irq_restore(flags); + thread_schedule(0); +} + +void restart_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_WAITING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_RUNNING; + unlink(&_task->list); + insert_tail(&running_queue, &_task->list); + + irq_restore(flags); +} + +void pause_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_RUNNING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_WAITING; + _task->need_resched = 1; + unlink(&_task->list); + insert_head(&waiting_queue, &_task->list); + + irq_restore(flags); +} + +void sleep_task(size_t ms) +{ + size_t flags = disable_irq(); + + add_timer((timer_callback)restart_task, (size_t)current, ms); + pause_task(current); + irq_restore(flags); + + thread_schedule(0); +} + +void free_task(struct task *victim) +{ + if (victim->kernel_stack) + kfree(victim->kernel_stack); + kfree(victim); +} + +struct task *create_task() +{ + struct task *new_task = kmalloc(sizeof(struct task)); + new_task->cpu_context.lr = new_task->cpu_context.sp = new_task->cpu_context.fp = 0; + new_task->kernel_stack = NULL; + new_task->user_stack = NULL; + new_task->user_prog = NULL; + new_task->user_prog_size = 0; + new_task->state = TASK_INIT; + new_task->pid = task_count++; + new_task->need_resched = 0; + new_task->exitcode = 0; + new_task->timeout = get_current_time() + DEFAULT_TIMEOUT; + new_task->signal = NULL; + new_task->sig_context = NULL; + new_task->ttbr0 = NULL; + return new_task; +} + +struct task *pick_next_task() +{ + if (list_empty(&running_queue)) + { + while (1) + { + }; + } + struct task *next_task = list_first_entry(&running_queue, struct task, list); + unlink(&next_task->list); + insert_tail(&running_queue, &next_task->list); + + return next_task; +} + +void switch_task(struct task *next) +{ + if (current == next) + { + return; + } + switch_to(¤t->cpu_context, &next->cpu_context); + replace_page_table(); +} + +struct task *get_task(pid_t target) +{ + struct task *_task; + list_for_each_entry(_task, &running_queue, list) + { + if (_task->pid == target) + { + return _task; + } + } + return NULL; +} \ No newline at end of file diff --git a/lab6/src/shell.c b/lab6/src/shell.c new file mode 100644 index 000000000..e4394aeb4 --- /dev/null +++ b/lab6/src/shell.c @@ -0,0 +1,226 @@ +#include "shell.h" +#include "mini_uart.h" +#include "utils_c.h" +#include "utils_s.h" +#include "peripheral/mailbox.h" +#include "_cpio.h" +#include "exception_c.h" +#include "timer.h" +#include "dtb.h" +#include "mm.h" +#include "exec.h" +#include "thread.h" +#include +#define BUFFER_MAX_SIZE 256u +#define COMMNAD_LENGTH_MAX 20u + +extern void *_dtb_ptr; + +int split(const char *buf, char *outbuf[], int n) +{ + const char *ps, *pe; + int idx = 0; + ps = pe = buf; + + while (idx < n) + { + while (*pe && *pe != ' ') + { + pe++; + } + + int size = pe - ps; + if (size) + { + outbuf[idx] = kmalloc(size + 1); + memcpy(outbuf[idx], ps, size); + outbuf[idx][size] = '\0'; + idx++; + } + + if (*pe) + { + while (*pe == ' ') + pe++; + ps = pe; + } + else + { + break; + } + } + + return idx; +} + +void read_command(char *buffer) +{ + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); +} + +void parse_arg(char *buffer, int *argi) +{ + int i = 0; + int argi_index = 0; + argi[argi_index] = i; + while (buffer[i] != '\0') + { + if (buffer[i] == ' ') + { + buffer[i] = '\0'; + argi[++argi_index] = ++i; + continue; + } + i++; + } +} + +void help() +{ + uart_send_string("help :"); + uart_send_string("print this help menu\n"); + uart_send_string("hello :"); + uart_send_string("print Hello World!\n"); + uart_send_string("reboot : "); + uart_send_string("reboot the device\n"); + uart_send_string("info : "); + uart_send_string("the mailbox hardware info\n"); + uart_send_string("ls : "); + uart_send_string("list the all file\n"); + uart_send_string("cat : "); + uart_send_string("print the file content\n"); + uart_send_string("dtb : "); + uart_send_string("print the device name tree \n"); + uart_send_string("async : "); + uart_send_string("test uart async send and recv\n"); + uart_send_string("set : "); + uart_send_string("set the timeout (set message second)\n"); + uart_send_string("buddy : "); + uart_send_string("test the page allocate and free\n"); + uart_send_string("dynamic : "); + uart_send_string("test the dynamic memory simple_allocator\n"); +} + +void hello() +{ + uart_send_string("Hello World!\n"); +} + +void info() +{ + get_board_revision(); + // get_arm_memory(); +} + +void parse_command(char *buffer) +{ + // int argi[BUFFER_MAX_SIZE]; + if (utils_str_compare(buffer, "") == 0) + { + return; + } + else if (utils_str_compare(buffer, "help") == 0) + { + help(); + } + else if (utils_str_compare(buffer, "hello") == 0) + { + hello(); + } + else if (utils_str_compare(buffer, "ls") == 0) + { + cpio_ls(); + } + else if (utils_str_compare(buffer, "cat") == 0) + { + uart_send_string("Filename: "); + char buffer[BUFFER_MAX_SIZE]; + read_command(buffer); + cpio_cat(buffer); + } + else if (utils_str_compare(buffer, "exe") == 0) + { + exe_new_prog("user2.img"); + } + else if (utils_str_compare(buffer, "wtf") == 0) + { + uart_printf("Current task count :%d\n",get_the_cur_count()); + } + else if (utils_str_compare(buffer, "thread") == 0) + { + test_thread(); + uart_async_send_string("exit the test_thread\n"); + } + else if (utils_str_compare(buffer, "reboot") == 0) + { + uart_send_string("rebooting...\n"); + reset(1000); + } + else if (utils_str_compare(buffer, "info") == 0) + { + info(); + } + else if (utils_str_compare(buffer, "dtb") == 0) + { + fdt_traverse(print_dtb); + } + + else if (utils_str_compare(buffer, "async") == 0) + { + test_uart_async(); + } + else if (utils_strncmp(buffer, "set", 3) == 0) + { + char *args[3]; + split(buffer, args, 3); + unsigned long time = (unsigned long)utils_str2uint_dec(args[2]); + set_timeout(args[1], S(time)); + } + else if (utils_str_compare(buffer, "buddy") == 0) + { + test_buddy(); + } + else if (utils_str_compare(buffer, "dynamic") == 0) + { + test_dynamic_alloc(); + } + else + { + uart_send_string("commnad '"); + uart_send_string(buffer); + uart_send_string("' not found\n"); + } +} + +void clear_buffer(char *buf) +{ + for (int i = 0; i < BUFFER_MAX_SIZE; i++) + { + buf[i] = '\0'; + } +} + +void shell() +{ + while (1) + { + char buffer[BUFFER_MAX_SIZE]; + clear_buffer(buffer); + uart_send_string("$ "); + read_command(buffer); + parse_command(buffer); + } +} \ No newline at end of file diff --git a/lab6/src/signal.c b/lab6/src/signal.c new file mode 100644 index 000000000..1b46aa58b --- /dev/null +++ b/lab6/src/signal.c @@ -0,0 +1,63 @@ +#include "signal.h" +#include "sche.h" +#include "current.h" +#include "mm.h" +#include "trap_frame.h" +#include "mini_uart.h" +#include "utils_c.h" + +static void sig_ignore(int _) +{ + return; +} +void sigkill_handler(int target) +{ + if (current->pid == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sig_return(void) +{ + asm volatile( + "mov x8, 10\n" + "svc 0\n"); +} + +void sig_context_update(TrapFrame *_regs, void (*handler)()) +{ + struct signal_context *sig_context = kmalloc(sizeof(struct signal_context)); + sig_context->trapframe = kmalloc(sizeof(TrapFrame)); + sig_context->user_stack = kmalloc(STACK_SIZE); + memcpy(sig_context->trapframe, _regs, sizeof(TrapFrame)); + + current->sig_context = sig_context; + + _regs->regs[30] = (unsigned long)&sig_return; + _regs->pc = (unsigned long)handler; + _regs->sp = (unsigned long)sig_context->user_stack + STACK_SIZE - 0x10; +} + +void sig_context_restore(TrapFrame *_regs) +{ + memcpy(_regs, current->sig_context->trapframe, sizeof(TrapFrame)); +} + +signal_handler signal_table[] = { + [0] = &sig_ignore, + [1] = &sig_ignore, + [2] = &sig_ignore, + [3] = &sig_ignore, + [4] = &sig_ignore, + [5] = &sig_ignore, + [6] = &sig_ignore, + [7] = &sig_ignore, + [8] = &sig_ignore, + [SIGKILL] = &sigkill_handler, +}; \ No newline at end of file diff --git a/lab6/src/sprintf.c b/lab6/src/sprintf.c new file mode 100644 index 000000000..246748b62 --- /dev/null +++ b/lab6/src/sprintf.c @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/** + * minimal sprintf implementation + */ +#include "../include/sprintf.h" + +unsigned int vsprintf(char *dst, char* fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig=dst, tmpstr[19]; + + // failsafes + if(dst==(void*)0 || fmt==(void*)0) { + return 0; + } + + // main loop + arg = 0; + while(*fmt) { + // argument access + if(*fmt=='%') { + fmt++; + // literal % + if(*fmt=='%') { + goto put; + } + len=0; + // size modifier + while(*fmt>='0' && *fmt<='9') { + len *= 10; + len += *fmt-'0'; + fmt++; + } + // skip long modifier + if(*fmt=='l') { + fmt++; + } + // character + if(*fmt=='c') { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } else + // decimal number + if(*fmt=='d') { + arg = __builtin_va_arg(args, int); + // check input + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + // convert to string + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]='0'+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]='-'; + } + // padding, only space + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=' '; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // hex number + if(*fmt=='x') { + arg = __builtin_va_arg(args, long int); + // convert to string + i=16; + tmpstr[i]=0; + do { + char n=arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i]=n+(n>9?0x37:0x30); + arg>>=4; + } while(arg!=0 && i>0); + // padding, only leading zeros + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]='0'; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // string + if(*fmt=='s') { + p = __builtin_va_arg(args, char*); +copystring: if(p==(void*)0) { + p="(null)"; + } + while(*p) { + *dst++ = *p++; + } + } + } else { +put: *dst++ = *fmt; + } + fmt++; + } + *dst=0; + // number of bytes written + return dst-orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char* fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst,fmt,args); +} \ No newline at end of file diff --git a/lab6/src/syscall.c b/lab6/src/syscall.c new file mode 100644 index 000000000..fd77772e5 --- /dev/null +++ b/lab6/src/syscall.c @@ -0,0 +1,151 @@ +#include "syscall.h" +#include "stddef.h" +#include "trap_frame.h" +#include "current.h" +#include "peripheral/mailbox.h" +#include "mini_uart.h" +#include "signal.h" +#include "exec.h" +#include "exception_c.h" +#include "mm.h" +#include "fork.h" + +void sys_getpid(TrapFrame *_regs) +{ + _regs->regs[0] = current->pid; +} +void sys_uartrecv(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + buf[i] = uart_recv(); + } + _regs->regs[0] = count; +} +void sys_uartwrite(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + uart_send(buf[i]); + } + _regs->regs[0] = count; +} +void sys_exec(TrapFrame *_regs) +{ + const char *path = (char *)_regs->regs[0]; + const char **args = (const char **)_regs->regs[1]; + _regs->regs[0] = do_exec(path, args); +} +void sys_fork(TrapFrame *_regs) +{ + _regs->regs[0] = do_fork(_regs); +} +void sys_exit(TrapFrame *_regs) +{ + kill_task(current, _regs->regs[0]); +} +void sys_mbox_call(TrapFrame *_regs) +{ + unsigned int channel = _regs->regs[0]; + unsigned int *mailbox_va = (unsigned int *)_regs->regs[1]; + + void *mailbox_pa = (unsigned int *)el0_va2pa((unsigned long)mailbox_va); + mailbox_call(channel, mailbox_pa); +} +void sys_kill_pid(TrapFrame *_regs) +{ + pid_t target = _regs->regs[0]; + if (current->pid == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sys_signal(TrapFrame *_regs) +{ + int sig_num = _regs->regs[0]; + signal_handler _hand = (signal_handler)_regs->regs[1]; + + struct signal *new_signal = kmalloc(sizeof(struct signal)); + new_signal->sig_num = sig_num; + new_signal->handler = _hand; + new_signal->list.next = new_signal->list.prev = &new_signal->list; + + if (!current->signal) + { + current->signal = new_signal; + } + else + { + insert_tail(¤t->signal->list, &new_signal->list); + } +} + +void sys_sigkill(TrapFrame *_regs) +{ + int target = _regs->regs[0]; + int SIGNAL = _regs->regs[1]; + int is_find = 0; + if (current->signal) + { + struct signal *cur = current->signal; + do + { + if (cur->sig_num == SIGNAL) + { + is_find = 1; + sig_context_update(_regs, cur->handler); + break; + } + cur = list_entry(cur->list.next, struct signal, list); + } while (cur != current->signal); + } + else if (!current->signal && !is_find) + { + (signal_table[SIGNAL])(target); + } +} +void sys_sigreturn(TrapFrame *_regs) +{ + sig_context_restore(_regs); + + disable_interrupt(); + kfree(current->sig_context->trapframe); + kfree(current->sig_context->user_stack); + kfree(current->sig_context); + current->sig_context = NULL; + enable_interrupt(); +} +syscall syscall_table[NUM_syscalls] = { + [SYS_GETPID] = &sys_getpid, + [SYS_UART_RECV] = &sys_uartrecv, + [SYS_UART_WRITE] = &sys_uartwrite, + [SYS_EXEC] = &sys_exec, + [SYS_FORK] = &sys_fork, + [SYS_EXIT] = &sys_exit, + [SYS_MBOX] = &sys_mbox_call, + [SYS_KILL_PID] = &sys_kill_pid, + [SYS_SIGNAL] = &sys_signal, + [SYS_SIGKILL] = &sys_sigkill, + [SYS_SIGRETURN] = &sys_sigreturn, +}; + +void syscall_handler(TrapFrame *_regs) +{ + unsigned int sys_index = _regs->regs[8]; + if (sys_index >= NUM_syscalls) + { + uart_send_string("!!! Invalid system call !!!\n"); + return; + } + (syscall_table[sys_index])(_regs); +} diff --git a/lab6/src/thread.c b/lab6/src/thread.c new file mode 100644 index 000000000..b647e65c0 --- /dev/null +++ b/lab6/src/thread.c @@ -0,0 +1,76 @@ +#include "thread.h" +#include "mini_uart.h" +#include "timer.h" +#include "sche.h" +#include "list.h" +#include "mm.h" +#include "exception_c.h" +#include "current.h" +#include "trap_frame.h" + +void thread_kill_zombies() +{ + unsigned long flags = disable_irq(); + while (!list_empty(&stopped_queue)) + { + struct task *victim = list_first_entry(&stopped_queue, struct task, list); + unlink(&victim->list); + free_task(victim); + } + irq_restore(flags); +} + +void thread_schedule(size_t _) +{ + if (!current->need_resched) + { + return; + } + + unsigned long flags = disable_irq(); + struct task *next = pick_next_task(); + next->need_resched = 0; + irq_restore(flags); + + switch_task(next); +} + +void thread_init() +{ + struct task *init = create_task(); + set_thread_ds(init); // init the thread structure +} + +static void foo() +{ + for (int i = 0; i < 5; ++i) + { + uart_printf("Thread id: %d i=%d\n", current->pid, i); + // sleep_task(500); + delay(1000000); + } + kill_task(current, 0); + thread_schedule(0); +} + +struct task *thread_create(void *func) +{ + struct task *new_thread = create_task(); + new_thread->kernel_stack = kmalloc(STACK_SIZE); + new_thread->state = TASK_RUNNING; + new_thread->cpu_context.lr = (unsigned long)func; + new_thread->cpu_context.sp = (unsigned long)new_thread->kernel_stack + STACK_SIZE - sizeof(TrapFrame); + + add_task(new_thread); + + return new_thread; +} + +void test_thread() +{ + for (int i = 0; i < 3; ++i) + { + thread_create(&foo); + } + uart_printf("end of test_thread\n"); +} diff --git a/lab6/src/timer.c b/lab6/src/timer.c new file mode 100644 index 000000000..a17bc0ccd --- /dev/null +++ b/lab6/src/timer.c @@ -0,0 +1,155 @@ +#include "timer.h" +#include "utils_s.h" +#include "mm.h" +#include "mini_uart.h" +#include "utils_c.h" +#include "thread.h" +#include "exception_c.h" +#include "current.h" + +timeout_event *timeout_queue_head = 0, *timeout_queue_tail = 0; +void core_timer_enable() +{ + /* + cntpct_el0 >= cntp_cval_el0 -> interrupt + cntp_tval_el0 = cntpct_el0 - cntp_cval_el0 + */ + write_sysreg(cntp_ctl_el0, 1); // enable + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(SCHE_CYCLE)); // set expired time + *CORE0_TIMER_IRQ_CTRL = 2; // unmask timer interrupt +} + +void core_timer_disable() +{ + write_sysreg(cntp_ctl_el0, 0); // disable + *CORE0_TIMER_IRQ_CTRL = 0; // mask timer interrupt +} + +void set_expired_time(unsigned long duration) +{ + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(duration)); // ms +} + +unsigned long get_current_time() +{ + // cntpct_el0: The timer’s current count. + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + unsigned long current_count = read_sysreg(cntpct_el0); + return (unsigned long)(current_count / frq); +} + +void set_timeout(char *message, unsigned long time) +{ + add_timer((timer_callback)print_message, (size_t)message, time); +} + +void print_message(char *msg) +{ + unsigned long current_time = get_current_time(); + uart_printf("\ncurrent time : %d.%ds\n", GET_S(current_time), GET_MS(current_time)); +} + +void timeout_event_init() +{ + timeout_queue_head = 0; + timeout_queue_tail = 0; + unsigned long cntkctl_el1; + cntkctl_el1 = read_sysreg(CNTKCTL_EL1); + cntkctl_el1 |= 1; + write_sysreg(CNTKCTL_EL1, cntkctl_el1); +} + +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duration) +{ + timeout_event *new_event = (timeout_event *)kmalloc(sizeof(timeout_event)); + new_event->register_time = get_current_time(); + new_event->duration = duration; + new_event->callback = cb; + new_event->arg = arg; + new_event->next = 0; + new_event->prev = 0; + + size_t flag = disable_irq(); + if (timeout_queue_head == 0) + { + timeout_queue_head = new_event; + timeout_queue_tail = new_event; + core_timer_enable(); + set_expired_time(duration); + } + else + { + unsigned long timeout = new_event->register_time + new_event->duration; + timeout_event *cur = timeout_queue_head; + while (cur) + { + if ((cur->register_time + cur->duration) > timeout) + break; + cur = cur->next; + } + + if (cur == 0) + { // cur at end + new_event->prev = timeout_queue_tail; + timeout_queue_tail->next = new_event; + timeout_queue_tail = new_event; + } + else if (cur->prev == 0) + { // cur at head + new_event->next = cur; + (timeout_queue_head)->prev = new_event; + timeout_queue_head = new_event; + set_expired_time(duration); + } + else + { // cur at middle + new_event->next = cur; + new_event->prev = cur->prev; + (cur->prev)->next = new_event; + cur->prev = new_event; + } + } + irq_restore(flag); +} + +static inline void set_resched(unsigned long current_time) +{ + if (current_time >= current->timeout) + { + current->need_resched = 1; + } +} + +void timer_handler() +{ + unsigned long current_time = get_current_time(); + timeout_event *cur_event = timeout_queue_head; + timeout_event *next_event = cur_event->next; + if (next_event) + { + next_event->prev = 0; + timeout_queue_head = next_event; + set_expired_time(next_event->register_time + next_event->duration - current_time); + } + else + { + timeout_queue_head = timeout_queue_tail = 0; + core_timer_disable(); + } + + if (cur_event->callback == (timer_callback)&thread_schedule) + { + set_resched(current_time); + add_timer((timer_callback)thread_schedule, (size_t)0, MS(SCHE_CYCLE)); + enable_interrupt(); + thread_schedule(0); + disable_interrupt(); + } + else if (cur_event->callback) + { + cur_event->callback(cur_event->arg); + } + kfree(cur_event); +} \ No newline at end of file diff --git a/lab6/src/trans_el.S b/lab6/src/trans_el.S new file mode 100644 index 000000000..066bc1c7a --- /dev/null +++ b/lab6/src/trans_el.S @@ -0,0 +1,9 @@ +.globl from_el2_to_el1 +from_el2_to_el1: + mov x0, (1 << 31) // EL1 uses aarch64 + msr hcr_el2, x0 + mov x0, 0x3c5 // EL1h (SPSel = 1) with interrupt disabled + msr spsr_el2, x0 + msr elr_el2, lr + eret // return to EL1 + \ No newline at end of file diff --git a/lab6/src/utils_c.c b/lab6/src/utils_c.c new file mode 100644 index 000000000..2608a7c5d --- /dev/null +++ b/lab6/src/utils_c.c @@ -0,0 +1,176 @@ +#include "utils_c.h" +#include "mini_uart.h" +#include + +/* + string part +*/ + +int utils_str_compare(const char *a, const char *b) +{ + char aa, bb; + do + { + aa = (char)*a++; + bb = (char)*b++; + if (aa == '\0' || bb == '\0') + { + return aa - bb; + } + } while (aa == bb); + return aa - bb; +} + +int utils_strncmp(const char *a, const char *b, size_t n) +{ + size_t i = 0; + while (i < n - 1 && a[i] == b[i] && a[i] != '\0' && b[i] != '\0') + i++; + return a[i] - b[i]; +} +void utils_newline2end(char *str) +{ + while (*str != '\0') + { + if (*str == '\n') + { + *str = '\0'; + return; + } + ++str; + } +} + +void utils_int2str_dec(int num, char *str) +{ + // num=7114 digit=4 + int digit = -1, temp = num; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +void utils_uint2str_dec(unsigned int num, char *str) +{ + // num=7114 digit=4 + unsigned int temp = num; + int digit = -1; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +unsigned int utils_str2uint_dec(const char *str) +{ + unsigned int value = 0u; + + while (*str) + { + value = value * 10u + (*str - '0'); + ++str; + } + return value; +} + +size_t utils_strlen(const char *s) +{ + size_t i = 0; + while (s[i]) + i++; + return i + 1; +} + +/* + reboot part +*/ + +void set(long addr, unsigned long value) +{ + volatile unsigned int *point = (unsigned int *)addr; + *point = value; +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} + +/* + others +*/ + +void align(void *size, size_t s) +{ + unsigned int *x = (unsigned int *)size; + if ((*x) & (s - 1)) + { + (*x) += s - ((*x) & (s - 1)); + } +} + +uint32_t align_up(uint32_t size, int alignment) +{ + return (size + alignment - 1) & -alignment; +} + +void delay(unsigned int clock) +{ + while (clock--) + { + asm volatile("nop"); + } +} + +void memcpy(void *dst, const void *src, size_t n) +{ + char *_dst = dst; + const char *_src = src; + + while (n--) + { + *_dst++ = *_src++; + } +} + +void *memset(void *s, int c, size_t n) { + char *p = s; + for (size_t i = 0; i < n; i++) { + p[i] = c; + } + return s; +} \ No newline at end of file diff --git a/lab6/src/utils_s.S b/lab6/src/utils_s.S new file mode 100644 index 000000000..2db1bb5ab --- /dev/null +++ b/lab6/src/utils_s.S @@ -0,0 +1,34 @@ +.global branchAddr +branchAddr: + br x0 + + +.globl get_el +get_el: + mrs x0, CurrentEl + lsr x0, x0, #2 + ret + +.global switch_to +switch_to: + + mov x9, sp + stp x19, x20, [x0, #0x0] + stp x21, x22, [x0, #0x10] + stp x23, x24, [x0, #0x20] + stp x25, x26, [x0, #0x30] + stp x27, x28, [x0, #0x40] + stp fp, x9, [x0, #0x50] + str lr, [x0, #0x60] + + ldp x19, x20, [x1, #0x0] + ldp x21, x22, [x1, #0x10] + ldp x23, x24, [x1, #0x20] + ldp x25, x26, [x1, #0x30] + ldp x27, x28, [x1, #0x40] + ldp fp, x9, [x1, #0x50] + ldr lr, [x1, #0x60] + mov sp, x9 + msr tpidr_el1, x1 + ret + diff --git a/lab6/users/user1/linker.ld b/lab6/users/user1/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab6/users/user1/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab6/users/user1/main.c b/lab6/users/user1/main.c new file mode 100644 index 000000000..4a8ceeea0 --- /dev/null +++ b/lab6/users/user1/main.c @@ -0,0 +1,286 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} + +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + + +unsigned int __attribute__((aligned(16))) mailbox[8]; + + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + int pid = getpid(); + uart_printf("[User1] pid:%d\n", pid); + + exit(); + return 0; +} diff --git a/lab6/users/user2/linker.ld b/lab6/users/user2/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab6/users/user2/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab6/users/user2/main.c b/lab6/users/user2/main.c new file mode 100644 index 000000000..f685335a3 --- /dev/null +++ b/lab6/users/user2/main.c @@ -0,0 +1,305 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} +int fork(void) +{ + return (int)syscall(SYS_FORK, 0, 0, 0, 0, 0, 0); +} +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +// unsigned int __attribute__((aligned(16))) mailbox[8]; +unsigned int get_board_revision() +{ + unsigned int __attribute__((aligned(16))) mailbox[8]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, &mailbox[0]); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + // char buf1[0x10] = {0}; + uart_printf("[User2] Into start\n"); + int pid = getpid(); + + uart_printf("[User2] pid:%d\n", pid); + + unsigned int revision = get_board_revision(); + uart_printf("[User2] Revision: %x\n", revision); + + pid = fork(); + + if (pid == 0) + { + uart_printf("[User2] child: exec user1.img\r\n"); + exec("user1.img", NULL); + } + else + { + uart_printf("[User2] parent: child pid: %d\n", pid); + } + uart_printf("[User2 ] exit\n"); + + exit(); + return 0; +} From 70afdc70b5033c17fd6e6c5e42473392eb8b4b37 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 6 Jun 2024 08:50:54 +0800 Subject: [PATCH 20/24] Create ReadMe.md --- lab7/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab7/ReadMe.md diff --git a/lab7/ReadMe.md b/lab7/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab7/ReadMe.md @@ -0,0 +1 @@ + From d7dd1a5e4764f11cbcc73b0b80bae903a0bd11df Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 6 Jun 2024 08:52:35 +0800 Subject: [PATCH 21/24] Add files via upload --- lab7/Makefile | 106 ++++++ lab7/archive/TA/initramfs.cpio | Bin 0 -> 247296 bytes lab7/archive/TA/vfs1.img | Bin 0 -> 404216 bytes lab7/archive/TA/vm.img | Bin 0 -> 247488 bytes lab7/archive/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 31790 bytes lab7/archive/rootfs/one | 3 + lab7/archive/rootfs/two | 3 + lab7/bootloader/linker.ld | 28 ++ lab7/bootloader/main.c | 48 +++ lab7/bootloader/start.S | 46 +++ lab7/include/_cpio.h | 33 ++ lab7/include/current.h | 16 + lab7/include/dtb.h | 39 ++ lab7/include/exception_c.h | 17 + lab7/include/exception_s.h | 6 + lab7/include/exec.h | 7 + lab7/include/fork.h | 8 + lab7/include/initramfs.h | 10 + lab7/include/list.h | 45 +++ lab7/include/mini_uart.h | 22 ++ lab7/include/mm.h | 47 +++ lab7/include/mmu.h | 53 +++ lab7/include/peripheral/base.h | 9 + lab7/include/peripheral/gpio.h | 12 + lab7/include/peripheral/mailbox.h | 36 ++ lab7/include/peripheral/mini_uart.h | 30 ++ lab7/include/sche.h | 67 ++++ lab7/include/shell.h | 7 + lab7/include/signal.h | 27 ++ lab7/include/sprintf.h | 31 ++ lab7/include/stat.h | 40 ++ lab7/include/syscall.h | 36 ++ lab7/include/thread.h | 13 + lab7/include/timer.h | 39 ++ lab7/include/tmpfs.h | 10 + lab7/include/trap_frame.h | 12 + lab7/include/utils_c.h | 33 ++ lab7/include/utils_s.h | 41 +++ lab7/include/vfs.h | 87 +++++ lab7/kernel/exception_c.c | 109 ++++++ lab7/kernel/exception_s.S | 214 +++++++++++ lab7/kernel/linker.ld | 34 ++ lab7/kernel/main.c | 39 ++ lab7/kernel/start.S | 62 ++++ lab7/loadImg/loadImg.py | 30 ++ lab7/loadImg/loadImg.sh | 5 + lab7/requirements.txt | 1 + lab7/src/_cpio.c | 117 ++++++ lab7/src/dtb.c | 143 ++++++++ lab7/src/exec.c | 109 ++++++ lab7/src/fork.c | 47 +++ lab7/src/initramfs.c | 185 ++++++++++ lab7/src/list.c | 53 +++ lab7/src/mailbox.c | 64 ++++ lab7/src/memzero.S | 7 + lab7/src/mini_uart.c | 258 +++++++++++++ lab7/src/mm.c | 460 +++++++++++++++++++++++ lab7/src/mmu.c | 172 +++++++++ lab7/src/sche.c | 158 ++++++++ lab7/src/shell.c | 230 ++++++++++++ lab7/src/signal.c | 63 ++++ lab7/src/sprintf.c | 152 ++++++++ lab7/src/syscall.c | 248 +++++++++++++ lab7/src/thread.c | 76 ++++ lab7/src/timer.c | 155 ++++++++ lab7/src/tmpfs.c | 176 +++++++++ lab7/src/trans_el.S | 9 + lab7/src/utils_c.c | 185 ++++++++++ lab7/src/utils_s.S | 34 ++ lab7/src/vfs.c | 505 ++++++++++++++++++++++++++ lab7/users/user1/linker.ld | 26 ++ lab7/users/user1/main.c | 286 +++++++++++++++ lab7/users/user2/linker.ld | 26 ++ lab7/users/user2/main.c | 305 ++++++++++++++++ 74 files changed, 5810 insertions(+) create mode 100644 lab7/Makefile create mode 100644 lab7/archive/TA/initramfs.cpio create mode 100644 lab7/archive/TA/vfs1.img create mode 100644 lab7/archive/TA/vm.img create mode 100644 lab7/archive/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab7/archive/rootfs/one create mode 100644 lab7/archive/rootfs/two create mode 100644 lab7/bootloader/linker.ld create mode 100644 lab7/bootloader/main.c create mode 100644 lab7/bootloader/start.S create mode 100644 lab7/include/_cpio.h create mode 100644 lab7/include/current.h create mode 100644 lab7/include/dtb.h create mode 100644 lab7/include/exception_c.h create mode 100644 lab7/include/exception_s.h create mode 100644 lab7/include/exec.h create mode 100644 lab7/include/fork.h create mode 100644 lab7/include/initramfs.h create mode 100644 lab7/include/list.h create mode 100644 lab7/include/mini_uart.h create mode 100644 lab7/include/mm.h create mode 100644 lab7/include/mmu.h create mode 100644 lab7/include/peripheral/base.h create mode 100644 lab7/include/peripheral/gpio.h create mode 100644 lab7/include/peripheral/mailbox.h create mode 100644 lab7/include/peripheral/mini_uart.h create mode 100644 lab7/include/sche.h create mode 100644 lab7/include/shell.h create mode 100644 lab7/include/signal.h create mode 100644 lab7/include/sprintf.h create mode 100644 lab7/include/stat.h create mode 100644 lab7/include/syscall.h create mode 100644 lab7/include/thread.h create mode 100644 lab7/include/timer.h create mode 100644 lab7/include/tmpfs.h create mode 100644 lab7/include/trap_frame.h create mode 100644 lab7/include/utils_c.h create mode 100644 lab7/include/utils_s.h create mode 100644 lab7/include/vfs.h create mode 100644 lab7/kernel/exception_c.c create mode 100644 lab7/kernel/exception_s.S create mode 100644 lab7/kernel/linker.ld create mode 100644 lab7/kernel/main.c create mode 100644 lab7/kernel/start.S create mode 100644 lab7/loadImg/loadImg.py create mode 100644 lab7/loadImg/loadImg.sh create mode 100644 lab7/requirements.txt create mode 100644 lab7/src/_cpio.c create mode 100644 lab7/src/dtb.c create mode 100644 lab7/src/exec.c create mode 100644 lab7/src/fork.c create mode 100644 lab7/src/initramfs.c create mode 100644 lab7/src/list.c create mode 100644 lab7/src/mailbox.c create mode 100644 lab7/src/memzero.S create mode 100644 lab7/src/mini_uart.c create mode 100644 lab7/src/mm.c create mode 100644 lab7/src/mmu.c create mode 100644 lab7/src/sche.c create mode 100644 lab7/src/shell.c create mode 100644 lab7/src/signal.c create mode 100644 lab7/src/sprintf.c create mode 100644 lab7/src/syscall.c create mode 100644 lab7/src/thread.c create mode 100644 lab7/src/timer.c create mode 100644 lab7/src/tmpfs.c create mode 100644 lab7/src/trans_el.S create mode 100644 lab7/src/utils_c.c create mode 100644 lab7/src/utils_s.S create mode 100644 lab7/src/vfs.c create mode 100644 lab7/users/user1/linker.ld create mode 100644 lab7/users/user1/main.c create mode 100644 lab7/users/user2/linker.ld create mode 100644 lab7/users/user2/main.c diff --git a/lab7/Makefile b/lab7/Makefile new file mode 100644 index 000000000..785c198a1 --- /dev/null +++ b/lab7/Makefile @@ -0,0 +1,106 @@ +CFLAG = -Iinclude -Wall -ffreestanding -fno-stack-protector -nostdlib -nostartfiles -mgeneral-regs-only +K8=kernel8 +BL=bootloader +LINKER=linker.ld +START=start +CPIO:=archive/initramfs.cpio +TA_CPIO:=archive/TA/initramfs.cpio +TA_IMG:=archive/TA/vfs1.img + +DTB:=archive/bcm2710-rpi-3-b-plus.dtb +USER_DIR:=users/user +USER1:=user1 +USER2:=user2 +BUILD:=build/ + +BUILD_ELF:=$(shell find build/ -name '*.elf') +BUILD_IMG:=$(shell find build/ -name '*.img') +ARC_ROOTFS_IMG:=$(shell find archive/rootfs -name '*.img') + +SRC_C:=$(shell find src/ -name '*.c') +SRC_S:=$(shell find src/ -name '*.S') + +KER_C:=$(shell find kernel/ -name '*.c') +KER_S:=$(shell find kernel/ -name '*.S') + +BL_C:=$(shell find bootloader/ -name '*.c') +BL_S:=$(shell find bootloader/ -name '*.S') + +USER1_C:=$(shell find users/user1/ -name '*.c') +USER1_OBJS:= $(USER1_C:%.c=%.o) + +USER2_C:=$(shell find users/user2/ -name '*.c') +USER2_OBJS:= $(USER2_C:%.c=%.o) + +OBJS:= $(SRC_C:%.c=%.o) \ + $(SRC_S:%.S=%.o) \ + + +KERNEL_OBJS:=$(KER_C:%.c=%.o) \ + $(KER_S:%.S=%.o) + + + +BL_OBJS:=$(BL_C:%.c=%.o) \ + $(BL_S:%.S=%.o) \ + src/mini_uart.o src/utils_c.o src/utils_s.o src/memzero.o src/sprintf.o + + + + +all: $(BUILD)$(USER1).img\ + $(BUILD)$(USER2).img \ + $(BUILD)$(K8).img \ + $(BUILD)$(BL).img \ + rd.o + + + +rd.o:$(CPIO) + aarch64-linux-gnu-ld -r -b binary -o rd.o $(CPIO) + + +%.o: %.S + aarch64-linux-gnu-gcc -g -o $@ -c $< + +%.o: %.c + aarch64-linux-gnu-gcc -g -o $@ $(CFLAG) -c $< + + +$(BUILD)$(K8).img: $(OBJS) $(KERNEL_OBJS) + aarch64-linux-gnu-ld -T kernel/$(LINKER) -o $(BUILD)$(K8).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(K8).elf $@ + +$(BUILD)$(BL).img: $(BL_OBJS) + aarch64-linux-gnu-ld -T bootloader/$(LINKER) -o $(BUILD)$(BL).elf $^ + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(BL).elf $@ + +$(BUILD)$(USER1).img:$(USER1_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)1/$(LINKER) -o $(BUILD)$(USER1).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER1).elf $@ + cp $@ archive/rootfs/ + +$(BUILD)$(USER2).img:$(USER2_OBJS) + aarch64-linux-gnu-ld -T $(USER_DIR)2/$(LINKER) -o $(BUILD)$(USER2).elf $< + aarch64-linux-gnu-objcopy -O binary $(BUILD)$(USER2).elf $@ + cp $@ archive/rootfs/ + +$(CPIO): + cp $(TA_IMG) archive/rootfs + cd archive/rootfs&&find . | cpio -o -H newc > ../initramfs.cpio + +on: + sudo screen /dev/ttyUSB0 115200 +qe: $(BUILD)$(K8).img + qemu-system-aarch64 -M raspi3 -kernel $< \ + -display none \ + -serial null -serial stdio -s \ + -initrd $(CPIO) \ + -dtb $(DTB) \ + +clean: + $(RM) $(BUILD_ELF) $(CPIO) \ + $(OBJS) $(KERNEL_OBJS) $(BL_OBJS) $(USER1_OBJS) $(USER2_OBJS)\ + $(ARC_ROOTFS_IMG) \ + $(BUILD_IMG) \ + \ No newline at end of file diff --git a/lab7/archive/TA/initramfs.cpio b/lab7/archive/TA/initramfs.cpio new file mode 100644 index 0000000000000000000000000000000000000000..0676fb1584617bc4d73624b3b212a12133e97d8e GIT binary patch literal 247296 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�$5T3bfUfi!~)t8f40G1mc=YEL3e#o195=B+7?@H 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

    9zL@=m*GkFg> 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

    sAsSy>wpQsKfiH#t&|}wslIi!%N7MJ|6Wb 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 Y@}IBef4!gR{Wn|tpKi7M-`Dd00N}u82><{9 literal 0 HcmV?d00001 diff --git a/lab7/archive/TA/vm.img b/lab7/archive/TA/vm.img new file mode 100644 index 0000000000000000000000000000000000000000..8ba674e6c8650e239c6cd1322db6637bdd023baf GIT binary patch literal 247488 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
    LaIRxxGkGu2Nc^r*p2nQQ3R%~CR5{JU3A)Ai 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
    SF)2$rkIVdBRwZU;YFI)_}YEc(*mgDU?` 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 Y|NVQD{zsGk@BjU0zWVPb{hucNe;je&3jhEB literal 0 HcmV?d00001 diff --git a/lab7/archive/bcm2710-rpi-3-b-plus.dtb b/lab7/archive/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..3934b3a26eb82fd65dbcdfca6f6916da427a3fae GIT binary patch literal 31790 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 literal 0 HcmV?d00001 diff --git a/lab7/archive/rootfs/one b/lab7/archive/rootfs/one new file mode 100644 index 000000000..50ecbb596 --- /dev/null +++ b/lab7/archive/rootfs/one @@ -0,0 +1,3 @@ +1 2 3 +4 5 6 +7 8 9 diff --git a/lab7/archive/rootfs/two b/lab7/archive/rootfs/two new file mode 100644 index 000000000..599c97676 --- /dev/null +++ b/lab7/archive/rootfs/two @@ -0,0 +1,3 @@ +hello + world + !!!!! diff --git a/lab7/bootloader/linker.ld b/lab7/bootloader/linker.ld new file mode 100644 index 000000000..2efc319db --- /dev/null +++ b/lab7/bootloader/linker.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x60000; + _stext = .; + .text : { + *(.text.relo) + _bl_entry = .; + *(.text.boot) + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + + _blsize = _ebss - _stext; +} diff --git a/lab7/bootloader/main.c b/lab7/bootloader/main.c new file mode 100644 index 000000000..a18076e82 --- /dev/null +++ b/lab7/bootloader/main.c @@ -0,0 +1,48 @@ +#include "mini_uart.h" +#include "utils_c.h" +#include "utils_s.h" +#include +#define BUFFER_MAX_SIZE 256u + +extern char *_dtb; +void load_img() +{ + char * kernel_addr = (char *)0x80000; + uart_send_string("Please sent the kernel image size:"); + char buffer[BUFFER_MAX_SIZE]; + // read_command(buffer); + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); + unsigned int img_size = utils_str2uint_dec(buffer); + uart_send_string("Start to load the kernel image... \n"); + + unsigned char *current = (unsigned char *)kernel_addr; + while (img_size--) + { + *current = uart_recv_raw(); + current++; + uart_send('.'); + } + uart_send_string("loading...\n"); + // branchAddr(kernel_addr); + ((void (*)(char *))kernel_addr)(_dtb); +} + +void bootloader_main(void) +{ + uart_init(); + uart_send_string("In bootloader_main!\n"); + load_img(); +} \ No newline at end of file diff --git a/lab7/bootloader/start.S b/lab7/bootloader/start.S new file mode 100644 index 000000000..549ee4109 --- /dev/null +++ b/lab7/bootloader/start.S @@ -0,0 +1,46 @@ +.section ".text.relo" +.globl _start + +# need to relocate the bootloader from 0x80000 to 0x60000 +_start: + adr x10, . //x10=0x80000 + ldr x11, =_blsize + add x11, x11, x10 + ldr x12, =_stext // x12=0x60000 + +moving_relo: + cmp x10, x11 //without bootloader + b.eq end_relo + ldr x13, [x10] + str x13, [x12] //move 0x80000 data to 0x60000 + add x12, x12, #8 + add x10, x10, #8 + b moving_relo +end_relo: + ldr x14, =_bl_entry //jump to boot part + br x14 + + +.section ".text.boot" +.globl _start_bl + ldr x20, =_dtb + str x0, [x20] + mrs x20, mpidr_el1 + and x20, x20,#0xFF // Check processor id + cbz x20, master // Hang for all non-primary CPU + +hang: + b hang + +master: + adr x20, _sbss + adr x21, _ebss + sub x21, x21, x20 + bl memzero + + mov sp, #0x400000 // 4MB + bl bootloader_main + +.global _dtb +.section .data +_dtb: .dc.a 0x0 diff --git a/lab7/include/_cpio.h b/lab7/include/_cpio.h new file mode 100644 index 000000000..52e4fd260 --- /dev/null +++ b/lab7/include/_cpio.h @@ -0,0 +1,33 @@ +#ifndef __CPIO_H +#define __CPIO_H +#include +#include "mmu.h" + +/* + cpio archive comprises a header record with basic numeric metadata followed by + the full pathname of the entry and the file data. +*/ +typedef struct cpio_header +{ + // uses 8-byte hexadecimal fields for all numbers + char c_magic[6]; // determine whether this archive is written with little-endian or big-endian integers. + char c_ino[8]; // determine when two entries refer to the same file. + char c_mode[8]; // specifies both the regular permissions and the file type. + char c_uid[8]; // numeric user id + char c_gid[8]; // numeric group id + char c_nlink[8]; // number of links to this file. + char c_mtime[8]; // Modification time of the file + char c_filesize[8]; // size of the file + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; // number of bytes in the pathname + char c_check[8]; // always set to zero by writers and ignored by readers. +} cpio_header; + +void cpio_ls(); +void cpio_cat(const char *filename); +char *findFile(const char *name); +size_t cpio_load_program(const char *filename, void **put_addr, pd_t *table); +#endif \ No newline at end of file diff --git a/lab7/include/current.h b/lab7/include/current.h new file mode 100644 index 000000000..9cc1e993a --- /dev/null +++ b/lab7/include/current.h @@ -0,0 +1,16 @@ +#ifndef _CURRENT_H +#define _CURRENT_H + +#include "thread.h" + +static inline struct task *get_thread_ds() +{ + return (struct task *)read_sysreg(tpidr_el1); +} +static inline void set_thread_ds(struct task *cur) +{ + write_sysreg(tpidr_el1, cur); +} +#define current get_thread_ds() + +#endif diff --git a/lab7/include/dtb.h b/lab7/include/dtb.h new file mode 100644 index 000000000..461f32cbe --- /dev/null +++ b/lab7/include/dtb.h @@ -0,0 +1,39 @@ +#ifndef _DTB_H +#define _DTB_H +#include +#include +/* + structure block: located at a 4-byte aligned offset from the beginning of the devicetree blob + token is a big-endian 32-bit integer, alligned on 32bit(padding 0) + +*/ + +#define FDT_BEGIN_NODE 0x00000001 +#define FDT_END_NODE 0x00000002 +#define FDT_PROP 0x00000003 +#define FDT_NOP 0x00000004 +#define FDT_END 0x00000009 + +typedef struct fdt_header +{ + uint32_t magic; // contain the value 0xd00dfeed (big-endian). + uint32_t totalsize; // in byte + uint32_t off_dt_struct; // the offset in bytes of the structure block from the beginning of the header + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; // the length in bytes of the strings block section + uint32_t size_dt_struct; +} fdt_header; + +typedef void (*fdt_callback)(int type, const char *name, const void *data, uint32_t size); +void print_dtb(int type, const char *name, const void *data, uint32_t size); +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size); +int fdt_traverse(fdt_callback cb); + +extern uintptr_t dtb_end, dtb_start; +extern char *initramfs_start, *initramfs_end; + +#endif \ No newline at end of file diff --git a/lab7/include/exception_c.h b/lab7/include/exception_c.h new file mode 100644 index 000000000..c47caa49c --- /dev/null +++ b/lab7/include/exception_c.h @@ -0,0 +1,17 @@ +#ifndef _EXCEPTION_C_H +#define _EXCEPTION_C_H +#include +#include "trap_frame.h" +typedef void (*task_callback)(void *); + +void enable_interrupt(); +void disable_interrupt(); +unsigned long disable_irq(); +void irq_restore(unsigned long flag); + +void default_handler(); +void lower_sync_handler(TrapFrame *_regs); +void irq_handler(); +void curr_sync_handler(); + +#endif diff --git a/lab7/include/exception_s.h b/lab7/include/exception_s.h new file mode 100644 index 000000000..fd2409595 --- /dev/null +++ b/lab7/include/exception_s.h @@ -0,0 +1,6 @@ +#ifndef _EXCEPTION_S_H +#define _EXCEPTION_S_H + +void restore_regs_eret(); + +#endif diff --git a/lab7/include/exec.h b/lab7/include/exec.h new file mode 100644 index 000000000..2676c33ae --- /dev/null +++ b/lab7/include/exec.h @@ -0,0 +1,7 @@ +#ifndef __EXEC_H_ +#define __EXEC_H_ + +void exe_new_prog(char *filename); +int do_exec(const char *path, const char *argv[]); + +#endif \ No newline at end of file diff --git a/lab7/include/fork.h b/lab7/include/fork.h new file mode 100644 index 000000000..3fa7d5d3b --- /dev/null +++ b/lab7/include/fork.h @@ -0,0 +1,8 @@ +#ifndef __FORK_H_ +#define __FORK_H_ +#include +#include "trap_frame.h" + +size_t do_fork(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab7/include/initramfs.h b/lab7/include/initramfs.h new file mode 100644 index 000000000..85a29fee2 --- /dev/null +++ b/lab7/include/initramfs.h @@ -0,0 +1,10 @@ +#ifndef __INITRAM_FS_H +#define __INITRAM_FS_H + +struct filesystem *initramfs_create(); +struct vnode* vnode_create(const char *name, unsigned int flags); + +extern struct file_operations initramfs_f_ops; +extern struct vnode_operations initramfs_v_ops; + +#endif diff --git a/lab7/include/list.h b/lab7/include/list.h new file mode 100644 index 000000000..0f886e233 --- /dev/null +++ b/lab7/include/list.h @@ -0,0 +1,45 @@ +#ifndef __LIST_H +#define __LIST_H +#include +#include + +typedef struct list +{ + struct list *next, *prev; +} list; + +#define container_of(ptr, type, member) ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); }) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +#define list_for_each_entry(entry, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) + +#define LIST_HEAD_INIT(name) \ + { \ + &(name), &(name) \ + } + +static inline int list_empty(const list *head) +{ + return head->next == head; +} + +void list_init(list *node); +void insert_head(list *head, list *v); +void insert_tail(list *head, list *v); +list *remove_head(list *head); +list *remove_tail(list *head); +void unlink(list *node); +#endif diff --git a/lab7/include/mini_uart.h b/lab7/include/mini_uart.h new file mode 100644 index 000000000..2c17055b3 --- /dev/null +++ b/lab7/include/mini_uart.h @@ -0,0 +1,22 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + + +void delay(unsigned int clock); +void enable_uart_interrupt(); +void disable_uart_interrupt(); +void uart_init(); +void uart_send_string(const char* str); +void uart_send(const char c); +char uart_recv(); +char uart_recv_raw(); +void uart_hex(unsigned int d); +void uart_dec(unsigned int num); +void uart_handler(); +void test_uart_async(); +char uart_async_recv(); +void uart_async_send_string(char *str); +void uart_async_send(char c); + +unsigned int uart_printf(char* fmt, ...); +#endif \ No newline at end of file diff --git a/lab7/include/mm.h b/lab7/include/mm.h new file mode 100644 index 000000000..0294a50af --- /dev/null +++ b/lab7/include/mm.h @@ -0,0 +1,47 @@ +#ifndef _MM_H +#define _MM_H + +#include +#include + +#define STARTUP_MEM_START (PHYS_OFFSET + 0x07000000) +#define STARTUP_MEM_END (PHYS_OFFSET + 0x07ffffff) + +typedef struct FrameFlag +{ + unsigned char flag; + unsigned char order; + unsigned short ref_count; + unsigned char chunk_order; +} FrameFlag; + +typedef struct Chunk +{ + struct Chunk *next; +} Chunk; + +// buddy system +void init_buddy(); +void *alloc_pages(unsigned int pages); +void free_pages(void *victim); + +// dynamic mem allocate +void *kmalloc(unsigned int size); +void *kcalloc(unsigned int size); +void kfree(void *ptr); + +// test +void test_buddy(); +void test_dynamic_alloc(); + +// others +void memory_reserve(uintptr_t start, uintptr_t end); +void mm_init(); +void merge_useful_pages(); + +// start up allocation +void *smalloc(size_t size); + + +#endif + diff --git a/lab7/include/mmu.h b/lab7/include/mmu.h new file mode 100644 index 000000000..02159b620 --- /dev/null +++ b/lab7/include/mmu.h @@ -0,0 +1,53 @@ +#ifndef __MMU_H_ +#define __MMU_H_ + +#include "exception_c.h" +typedef unsigned long pd_t; + +#define PHYS_OFFSET 0xffff000000000000 +#define PAR_PA_MASK 0xffffffff000L + +#define PAGE_SIZE 0x1000 +#define USTACK_VA 0xffffffffb000 +#define STACK_SIZE 0x4000 +#define UPROG_VA 0x0 + +#define PD_TABLE 0b11 +#define PD_BLOCK 0b01 +#define PD_PAGE 0b11 +#define PD_ACCESS (1 << 10) +#define PD_USER_RW (0b01 << 6) +#define PD_USER_R (0b11 << 6) +#define PD_UXN (1L << 54) +#define PD_PXN (1L << 53) + +// #define pa2va(p) (((unsigned long)(p + PHYS_OFFSET))) +// #define va2pa(p) (((unsigned long)(p - PHYS_OFFSET))) + +static inline void *pa2va(unsigned long p) +{ + return (void *)(p + PHYS_OFFSET); +} + +static inline unsigned long va2pa(void *p) +{ + return (unsigned long)p - PHYS_OFFSET; +} + +#define IDENTITY_TT_L0 ((pd_t *)0x1000L) +#define IDENTITY_TT_L1 ((pd_t *)0x2000L) +#define IDENTITY_TT_L0_VA ((pd_t *)pa2va(0x1000L)) +#define IDENTITY_TT_L1_VA ((pd_t *)pa2va(0x2000L)) + +void setup_identity_mapping(); +void setup_kernel_space_mapping(); +void map_page(pd_t *table, unsigned long va, unsigned long pa, unsigned long flags); +void *alloc_stack(pd_t *table, unsigned long size); +void *alloc_prog(pd_t *table, unsigned long size, const char *file_content); +void setup_peripheral_identity(pd_t *table); +unsigned long get_pte(unsigned long va); +unsigned long el0_va2pa(unsigned long va); +void free_page_table(pd_t *table); +void replace_page_table(); + +#endif diff --git a/lab7/include/peripheral/base.h b/lab7/include/peripheral/base.h new file mode 100644 index 000000000..d9c9422a5 --- /dev/null +++ b/lab7/include/peripheral/base.h @@ -0,0 +1,9 @@ +#ifndef _PERIPHERAL_BASE_H +#define _PERIPHERAL_BASE_H + +#include "mmu.h" + +#define MMIO_BASE PHYS_OFFSET + 0x3F000000 +#define MAILBOX_BASE MMIO_BASE + 0xb880 + +#endif \ No newline at end of file diff --git a/lab7/include/peripheral/gpio.h b/lab7/include/peripheral/gpio.h new file mode 100644 index 000000000..8246c40ae --- /dev/null +++ b/lab7/include/peripheral/gpio.h @@ -0,0 +1,12 @@ +#ifndef _PERIPHERAL_GPIO_H +#define _PERIPHERAL_GPIO_H + +#include "peripheral/base.h" + +#define GPFSEL1 ((volatile unsigned int *)(MMIO_BASE+0x00200004)) +#define GPSET0 ((volatile unsigned int *)(MMIO_BASE+0x0020001C)) +#define GPCLR0 ((volatile unsigned int *)(MMIO_BASE+0x00200028)) +#define GPPUD ((volatile unsigned int *)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int *)(MMIO_BASE+0x00200098)) + +#endif \ No newline at end of file diff --git a/lab7/include/peripheral/mailbox.h b/lab7/include/peripheral/mailbox.h new file mode 100644 index 000000000..fc26769a9 --- /dev/null +++ b/lab7/include/peripheral/mailbox.h @@ -0,0 +1,36 @@ +#ifndef _MAILBOX_H +#define _MAILBOX_H + +#include "peripheral/base.h" + +#define MAILBOX_READ ((volatile unsigned int *)(MAILBOX_BASE)) +#define MAILBOX_STATUS ((volatile unsigned int *)(MAILBOX_BASE + 0x18)) +#define MAILBOX_WRITE ((volatile unsigned int *)(MAILBOX_BASE + 0x20)) + +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 +#define MAILBOX_RESPONSE 0x80000000 +#define ARM_MEMORY 0x00010005 + +#define GET_BOARD_REVISION 0x00010002 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +#define MAILBOX_CH_POWER 0 +#define MAILBOX_CH_FB 1 +#define MAILBOX_CH_VUART 2 +#define MAILBOX_CH_VCHIQ 3 +#define MAILBOX_CH_LEDS 4 +#define MAILBOX_CH_BTNS 5 +#define MAILBOX_CH_TOUCH 6 +#define MAILBOX_CH_COUNT 7 +#define MAILBOX_CH_PROP 8 + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox); +unsigned int get_board_revision(); +void get_arm_memory(); + +#endif \ No newline at end of file diff --git a/lab7/include/peripheral/mini_uart.h b/lab7/include/peripheral/mini_uart.h new file mode 100644 index 000000000..0ac714e1c --- /dev/null +++ b/lab7/include/peripheral/mini_uart.h @@ -0,0 +1,30 @@ +#ifndef _PERIPHERAL_MINI_UART_H +#define _PERIPHERAL_MINI_UART_H + +#include "peripheral/base.h" + +#define AUX_ENABLE ((volatile unsigned int *)(MMIO_BASE + 0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int *)(MMIO_BASE + 0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int *)(MMIO_BASE + 0x00215068)) + + + +#define ARM_IRQ_REG_BASE ((volatile unsigned int*)(MMIO_BASE + 0x0000b000)) +#define IRQ_PENDING_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b204)) +#define ENB_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b210)) +#define DISABLE_IRQS1 ((volatile unsigned int*)(MMIO_BASE + 0x0000b21c)) +#define AUX_IRQ (1 << 29) + + + + +#endif \ No newline at end of file diff --git a/lab7/include/sche.h b/lab7/include/sche.h new file mode 100644 index 000000000..e3cb851d7 --- /dev/null +++ b/lab7/include/sche.h @@ -0,0 +1,67 @@ +#ifndef __SCHE_H +#define __SCHE_H +#include "list.h" +#include "signal.h" +#include "mmu.h" +#include "vfs.h" + +typedef unsigned long pid_t; +typedef enum +{ + TASK_RUNNING, + TASK_WAITING, + TASK_STOPPED, + TASK_INIT, +} state_t; + +struct cpu_context +{ + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long fp; + unsigned long sp; + unsigned long lr; +}; + +struct task +{ + struct cpu_context cpu_context; + char *kernel_stack; + char *user_stack; + char *user_prog; + size_t user_prog_size; + state_t state; + pid_t pid; + unsigned need_resched; + int exitcode; + unsigned long timeout; + list list; + struct signal *signal; + struct signal_context *sig_context; + pd_t *ttbr0; + struct vnode *pwd; + struct file *fd_table[FD_TABLE_SIZE]; +}; + +extern list running_queue, waiting_queue, stopped_queue; +void add_task(struct task *t); +void kill_task(struct task *_task, int status); +void restart_task(struct task *_task); +void pause_task(struct task *_task); +void sleep_task(size_t ms); +void free_task(struct task *victim); +struct task *create_task(); +void switch_task(struct task *next); +struct task *pick_next_task(); +int get_the_cur_count(); +struct task *get_task(pid_t target); +extern pid_t task_count; +#endif \ No newline at end of file diff --git a/lab7/include/shell.h b/lab7/include/shell.h new file mode 100644 index 000000000..08f251990 --- /dev/null +++ b/lab7/include/shell.h @@ -0,0 +1,7 @@ +#ifndef _SHELL_H +#define _SHELL_H + +void shell(); +void read_command(char *str); +void parse_command(char *str); +#endif \ No newline at end of file diff --git a/lab7/include/signal.h b/lab7/include/signal.h new file mode 100644 index 000000000..768e13b87 --- /dev/null +++ b/lab7/include/signal.h @@ -0,0 +1,27 @@ +#ifndef __SIGNAL_H +#define __SIGNAL_H + +#define SIGKILL 9 + +#include "list.h" +#include "trap_frame.h" +#define SIG_NUM (sizeof(signal_table) / sizeof(signal_table[0])) +typedef void (*signal_handler)(int); + +struct signal +{ + unsigned int sig_num; + signal_handler handler; + struct list list; +}; +struct signal_context +{ + TrapFrame *trapframe; + char *user_stack; +}; + +extern signal_handler signal_table[]; + +void sig_context_update(TrapFrame *_regs, void (*handler)()); +void sig_context_restore(TrapFrame *_regs); +#endif diff --git a/lab7/include/sprintf.h b/lab7/include/sprintf.h new file mode 100644 index 000000000..a7c47f848 --- /dev/null +++ b/lab7/include/sprintf.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ +#ifndef __SPRINT_H +#define __SPRINT_H + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +#endif \ No newline at end of file diff --git a/lab7/include/stat.h b/lab7/include/stat.h new file mode 100644 index 000000000..c910dd761 --- /dev/null +++ b/lab7/include/stat.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __STAT_H +#define __STAT_H + +#define S_IFMT 00170000 +#define S_IFSOCK 0140000 +#define S_IFLNK 0120000 +#define S_IFREG 0100000 +#define S_IFBLK 0060000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 + +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) + +#define S_IRWXU 00700 +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 + +#define S_IRWXG 00070 +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 + +#define S_IRWXO 00007 +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 + +#endif \ No newline at end of file diff --git a/lab7/include/syscall.h b/lab7/include/syscall.h new file mode 100644 index 000000000..8b43f759e --- /dev/null +++ b/lab7/include/syscall.h @@ -0,0 +1,36 @@ +#ifndef __SYSCALL_H +#define __SYSCALL_H + +#include "trap_frame.h" + +#define _STR(x) #x +#define STR(s) _STR(s) + +typedef void (*syscall)(TrapFrame *); + +enum { + SYS_GETPID, //0 + SYS_UART_RECV, + SYS_UART_WRITE, + SYS_EXEC, + SYS_FORK, + SYS_EXIT, //5 + SYS_MBOX, + SYS_KILL_PID, + SYS_SIGNAL, + SYS_SIGKILL, + SYS_SIGRETURN, //10 + SYS_OPEN, + SYS_CLOSE, + SYS_WRITE, + SYS_READ, + SYS_MKDIR, //15 + SYS_MOUNT, + SYS_CHDIR, + NUM_syscalls +}; + +extern syscall syscall_table[]; +void syscall_handler(TrapFrame *regs); + +#endif \ No newline at end of file diff --git a/lab7/include/thread.h b/lab7/include/thread.h new file mode 100644 index 000000000..59d238278 --- /dev/null +++ b/lab7/include/thread.h @@ -0,0 +1,13 @@ +#ifndef _THREAD_H +#define _THREAD_H +#include "list.h" +#include "utils_s.h" +#include "sche.h" +#define STACK_SIZE 0x4000 + +void thread_kill_zombies(); +void thread_schedule(size_t _); +void thread_init(); +struct task *thread_create(void *func); +void test_thread(); +#endif diff --git a/lab7/include/timer.h b/lab7/include/timer.h new file mode 100644 index 000000000..cd987ec6d --- /dev/null +++ b/lab7/include/timer.h @@ -0,0 +1,39 @@ +#ifndef __TIMER_H +#define __TIMER_H +#include "stddef.h" +#include "mmu.h" +#define CORE0_TIMER_IRQ_CTRL ((volatile unsigned int *)(PHYS_OFFSET + 0x40000040)) +#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int *)(PHYS_OFFSET + 0x40000060)) +#define DEFAULT_TIMEOUT 30LL +#define SCHE_CYCLE 30LL +#define SYSTEM_TIMER_MSG "system_timeout" +#define S(n) (n * 1000LL) +#define MS(n) (n * 1LL) +#define GET_S(n) (n / 1000LL) +#define GET_MS(n) (n % 1000LL) + +typedef void (*timer_callback)(size_t); + +void core_timer_enable(); +void core_timer_disable(); +void set_expired_time(unsigned long duration); +unsigned long get_current_time(); +void core_timer_handler(); +void set_timeout(char *message, unsigned long time); +void print_message(char *msg); +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duraction); +void timeout_event_init(); +void timer_handler(); + +typedef struct timeout_event +{ + unsigned long register_time; + unsigned long duration; + timer_callback callback; + size_t arg; + struct timeout_event *prev, *next; +} timeout_event; + +extern timeout_event *timeout_queue_head, *timeout_queue_tail; + +#endif diff --git a/lab7/include/tmpfs.h b/lab7/include/tmpfs.h new file mode 100644 index 000000000..71b66766a --- /dev/null +++ b/lab7/include/tmpfs.h @@ -0,0 +1,10 @@ +#ifndef __TMPFS_H_ +#define __TMPFS_H_ + +#define COMPONENT_SIZE 16 +struct filesystem *tmpfs_create(); +struct vnode* vnode_create(const char *name, unsigned int flags); + +extern struct file_operations tmpfs_f_ops; +extern struct vnode_operations tmpfs_v_ops; +#endif \ No newline at end of file diff --git a/lab7/include/trap_frame.h b/lab7/include/trap_frame.h new file mode 100644 index 000000000..593c45d50 --- /dev/null +++ b/lab7/include/trap_frame.h @@ -0,0 +1,12 @@ +#ifndef __TRAP_FRAME_H +#define __TRAP_FRAME_H + +typedef struct +{ + unsigned long regs[31]; // general purpose regs x0~x30 + unsigned long sp; // sp_el0 + unsigned long pc; // elr_el1 + unsigned long pstate; // spsr_el1 +}TrapFrame; + +#endif \ No newline at end of file diff --git a/lab7/include/utils_c.h b/lab7/include/utils_c.h new file mode 100644 index 000000000..16e3f9d24 --- /dev/null +++ b/lab7/include/utils_c.h @@ -0,0 +1,33 @@ +#ifndef _UTILS_C_H +#define _UTILS_C_H +#include +#include +#include "mmu.h" +#define PM_PASSWORD (PHYS_OFFSET + 0x5a000000) +#define PM_RSTC (PHYS_OFFSET + 0x3F10001c) +#define PM_WDOG (PHYS_OFFSET + 0x3F100024) + + +/* string */ +int utils_str_compare(const char *a, const char *b); +int utils_strncmp(const char *a, const char *b, size_t n); +void utils_newline2end(char *str); +char utils_int2char(int a); +void utils_int2str_dec(int a, char *str); +void utils_uint2str_dec(unsigned int num, char *str); +unsigned int utils_str2uint_dec(const char *str); +void align(void *size, size_t s); // aligned to 4 byte +size_t utils_strlen(const char *s); +uint32_t align_up(uint32_t size, int alignment); + +/* reboot */ +void set(long addr, unsigned long value); +void reset(int tick); +void cancel_reset(); + +/* others */ +void delay(unsigned int clock); +void memcpy(void *dst, const void *src, size_t n); +void *memset(void *s, int c, size_t n); + +#endif diff --git a/lab7/include/utils_s.h b/lab7/include/utils_s.h new file mode 100644 index 000000000..6f5a01825 --- /dev/null +++ b/lab7/include/utils_s.h @@ -0,0 +1,41 @@ +#ifndef __UTILS_S_H +#define __UTILS_S_H + +#define read_sysreg(r) ({ \ + unsigned long __val; \ + asm volatile("mrs %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_sysreg(r, __val) ({ \ + asm volatile("msr " #r ", %0" ::"r"(__val)); \ +}) + +#define read_gpreg(r) ({ \ + unsigned long __val; \ + asm volatile("mov %0, " #r \ + : "=r"(__val)); \ + __val; \ +}) + +#define write_gpreg(r, __val) ({ \ + asm volatile("mov " #r ", %0" ::"r"(__val)); \ +}) + + +// EC,bits[31:26] +#define ESR_ELx_EC(esr) ((esr & 0xFC000000) >> 26) +// ISS,bits[24:0] +#define ESR_ELx_ISS(esr) (esr & 0x03FFFFFF) + +#define ESR_ELx_EC_SVC64 0b010101 +#define ESR_ELx_EC_DABT_LOW 0b100100 +#define ESR_ELx_EC_IABT_LOW 0b100000 + + +void branchAddr(void *addr); +int get_el(); +void switch_to(void *, void *); + +#endif diff --git a/lab7/include/vfs.h b/lab7/include/vfs.h new file mode 100644 index 000000000..aaaa5c6b5 --- /dev/null +++ b/lab7/include/vfs.h @@ -0,0 +1,87 @@ +#ifndef __VFS_H_ +#define __VFS_H_ + +#include "stat.h" +#include "list.h" + +// #define FS_DEBUG +#define FD_TABLE_SIZE 16 +#define O_CREAT 00000100 +struct vnode +{ + struct mount *mount; + struct vnode_operations *v_ops; + struct file_operations *f_ops; + + // internal + list childs; + size_t child_num; + list self; + struct vnode *parent; + char *name; + unsigned int f_mode; + + void *content; + size_t content_size; +}; + +// file handle +struct file +{ + struct vnode *vnode; + size_t f_pos; // RW position of this file handle + struct file_operations *f_ops; + int flags; +}; + +struct mount +{ + struct vnode *root; + struct filesystem *fs; +}; + +struct filesystem +{ + const char *name; + int (*setup_mount)(struct filesystem *fs, struct mount *mount); + list list; +}; + +struct file_operations +{ + int (*write)(struct file *file, const void *buf, size_t len); + int (*read)(struct file *file, void *buf, size_t len); + int (*open)(struct vnode *file_node, struct file **target); + int (*close)(struct file *file); + long (*lseek64)(struct file *file, long offset, int whence); +}; + +struct vnode_operations +{ + int (*lookup)(struct vnode *dir_node, struct vnode **target, + const char *component_name); + int (*create)(struct vnode *dir_node, struct vnode **target, + const char *component_name); + int (*mkdir)(struct vnode *dir_node, struct vnode **target, + const char *component_name); +}; + +void fs_init(); + +int fs_register(struct filesystem *fs); +struct filesystem *fs_get(const char *name); + +int vfs_open(const char *pathname, int flags, struct file **target); +int vfs_close(struct file *file); +int vfs_write(struct file *file, const void *buf, size_t len); +int vfs_read(struct file *file, void *buf, size_t len); +int vfs_mkdir(const char *pathname); +int vfs_mount(const char *target, const char *filesystem); +int vfs_lookup(const char *pathname, struct vnode **target); +int vfs_chdir(const char *pathname); +struct vnode *vnode_create(const char *name, unsigned int flags); +void vfs_test(); + + +extern struct mount *rootfs, *initramfs; +#endif \ No newline at end of file diff --git a/lab7/kernel/exception_c.c b/lab7/kernel/exception_c.c new file mode 100644 index 000000000..5d5472def --- /dev/null +++ b/lab7/kernel/exception_c.c @@ -0,0 +1,109 @@ +#include "utils_s.h" +#include "mini_uart.h" +#include "timer.h" +#include "peripheral/mini_uart.h" +#include "exception_c.h" +#include "current.h" +#include "thread.h" +#include "syscall.h" +#define AUX_IRQ (1 << 29) + +void enable_interrupt() { asm volatile("msr DAIFClr, 0xf"); } +void disable_interrupt() { asm volatile("msr DAIFSet, 0xf"); } +unsigned long disable_irq() +{ + unsigned long flag = read_sysreg(DAIF); + disable_interrupt(); + return flag; +} +void irq_restore(unsigned long flag) +{ + write_sysreg(DAIF, flag); +} + +void default_handler() +{ + unsigned long spsr = read_sysreg(spsr_el1); + unsigned long elr = read_sysreg(elr_el1); + unsigned long esr = read_sysreg(esr_el1); + uart_printf("spsr_el1: %x\n", spsr); + uart_printf("elr_el1: %x\n", elr); + uart_printf("esr_el1: %x\n\n", esr); +} + +void lower_irq_handler() +{ + unsigned long current_time = get_current_time(); + uart_printf("After booting: %d seconds\n\n", current_time); + set_expired_time(2); +} + +int data_abort = 0; +int ins_abort = 0; +void lower_sync_handler(TrapFrame *_regs) +{ + unsigned long esr = read_sysreg(esr_el1); // cause of that exception + unsigned int ec = ESR_ELx_EC(esr); + switch (ec) + { + case ESR_ELx_EC_SVC64: + enable_interrupt(); + syscall_handler(_regs); + disable_interrupt(); + break; + case ESR_ELx_EC_DABT_LOW: + if (!data_abort) + { + data_abort = 1; + uart_send_string("in Data Abort\n"); + } + break; + case ESR_ELx_EC_IABT_LOW: + if (!ins_abort) + { + ins_abort = 1; + uart_send_string("in Instruction Abort\n"); + } + break; + default: + return; + } +} + +void irq_handler() +{ + unsigned int irq_is_pending = (*IRQ_PENDING_1 & AUX_IRQ); + unsigned int uart = (*AUX_MU_IIR_REG & 0x1) == 0; + unsigned int core_timer = (*CORE0_INTERRUPT_SOURCE & 0x2); + if (irq_is_pending && uart) + { + uart_handler(); + } + else if (core_timer) + { + timer_handler(); + } +} + +int a = 0; +void curr_sync_handler() +{ + if (!a) + { + uart_send_string("!!! in current sync handler !!!\n"); + a = 1; + } + return; +} + +void curr_fiq_handler() +{ + uart_send_string("!!! in current fiq handler !!!\n"); + return; +} + +void curr_serr_handler() +{ + uart_send_string("!!! in current serr handler !!!\n"); + return; +} diff --git a/lab7/kernel/exception_s.S b/lab7/kernel/exception_s.S new file mode 100644 index 000000000..d9b5fbecf --- /dev/null +++ b/lab7/kernel/exception_s.S @@ -0,0 +1,214 @@ +// save general registers to stack +.macro save_gp_reg + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// load general registers from stack +.macro load_gp_reg + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + + +// save all gp_regs and exc_regs +.macro kernel_entry el + sub sp, sp, 17 * 16 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + + .if \el == 0 + mrs x0, sp_el0 + stp x30, x0, [sp, 16 * 15] + .else + str x30, [sp, 16 * 15] + .endif + + mrs x0, elr_el1 + mrs x1, spsr_el1 + stp x0, x1, [sp, 16 * 16] + + mov x0, sp +.endm + + +// load all gp_regs and exc_regs +.macro kernel_exit el + ldp x0, x1, [sp, 16 * 16] + msr elr_el1, x0 + msr spsr_el1, x1 + + .if \el ==0 + ldp x30, x0, [sp, 16 * 15] + msr sp_el0, x0 + .else + ldr x30, [sp, 16 * 15] + .endif + + ldp x28, x29, [sp ,16 * 14] + ldp x26, x27, [sp ,16 * 13] + ldp x24, x25, [sp ,16 * 12] + ldp x22, x23, [sp ,16 * 11] + ldp x20, x21, [sp ,16 * 10] + ldp x18, x19, [sp ,16 * 9] + ldp x16, x17, [sp ,16 * 8] + ldp x14, x15, [sp ,16 * 7] + ldp x12, x13, [sp ,16 * 6] + ldp x10, x11, [sp ,16 * 5] + ldp x8, x9, [sp ,16 * 4] + ldp x6, x7, [sp ,16 * 3] + ldp x4, x5, [sp ,16 * 2] + ldp x2, x3, [sp ,16 * 1] + ldp x0, x1, [sp ,16 * 0] + add sp, sp, 17 * 16 + + eret +.endm + +.global restore_regs_eret +restore_regs_eret: + bl replace_page_table + ldp x0, x1, [sp, 16 * 16] + msr elr_el1, x0 + msr spsr_el1, x1 + + ldp x30, x0, [sp, 16 * 15] + msr sp_el0, x0 + + ldp x28, x29, [sp ,16 * 14] + ldp x26, x27, [sp ,16 * 13] + ldp x24, x25, [sp ,16 * 12] + ldp x22, x23, [sp ,16 * 11] + ldp x20, x21, [sp ,16 * 10] + ldp x18, x19, [sp ,16 * 9] + ldp x16, x17, [sp ,16 * 8] + ldp x14, x15, [sp ,16 * 7] + ldp x12, x13, [sp ,16 * 6] + ldp x10, x11, [sp ,16 * 5] + ldp x8, x9, [sp ,16 * 4] + ldp x6, x7, [sp ,16 * 3] + ldp x4, x5, [sp ,16 * 2] + ldp x2, x3, [sp ,16 * 1] + ldp x0, x1, [sp ,16 * 0] + add sp, sp, 17 * 16 + + eret + + + +.macro exception_entry label + .align 7 + b \label // branch to a handler function. + +.endm + + +.global el1_vector_base + +.align 11 +el1_vector_base: + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + + + exception_entry _el1_curr_el_spx_sync + exception_entry _el1_curr_el_spx_irq + exception_entry _el1_curr_el_spx_fiq + exception_entry _el1_curr_el_spx_serr + + + exception_entry _el1_lower_el_aarch64_sync + exception_entry _el1_lower_el_aarch64_irq + exception_entry exception_handler + exception_entry exception_handler + + + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + exception_entry exception_handler + + +_el1_lower_el_aarch64_sync: + kernel_entry 0 + bl lower_sync_handler + kernel_exit 0 + +_el1_lower_el_aarch64_irq: + kernel_entry 0 + bl irq_handler + kernel_exit 0 + +_el1_curr_el_spx_sync: + save_gp_reg + bl curr_sync_handler + load_gp_reg + eret + +_el1_curr_el_spx_irq: + kernel_entry 1 + bl irq_handler + kernel_exit 1 + +_el1_curr_el_spx_fiq: + save_gp_reg + bl curr_fiq_handler + load_gp_reg + eret + +_el1_curr_el_spx_serr: + save_gp_reg + bl curr_serr_handler + load_gp_reg + eret + +exception_handler: + save_gp_reg + bl default_handler + load_gp_reg + eret diff --git a/lab7/kernel/linker.ld b/lab7/kernel/linker.ld new file mode 100644 index 000000000..e78847942 --- /dev/null +++ b/lab7/kernel/linker.ld @@ -0,0 +1,34 @@ +_skernel = 0xffff000000080000; +_ekernel = 0xffff000000400000; +/* _skernel = 0x80000; +_ekernel = 0x400000; */ + + +ENTRY(_start) +SECTIONS +{ + . = _skernel; + + _stext = .; + .text : { + *(.text.kernel) + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + + . = _ekernel; + +} \ No newline at end of file diff --git a/lab7/kernel/main.c b/lab7/kernel/main.c new file mode 100644 index 000000000..a43e66b1f --- /dev/null +++ b/lab7/kernel/main.c @@ -0,0 +1,39 @@ +#include "mini_uart.h" +#include "dtb.h" +#include "exception_c.h" +#include "utils_s.h" +#include "shell.h" +#include "mm.h" +#include "timer.h" +#include "thread.h" +#include "sche.h" +#include "exec.h" +#include "mmu.h" +#include "vfs.h" + +static void idle(void) +{ + while (1) + { + thread_kill_zombies(); + thread_schedule(0); + } +} + +void kernel_main(void *_dtb_ptr) +{ + dtb_start=(uintptr_t)_dtb_ptr; + uart_send_string("Hello, world!\n"); + mm_init(); + + setup_kernel_space_mapping(); + fs_init(); + + thread_init(); + // thread_create(&shell); + exe_new_prog("/initramfs/vfs1.img"); + timeout_event_init(); + add_timer((timer_callback)thread_schedule, (size_t)0, MS(SCHE_CYCLE)); + enable_interrupt(); + idle(); +} \ No newline at end of file diff --git a/lab7/kernel/start.S b/lab7/kernel/start.S new file mode 100644 index 000000000..71473982f --- /dev/null +++ b/lab7/kernel/start.S @@ -0,0 +1,62 @@ +.section ".text.kernel" +.globl _start + +#define PA(p) (p - 0xffff000000000000) + +_start: + ldr x9, =PA(_ekernel) + mov sp, x9 + + /* store dtb pointer */ + sub sp, sp, #0x10 + str x0, [sp] + + mov x9, sp + msr sp_el1, x9 + + /* cpu id pass */ + mrs x20, mpidr_el1 + and x20, x20,#0xFF // Check processor id + cbz x20, master // Hang for all non-primary CPU + +hang: + b hang + +master: + ldr x20, =PA(_sbss) + ldr x21, =PA(_ebss) + sub x21, x21, x20 + bl memzero + + /* setup interrupt vector base */ + ldr x0, =el1_vector_base + msr vbar_el1, x0 + bl from_el2_to_el1 + + bl setup_identity_mapping + + mov x1, #0 + movk x1, #0xffff, lsl 48 + + mov x0, sp + orr x0, x0, x1 + mov sp, x0 + + mov x0, fp + orr fp, x0, x1 + + ldr x0, [sp] + orr x0, x0, x1 + + ldr x2, =_dtb_ptr + str x0, [x2] + + ldr x9, =kernel_main + br x9 + +hang2: + b hang2 + +.global _dtb_ptr +.section .data +_dtb_ptr: .dc.a 0x0 \ No newline at end of file diff --git a/lab7/loadImg/loadImg.py b/lab7/loadImg/loadImg.py new file mode 100644 index 000000000..6fb3542ce --- /dev/null +++ b/lab7/loadImg/loadImg.py @@ -0,0 +1,30 @@ +#! /usr/bin/python3 + +import os +from socket import timeout +import time +import sys +import serial +from time import sleep + +BAUD_RATE = 115200 + +def send_img(ser,kernel): + print("Please sent the kernel image size:") + kernel_size=os.stat(kernel).st_size + ser.write((str(kernel_size)+"\n").encode()) + print(ser.read_until(b"Start to load the kernel image... \r\n").decode(), end="") + + with open(kernel, "rb") as image: + while kernel_size > 0: + kernel_size -= ser.write(image.read(1)) + ser.read_until(b".") + print(ser.read_until(b"$ ").decode(), end="") + return + +if __name__ == "__main__": + ser = serial.Serial("/dev/ttyUSB0", BAUD_RATE, timeout=5) + send_img(ser,"../build/kernel8.img") + + + diff --git a/lab7/loadImg/loadImg.sh b/lab7/loadImg/loadImg.sh new file mode 100644 index 000000000..171507561 --- /dev/null +++ b/lab7/loadImg/loadImg.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +sudo chmod 666 /dev/ttyUSB0 +source ../.env/bin/activate +python3 ./loadImg.py \ No newline at end of file diff --git a/lab7/requirements.txt b/lab7/requirements.txt new file mode 100644 index 000000000..4d1aaa2b8 --- /dev/null +++ b/lab7/requirements.txt @@ -0,0 +1 @@ +pyserial==3.5 \ No newline at end of file diff --git a/lab7/src/_cpio.c b/lab7/src/_cpio.c new file mode 100644 index 000000000..6c91469c2 --- /dev/null +++ b/lab7/src/_cpio.c @@ -0,0 +1,117 @@ +#include "_cpio.h" +#include "utils_c.h" +#include "dtb.h" +#include "mini_uart.h" +#include "timer.h" +#include "mm.h" +#include "mmu.h" + +static unsigned int hex2dec(char *s) +{ + unsigned int r = 0; + for (int i = 0; i < 8; ++i) + { + if (s[i] >= '0' && s[i] <= '9') + { + r = r * 16 + s[i] - '0'; + } + else + { + r = r * 16 + s[i] - 'A' + 10; + } + } + return r; +} + +char *findFile(const char *name) +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + if ((utils_str_compare((char *)(addr + sizeof(cpio_header)), name) == 0)) + { + return addr; + } + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + addr += (headerPathname_size + file_size); + } + return 0; +} +void cpio_ls() +{ + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_send_string(addr + sizeof(cpio_header)); // print the file name + uart_send_string("\n"); + + addr += (headerPathname_size + file_size); + } +} + +void cpio_cat(const char *filename) +{ + char *target = findFile(filename); + if (target) + { + cpio_header *header = (cpio_header *)target; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + char *file_content = target + headerPathname_size; + for (unsigned int i = 0; i < file_size; i++) + { + uart_send(file_content[i]); // print the file content + } + uart_send_string("\n"); + } + else + { + uart_send_string("Not found the file\n"); + } +} + +size_t cpio_load_program(const char *filename, void **target_addr, pd_t *table) +{ + char *prog_addr = findFile(filename); + if (prog_addr) + { + cpio_header *header = (cpio_header *)prog_addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + uart_printf("load the %s\n", prog_addr + sizeof(cpio_header)); + + char *file_content = prog_addr + headerPathname_size; + *target_addr = alloc_prog(table, file_size, file_content); + + return file_size; + } + else + { + uart_send_string("Not found the program\n"); + return -1; + } +} diff --git a/lab7/src/dtb.c b/lab7/src/dtb.c new file mode 100644 index 000000000..6c6d0528c --- /dev/null +++ b/lab7/src/dtb.c @@ -0,0 +1,143 @@ +#include "dtb.h" +#include "_cpio.h" +#include "mini_uart.h" +#include "utils_c.h" +/* + It consists of + a small header + + the memory reservation block + space(aligned) + + the structure block + space(aligned) + + the strings block + space(aligned) +*/ +int space = 0; +char *initramfs_start, *initramfs_end; + +uint32_t get_le2be_uint(const void *p) +{ + // transfer little endian to big endian + const unsigned char *bytes = p; + uint32_t res = bytes[3]; + res |= bytes[2] << 8; + res |= bytes[1] << 16; + res |= bytes[0] << 24; + return res; +} + +void send_sapce(int n) +{ + while (n--) + uart_send_string(" "); +} + +int parse_struct(fdt_callback cb, uintptr_t cur_ptr, uintptr_t strings_ptr, uint32_t totalsize) +{ + uintptr_t end_ptr = cur_ptr + totalsize; + + while (cur_ptr < end_ptr) + { + uint32_t token = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + switch (token) + { + case FDT_BEGIN_NODE: + // uart_send_string("In FDT_BEGIN_NODE\n"); + cb(token, (char *)cur_ptr, NULL, 0); + cur_ptr += align_up(utils_strlen((char *)cur_ptr), 4); + break; + case FDT_END_NODE: + // uart_send_string("In FDT_END_NODE\n"); + cb(token, NULL, NULL, 0); + break; + case FDT_PROP: + { + // uart_send_string("In FDT_PROP\n"); + uint32_t len = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + uint32_t nameoff = get_le2be_uint((char *)cur_ptr); + cur_ptr += 4; + cb(token, (char *)(strings_ptr + nameoff), (void *)cur_ptr, len); + cur_ptr += align_up(len, 4); + ; + break; + } + case FDT_NOP: + // uart_send_string("In FDT_NOP\n"); + cb(token, NULL, NULL, 0); + break; + case FDT_END: + // uart_send_string("In FDT_END\n"); + cb(token, NULL, NULL, 0); + return 0; + default:; + return -1; + } + } + return 0; +} + +void print_dtb(int type, const char *name, const void *data, uint32_t size) +{ + switch (type) + { + case FDT_BEGIN_NODE: + uart_send_string("\n"); + send_sapce(space); + uart_send_string(name); + uart_send_string("{\n "); + space++; + break; + + case FDT_END_NODE: + uart_send_string("\n"); + space--; + if (space > 0) + send_sapce(space); + + uart_send_string("}\n"); + break; + + case FDT_NOP: + break; + + case FDT_PROP: + send_sapce(space); + uart_send_string(name); + break; + + case FDT_END: + break; + } +} + +void get_initramfs_addr(int type, const char *name, const void *data, uint32_t size) +{ + if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-start")) + { + initramfs_start = (char *)pa2va((uintptr_t)get_le2be_uint(data)); + } + else if (type == FDT_PROP && !utils_str_compare(name, "linux,initrd-end")) + { + initramfs_end = (char *)pa2va((uintptr_t)get_le2be_uint(data)); + } +} + +uintptr_t dtb_end,dtb_start; + +int fdt_traverse(fdt_callback cb) +{ + // uart_printf("\ndtb loading at:%x\n",dtb_start); + fdt_header *header = (fdt_header *)dtb_start; + + if (get_le2be_uint(&(header->magic)) != 0xd00dfeed) + { + uart_printf("header magic ==%x != 0xd00dfeed\n",get_le2be_uint(&(header->magic))); + return -1; + } + uint32_t totalsize = get_le2be_uint(&(header->totalsize)); + uintptr_t struct_ptr = dtb_start + get_le2be_uint(&(header->off_dt_struct)); + uintptr_t strings_ptr = dtb_start + get_le2be_uint(&(header->off_dt_strings)); + parse_struct(cb, struct_ptr, strings_ptr, totalsize); + + dtb_end = dtb_start + get_le2be_uint(&(header->totalsize)); + return 0; +} diff --git a/lab7/src/exec.c b/lab7/src/exec.c new file mode 100644 index 000000000..6f91c6548 --- /dev/null +++ b/lab7/src/exec.c @@ -0,0 +1,109 @@ +#include "exec.h" +#include "_cpio.h" +#include "sche.h" +#include "mm.h" +#include "trap_frame.h" +#include "utils_c.h" +#include "current.h" +#include "thread.h" +#include "mini_uart.h" +#include "vfs.h" +#include "mmu.h" + +static void replace_user_context(void *prog, size_t data_size, pd_t *ttbr0) +{ + struct task *_task = current; + + kfree(_task->user_stack); + free_page_table(_task->ttbr0); + kfree(_task->user_prog); + + _task->user_stack = alloc_stack(ttbr0, STACK_SIZE); + + _task->user_prog = prog; + _task->user_prog_size = data_size; + + _task->ttbr0 = ttbr0; + replace_page_table(); + + TrapFrame *trapframe = (TrapFrame *)((char *)_task->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memset(trapframe, 0, sizeof(TrapFrame)); +} + +void jump_user_prog(void *target_addr, char *kernel_sp, char *user_sp) +{ + asm volatile("mov x0, 0 \n"); + asm volatile("msr spsr_el1, x0 \n"); // daif=0 + asm volatile("msr elr_el1, %0 \n" ::"r"(target_addr)); + asm volatile("msr sp_el0, %0 \n" ::"r"(user_sp)); + if (kernel_sp) + { + asm volatile("mov sp, %0 \n" ::"r"(kernel_sp)); + } + asm volatile("eret \n"); +} + +static void init_user_prog() +{ + jump_user_prog((char *)UPROG_VA, 0, (char *)USTACK_VA + (STACK_SIZE - 0x10)); +} + +int do_exec(const char *path, const char *argv[]) +{ + pd_t *ttbr0 = kcalloc(PAGE_SIZE); + struct file *file; + if (vfs_open(path, 0, &file)) + { + uart_send_string("[do_exec] fail to lookup\n"); + } + size_t data_size = file->vnode->content_size; + if (data_size == -1) + { + uart_send_string("!! do_exec fail !!\n"); + return -1; + } + void *target_addr = alloc_prog(ttbr0, data_size, file->vnode->content); + + setup_peripheral_identity(ttbr0); + replace_user_context(target_addr, data_size, ttbr0); + jump_user_prog((char *)UPROG_VA, current->kernel_stack + STACK_SIZE - sizeof(TrapFrame), (char *)USTACK_VA + (STACK_SIZE - 0x10)); + return 0; +} + +void exe_new_prog(char *path) +{ + pd_t *ttbr0 = kcalloc(PAGE_SIZE); + setup_peripheral_identity(ttbr0); + + struct file *file; + if (vfs_open(path, 0, &file)) + { + uart_send_string("[exe_new_prog] fail to lookup\n"); + } + size_t data_size = file->vnode->content_size; + if (data_size == -1) + { + uart_send_string("[exe_new_prog] data_size==-1\n"); + return ; + } + void *target_addr = alloc_prog(ttbr0, data_size, file->vnode->content); + + struct task *prog = thread_create(init_user_prog); + + prog->user_stack = alloc_stack(ttbr0, STACK_SIZE); + + prog->user_prog = target_addr; + prog->user_prog_size = data_size; + + prog->ttbr0 = ttbr0; + + asm( + "dsb ish\n" // ensure write has completed + "msr ttbr0_el1, %0\n" // switch translation based address. + "tlbi vmalle1is\n" // invalidate all TLB entries + "dsb ish\n" // ensure completion of TLB invalidatation + "isb\n" // clear pipeline + ::"r"(ttbr0)); + + return; +} diff --git a/lab7/src/fork.c b/lab7/src/fork.c new file mode 100644 index 000000000..19751756e --- /dev/null +++ b/lab7/src/fork.c @@ -0,0 +1,47 @@ +#include "fork.h" +#include "stddef.h" +#include "sche.h" +#include "thread.h" +#include "exception_c.h" +#include "exception_s.h" +#include "utils_c.h" +#include "current.h" +#include "mm.h" + +static struct task *fork_context(TrapFrame *_regs) +{ + struct task *child = kmalloc(sizeof(struct task)); + + unsigned long flags = disable_irq(); + *child = *current; // copy the current to child entirely + child->pid = task_count++; + irq_restore(flags); + + child->need_resched = 0; + + child->ttbr0 = kcalloc(PAGE_SIZE); + child->user_stack = alloc_stack(child->ttbr0, STACK_SIZE); + memcpy(child->user_stack, current->user_stack, STACK_SIZE); + + child->kernel_stack = kcalloc(STACK_SIZE); + TrapFrame *child_trapframe = (TrapFrame *)((unsigned long)child->kernel_stack + STACK_SIZE - sizeof(TrapFrame)); + memcpy(child_trapframe, _regs, sizeof(TrapFrame)); + + child->user_prog = alloc_prog(child->ttbr0, current->user_prog_size, current->user_prog); + + setup_peripheral_identity(child->ttbr0); + + child_trapframe->regs[0] = 0; // child process : return 0 + + child->cpu_context.sp = (unsigned long)child_trapframe; + child->cpu_context.lr = (unsigned long)restore_regs_eret; + + return child; +} + +size_t do_fork(TrapFrame *_regs) +{ + struct task *child = fork_context(_regs); + add_task(child); + return child->pid; +} diff --git a/lab7/src/initramfs.c b/lab7/src/initramfs.c new file mode 100644 index 000000000..6037bfde9 --- /dev/null +++ b/lab7/src/initramfs.c @@ -0,0 +1,185 @@ +#include "initramfs.h" +#include "vfs.h" +#include "utils_c.h" +#include "mm.h" +#include "stat.h" +#include "mini_uart.h" +#include "_cpio.h" +#include "dtb.h" + +static int lookup(struct vnode *dir_node, struct vnode **target, const char *component_name); +static int create(struct vnode *dir_node, struct vnode **target, const char *component_name); +static int mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name); +struct vnode_operations initramfs_v_ops = { + lookup, + create, + mkdir, +}; + +static int write(struct file *file, const void *buf, size_t len); +static int read(struct file *file, void *buf, size_t len); +static int open(struct vnode *file_node, struct file **target); +static int close(struct file *file); +static long lseek64(struct file *file, long offset, int whence); +struct file_operations initramfs_f_ops = { + write, + read, + open, + close, + lseek64, +}; + +static unsigned int hex2dec(char *s) +{ + unsigned int r = 0; + for (int i = 0; i < 8; ++i) + { + if (s[i] >= '0' && s[i] <= '9') + { + r = r * 16 + s[i] - '0'; + } + else + { + r = r * 16 + s[i] - 'A' + 10; + } + } + return r; +} + +static int create_init(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (!lookup(dir_node, target, component_name)) + { + uart_printf("[create] the %s file is already exist\n", component_name); + return -1; + } + +#ifdef FS_DEBUG + uart_printf("[fs] create file:%s, parent:%s\n", component_name, dir_node->name); +#endif + + struct vnode *new_vnode = vnode_create(component_name, S_IFREG); + new_vnode->mount = dir_node->mount; + new_vnode->v_ops = dir_node->v_ops; + new_vnode->f_ops = dir_node->f_ops; + new_vnode->parent = dir_node; + + insert_tail(&dir_node->childs, &new_vnode->self); + dir_node->child_num += 1; + + *target = new_vnode; + return 0; +} + +static void init_cpio_files() +{ + struct vnode *dir = NULL; + struct vnode *target = NULL; + if (vfs_lookup("/initramfs", &dir)) + { + uart_printf("[init_cpio_files] fail to lookup dir\n"); + } + + char *addr = initramfs_start; + while (utils_str_compare((char *)(addr + sizeof(cpio_header)), "TRAILER!!!") != 0) + { + cpio_header *header = (cpio_header *)addr; + unsigned int pathname_size = hex2dec(header->c_namesize); + unsigned int file_size = hex2dec(header->c_filesize); + unsigned int headerPathname_size = sizeof(cpio_header) + pathname_size; + + align(&headerPathname_size, 4); + align(&file_size, 4); + + create_init(dir, &target, (char *)(addr + sizeof(cpio_header))); + target->content = addr + headerPathname_size; + target->content_size = file_size; + + addr += (headerPathname_size + file_size); + } +} + +static int setup_mount(struct filesystem *fs, struct mount *mount) +{ + // should set mount->root as a obj before call setup_mount + mount->root->mount = mount; + mount->root->f_ops = &initramfs_f_ops; + mount->root->v_ops = &initramfs_v_ops; + mount->fs = fs; + + // clear the internal content + list_init(&mount->root->childs); + mount->root->child_num = 0; + mount->root->content = NULL; + mount->root->content_size = 0; + init_cpio_files(); + return 0; +} + +static int lookup(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct vnode *vnode = NULL; + list_for_each_entry(vnode, &dir_node->childs, self) + { + if (!(utils_str_compare(vnode->name, component_name))) + { + *target = vnode; + return 0; + } + } + return -1; +} +static int create(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + return -1; +} +static int mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + return -1; +} + +static int write(struct file *file, const void *buf, size_t len) +{ + return -1; +} +static int read(struct file *file, void *buf, size_t len) +{ + struct vnode *vnode = file->vnode; + if (!S_ISREG(vnode->f_mode)) + { + uart_send_string("[write] not a regular file\n"); + return -1; + } + int min = (len > vnode->content_size - file->f_pos - 1) ? vnode->content_size - file->f_pos - 1 : len; // -1 for EOF; + if (min == 0) + { + return -1; // f_pos at EOF or len==0; + } + memcpy(buf, vnode->content + file->f_pos, min); + file->f_pos += min; + return min; +} +static int open(struct vnode *file_node, struct file **target) +{ + // TODO + return 0; +} +static int close(struct file *file) +{ + kfree(file); + return 0; +} +static long lseek64(struct file *file, long offset, int whence) +{ + // TODO + return 0; +} + +struct filesystem *initramfs_create() +{ + struct filesystem *fs = kmalloc(sizeof(struct filesystem)); + fs->name = "initramfs"; + fs->setup_mount = &setup_mount; + list_init(&fs->list); + return fs; +} diff --git a/lab7/src/list.c b/lab7/src/list.c new file mode 100644 index 000000000..fd4033e51 --- /dev/null +++ b/lab7/src/list.c @@ -0,0 +1,53 @@ +#include "list.h" + +void list_init(list *node) +{ + node->next = node; + node->prev = node; +} + +void insert_head(list *head, list *v) +{ + v->next = head->next; + v->prev = head; + head->next->prev = v; + head->next = v; +} + +void insert_tail(list *head, list *v) +{ + v->next = head; + v->prev = head->prev; + head->prev->next = v; + head->prev = v; +} + +list *remove_head(list *head) +{ + list *ptr; + ptr = head->next; + head->next = head->next->next; + head->next->prev = head; + + return ptr; +} + +list *remove_tail(list *head) +{ + list *ptr; + ptr = head->prev; + head->prev = head->prev->prev; + head->prev->next = head; + + return ptr; +} + +void unlink(list *node) +{ + list *next, *prev; + next = node->next; + prev = node->prev; + + next->prev = prev; + prev->next = next; +} \ No newline at end of file diff --git a/lab7/src/mailbox.c b/lab7/src/mailbox.c new file mode 100644 index 000000000..501f42f3f --- /dev/null +++ b/lab7/src/mailbox.c @@ -0,0 +1,64 @@ +#include "peripheral/mailbox.h" +#include "utils_c.h" +#include "mini_uart.h" + +unsigned int __attribute__((aligned(16))) mailbox[8]; + +unsigned int mailbox_call(unsigned char channel, unsigned int *_mailbox) +{ + unsigned int readChannel = (((unsigned int)((unsigned long)_mailbox) & ~0xF) | (channel & 0xF)); + while (*MAILBOX_STATUS & MAILBOX_FULL) + { + } + *MAILBOX_WRITE = readChannel; + while (1) + { + while (*MAILBOX_STATUS & MAILBOX_EMPTY) + { + } + if (readChannel == *MAILBOX_READ) + { + return _mailbox[1] == MAILBOX_RESPONSE; + } + } + return 0; +} + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + // printf("0x%x\n", mailbox[5]); // it should be 0xa020d3 for rpi3 b+ + uart_hex(mailbox[5]); + uart_send_string("\n"); + return mailbox[5]; +} + +void get_arm_memory() +{ + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + uart_send_string("Arm base address: "); + uart_hex(mailbox[5]); + uart_send_string("\n"); + uart_send_string("Arm memory size: "); + uart_hex(mailbox[6]); + uart_send_string("\n"); +} diff --git a/lab7/src/memzero.S b/lab7/src/memzero.S new file mode 100644 index 000000000..91c1c4f0f --- /dev/null +++ b/lab7/src/memzero.S @@ -0,0 +1,7 @@ +.global memzero +memzero: + str xzr, [x20], #8 + subs x21, x21, #8 + b.gt memzero + ret + \ No newline at end of file diff --git a/lab7/src/mini_uart.c b/lab7/src/mini_uart.c new file mode 100644 index 000000000..0d0d73605 --- /dev/null +++ b/lab7/src/mini_uart.c @@ -0,0 +1,258 @@ +#include "peripheral/mini_uart.h" +#include "peripheral/gpio.h" +#include "sprintf.h" +#include "utils_c.h" +#include +#include +#include "mini_uart.h" + +#define ENABLE_RECEIVE_INTERRUPTS_BIT (1 << 0) +#define ENABLE_TRANSMIT_INTERRUPTS_BIT (1 << 1) +#define AUX_INT_BIT (1 << 29) + +#define BUFFER_MAX_SIZE 256u + +char read_buf[BUFFER_MAX_SIZE]; +char write_buf[BUFFER_MAX_SIZE]; +int read_buf_start, read_buf_end; +int write_buf_start, write_buf_end; + + +void enable_uart_interrupt() { *ENB_IRQS1 = AUX_IRQ; } + +void disable_uart_interrupt() { *DISABLE_IRQS1 = AUX_IRQ; } + +void set_transmit_interrupt() { *AUX_MU_IER_REG |= 0x2; } + +void clear_transmit_interrupt() { *AUX_MU_IER_REG &= ~(0x2); } + +void uart_init() +{ + unsigned int selector; + + selector = *GPFSEL1; + selector &= ~(7u << 12); // clean gpio14 + selector |= 2u << 12; // set alt5 for gpio14 + selector &= ~(7u << 15); // clean gpio15 + selector |= 2u << 15; // set alt5 for gpio 15 + *GPFSEL1 = selector; + + *GPPUD = 0; // set the required control signal (i.e. Pull-up or Pull-Down ) + delay(150u); // provides the required set-up time for the control signal + *GPPUDCLK0 = (1u << 14) | (1u << 15); + delay(150u); + *GPPUDCLK0 = 0u; + *AUX_ENABLE = 1u; // Enable mini uart (this also enables access to its registers) + *AUX_MU_CNTL_REG = 0u; // Disable auto flow control and disable receiver and transmitter (for now) + *AUX_MU_IER_REG = 1u; // Enable receive + *AUX_MU_LCR_REG = 3u; // Enable 8 bit mode + *AUX_MU_MCR_REG = 0u; // Set RTS line to be always high + *AUX_MU_BAUD_REG = 270u; // Set baud rate to 115200 + *AUX_MU_IIR_REG = 6; + + *AUX_MU_CNTL_REG = 3; // Finally, enable transmitter and receiver + + read_buf_start = read_buf_end = 0; + write_buf_start = write_buf_end = 0; + // enable_uart_interrupt(); +} + +void uart_send(const char c) +{ + /* + bit_5 == 1 -> writable + 0x20 = 0000 0000 0010 0000 + ref BCM2837-ARM-Peripherals p5 + */ + if (c == '\n') + { + uart_send('\r'); + } + while (!(*(AUX_MU_LSR_REG)&0x20)) + { + } + *AUX_MU_IO_REG = c; +} +char uart_recv() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp == '\r' ? '\n' : temp; +} + +char uart_recv_raw() +{ + /* + bit_0 == 1 -> readable + 0x01 = 0000 0000 0000 0001 + ref BCM2837-ARM-Peripherals p5 + */ + while (!(*(AUX_MU_LSR_REG)&0x01)) + { + } + char temp = *(AUX_MU_IO_REG)&0xFF; + return temp; +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +void uart_send_uint(unsigned int num, int newline) +{ + char str[256]; + utils_uint2str_dec(num, str); + uart_send_string(str); + if (newline) + { + uart_send_string("\n"); + } +} + +void uart_hex(unsigned int d) +{ + unsigned int n; + int c; + uart_send_string("0x"); + for (c = 28; c >= 0; c -= 4) + { + n = (d >> c) & 0xF; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + n += n > 9 ? 0x57 : 0x30; + uart_send(n); + } +} +void uart_dec(unsigned int num) +{ + if (num == 0) + uart_send('0'); + else + { + if (num >= 10) + uart_dec(num / 10); + uart_send(num % 10 + '0'); + } +} + +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +/* + async part +*/ + +void uart_handler() +{ + disable_uart_interrupt(); + int RX = (*AUX_MU_IIR_REG & 0x4); + int TX = (*AUX_MU_IIR_REG & 0x2); + if (RX) + { + char c = (char)(*AUX_MU_IO_REG); + read_buf[read_buf_end++] = c; + if (read_buf_end == BUFFER_MAX_SIZE) + read_buf_end = 0; + } + else if (TX) + { + while (*AUX_MU_LSR_REG & 0x20) + { + if (write_buf_start == write_buf_end) + { + clear_transmit_interrupt(); + break; + } + char c = write_buf[write_buf_start++]; + *AUX_MU_IO_REG = c; + if (write_buf_start == BUFFER_MAX_SIZE) + write_buf_start = 0; + } + } + enable_uart_interrupt(); +} + +char uart_async_recv() +{ + // wait until there are new data + while (read_buf_start == read_buf_end) + { + asm volatile("nop"); + } + char c = read_buf[read_buf_start++]; + if (read_buf_start == BUFFER_MAX_SIZE) + read_buf_start = 0; + return c == '\r' ? '\n' : c; +} + +void uart_async_send_string(char *str) +{ + + for (int i = 0; str[i]; i++) + { + if (str[i] == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + continue; + } + write_buf[write_buf_end++] = str[i]; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + } + set_transmit_interrupt(); +} + +void uart_async_send(char c) +{ + if (c == '\n') + { + write_buf[write_buf_end++] = '\r'; + write_buf[write_buf_end++] = '\n'; + set_transmit_interrupt(); + return; + } + write_buf[write_buf_end++] = c; + if (write_buf_end == BUFFER_MAX_SIZE) + write_buf_end = 0; + set_transmit_interrupt(); +} + +void test_uart_async() +{ + enable_uart_interrupt(); + delay(15000); + char buffer[BUFFER_MAX_SIZE]; + size_t index = 0; + while (1) + { + buffer[index] = uart_async_recv(); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + uart_async_send_string(buffer); + disable_uart_interrupt(); +} diff --git a/lab7/src/mm.c b/lab7/src/mm.c new file mode 100644 index 000000000..af17b086f --- /dev/null +++ b/lab7/src/mm.c @@ -0,0 +1,460 @@ +#include "mm.h" +#include "mini_uart.h" +#include "list.h" +#include "utils_c.h" +#include "_cpio.h" +#include "dtb.h" +#include "exception_c.h" +#include "mmu.h" + +// #define DEBUG + +#define FRAME_BASE ((uintptr_t)PHYS_OFFSET + 0x0) +// get from mailbox's arm memory +#define FRAME_END ((uintptr_t)PHYS_OFFSET + 0x3b400000) + +#define PAGE_SIZE 0x1000 // 4KB +#define FRAME_BINS_SIZE 12 +#define MAX_ORDER (FRAME_BINS_SIZE - 1) +#define FRAME_MAX_SIZE ORDER2SIZE(MAX_ORDER) +#define ORDER2SIZE(order) (PAGE_SIZE * (1 << (order))) + +#define FRAME_ARRAY_SIZE ((FRAME_END - FRAME_BASE) / PAGE_SIZE) + +#define CHUNK_MIN_SIZE 32 +#define CHUNK_BINS 7 +#define CHUNK_MAX_ORDER (CHUNK_BINS - 1) + +#define FRAME_FREE 0x8 +#define FRAME_INUSE 0x4 +#define FRAME_MEM_CHUNK 0x2 +#define IS_INUSE(frames) (frames.flag & FRAME_INUSE) +#define IS_MEM_CHUNK(frames) (frames.flag & FRAME_MEM_CHUNK) + +// for mm_int +extern char _skernel, _ekernel; +extern void *_dtb_ptr; + +FrameFlag *frames; +list frame_bins[FRAME_BINS_SIZE]; +Chunk *chunk_bins[CHUNK_BINS]; + +unsigned long *smalloc_cur = (unsigned long *)STARTUP_MEM_START; + +//////////////////////////////////////////////////////////////////////////////////////////////// +// utils // +//////////////////////////////////////////////////////////////////////////////////////////////// +static unsigned align_up_exp(unsigned n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n; +} +static int addr2idx(void *addr) +{ + return (((uintptr_t)addr & -PAGE_SIZE) - FRAME_BASE) / PAGE_SIZE; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// startUp // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *smalloc(size_t size) +{ + align(&size, 4); // allocated the memory size is mutiple of 4 byte; + unsigned long *smalloc_ret = smalloc_cur; + if ((uint64_t)smalloc_cur + size > (uint64_t)STARTUP_MEM_END) + { + uart_printf("[!] No enough space!\r\n"); + return NULL; + } + smalloc_cur += (unsigned int)size; + return smalloc_ret; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// others // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void mm_init() +{ + init_buddy(); + memory_reserve((uintptr_t)pa2va(0), (uintptr_t)pa2va(0x1000)); // Spin tables for multicore boot + + memory_reserve((uintptr_t)IDENTITY_TT_L0_VA, (uintptr_t)IDENTITY_TT_L0_VA + PAGE_SIZE); // PGD's page frame + memory_reserve((uintptr_t)IDENTITY_TT_L1_VA, (uintptr_t)IDENTITY_TT_L1_VA + PAGE_SIZE); // PUD's page frame + + memory_reserve((uintptr_t)&_skernel, (uintptr_t)&_ekernel); // Kernel image + + fdt_traverse(get_initramfs_addr); + memory_reserve((uintptr_t)initramfs_start, (uintptr_t)initramfs_end); // Initramfs + + memory_reserve((uintptr_t)STARTUP_MEM_START, (uintptr_t)STARTUP_MEM_END); // Simple allocator + + memory_reserve((uintptr_t)dtb_start, (uintptr_t)dtb_end); // Devicetree + + merge_useful_pages(); +} + +void memory_reserve(uintptr_t start, uintptr_t end) +{ + + start = start & ~(PAGE_SIZE - 1); + end = align_up(end - PHYS_OFFSET, PAGE_SIZE) + PHYS_OFFSET; + for (uintptr_t i = start; i < end; i += PAGE_SIZE) + { + int idx = addr2idx((void *)i); + frames[idx].flag |= FRAME_INUSE; + frames[idx].order = 0; + } +#ifdef DEBUG + uart_printf("reserve addr from %x ~ %x\n", (unsigned long)start, (unsigned long)end); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// buddy system // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int pages_to_frame_order(unsigned pages) +{ + pages = align_up_exp(pages); + return __builtin_ctz(pages); +} + +void init_buddy() +{ + frames = (FrameFlag *)smalloc(sizeof(FrameFlag) * FRAME_ARRAY_SIZE); + for (int i = 0; i < FRAME_BINS_SIZE; i++) + { + list_init(&frame_bins[i]); + } + for (int i = 0; i < FRAME_ARRAY_SIZE; i++) + { + frames[i].flag = 0; + frames[i].order = 0; + } +} + +void merge_useful_pages() +{ + int page_idx = 0; + list *page_addr = (list *)(FRAME_BASE); + { // only insert the 4KB page to frame_bins + while (1) + { + if (!IS_INUSE(frames[page_idx])) + { + insert_tail(&frame_bins[0], page_addr); + } + page_idx++; + if (page_idx >= FRAME_ARRAY_SIZE) + { + break; + } + page_addr = (void *)(FRAME_BASE + page_idx * PAGE_SIZE); + } + } + + for (int order = 0; order < MAX_ORDER; order++) + { // merging the pages by left page + page_idx = 0; + page_addr = (list *)(FRAME_BASE); + int buddy_page_idx = 0; + list *buddy_addr = (list *)(FRAME_BASE); + while (1) + { + buddy_page_idx = page_idx ^ (1 << order); + buddy_addr = (void *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE); + + if (!IS_INUSE(frames[page_idx]) && + frames[page_idx].order == order && + buddy_page_idx < FRAME_ARRAY_SIZE && + !IS_INUSE(frames[buddy_page_idx]) && + frames[buddy_page_idx].order == order) + { + unlink((list *)page_addr); + unlink((list *)buddy_addr); + insert_tail(&frame_bins[order + 1], page_addr); + frames[page_idx].order = order + 1; + } + page_idx += (1 << (order + 1)); + if (page_idx >= FRAME_ARRAY_SIZE) + { + break; + } + page_addr = (void *)(FRAME_BASE + page_idx * PAGE_SIZE); + } + } +} + +static void *split_frames(int order, int target_order) +{ + list *ptr = remove_head(&frame_bins[order]); + +#ifdef DEBUG + uart_printf("split frame: %x\n", (unsigned long)ptr); +#endif + + for (int i = order; i > target_order; i--) + { /* insert splitted frame to bin list */ + list *half_right = (list *)((char *)ptr + ORDER2SIZE(i - 1)); + + insert_head(&frame_bins[i - 1], half_right); + frames[((uintptr_t)half_right - FRAME_BASE) / PAGE_SIZE].order = i - 1; + +#ifdef DEBUG + uart_printf("insert frame at %x\n", (unsigned long)half_right); +#endif + } + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; +} + +void *alloc_pages(unsigned int pages) +{ + int target_order = pages_to_frame_order(pages); + if (frame_bins[target_order].next != &frame_bins[target_order]) + { + list *ptr = remove_head(&frame_bins[target_order]); +#ifdef DEBUG + uart_printf("return page at: %x\n", (unsigned long)ptr); +#endif + int idx = addr2idx(ptr); + frames[idx].order = target_order; + frames[idx].flag |= FRAME_INUSE; + return ptr; + } + else + { + for (int i = target_order; i < FRAME_BINS_SIZE; i++) + { + if (frame_bins[i].next != &frame_bins[i]) + { + return split_frames(i, target_order); + } + } + } + + uart_send_string("alloc page return NULL"); + return NULL; +} + +void free_pages(void *victim) +{ + int page_idx = ((uintptr_t)victim - FRAME_BASE) / PAGE_SIZE; + if (!IS_INUSE(frames[page_idx])) + { + uart_printf("Error! double free the memory at %x\n", (uintptr_t)victim); + return; + } + unsigned int order = frames[page_idx].order; + int buddy_page_idx = page_idx ^ (1 << order); + frames[page_idx].flag &= ~FRAME_INUSE; + + while (order <= MAX_ORDER && + !IS_INUSE(frames[buddy_page_idx]) && + order == frames[buddy_page_idx].order) + { + void *buddy_victim = (void *)(FRAME_BASE + buddy_page_idx * PAGE_SIZE); + unlink((list *)buddy_victim); + +#ifdef DEBUG + uart_printf("merge buddy frame: %x \n", (unsigned long)buddy_victim); +#endif + order += 1; + victim = page_idx < buddy_page_idx ? victim : buddy_victim; + page_idx = page_idx < buddy_page_idx ? page_idx : buddy_page_idx; + buddy_page_idx = page_idx ^ (1 << order); + } + + insert_head(&frame_bins[order], victim); + frames[page_idx].order = order; + +#ifdef DEBUG + uart_printf("attach frame: %x \n\n", (unsigned long)victim); +#endif +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// chunks // +//////////////////////////////////////////////////////////////////////////////////////////////// + +static int size_to_chunk_order(unsigned int size) +{ + size = align_up_exp(size); + size /= CHUNK_MIN_SIZE; + return __builtin_ctz(size); +} + +static void *get_chunk(uint32_t size) +{ + int order = size_to_chunk_order(size); + + void *ptr = chunk_bins[order]; + if (ptr) + { + chunk_bins[order] = chunk_bins[order]->next; + int idx = addr2idx(ptr); + frames[idx].ref_count += 1; + +#ifdef DEBUG + uart_printf("detach chunk at %x\n", (unsigned long)ptr); +#endif + } + + return ptr; +} + +static void alloc_chunk(void *mem, int size) +{ + int count = PAGE_SIZE / size; + int idx = addr2idx(mem); + int order = size_to_chunk_order(size); + frames[idx].flag |= FRAME_MEM_CHUNK; + frames[idx].ref_count = 0; + frames[idx].chunk_order = order; + for (int i = 0; i < count; i++) + { + Chunk *ptr = (Chunk *)((uintptr_t)mem + i * size); + ptr->next = chunk_bins[order]; + chunk_bins[order] = ptr; + +#ifdef DEBUG + uart_printf("insert chunk at %x\n", (unsigned long)ptr); +#endif + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// dynamic memory simple_allocator // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void *kmalloc(unsigned int size) +{ + unsigned int aligned_page_size = align_up(size, PAGE_SIZE); + if (aligned_page_size > FRAME_MAX_SIZE) + { + return NULL; + } + + size = size < CHUNK_MIN_SIZE ? CHUNK_MIN_SIZE : size; + + size_t flag = disable_irq(); + + void *ptr; + if (align_up_exp(size) < PAGE_SIZE) // just allocate a small chunk + { + size = align_up_exp(size); + ptr = get_chunk(size); + + if (!ptr) + { + void *mem = alloc_pages(1); + alloc_chunk(mem, size); + ptr = get_chunk(size); + } + } + else + { + unsigned int pages = aligned_page_size / PAGE_SIZE; + ptr = alloc_pages(pages); + } + irq_restore(flag); + return ptr; +} +void *kcalloc(unsigned int size) +{ + void *p = kmalloc(size); + if (!p) + { + return NULL; + } + if (size < PAGE_SIZE) + { + size = align_up_exp(size); + } + else + { + size = align_up(size, PAGE_SIZE); + } + memset(p, 0, size); + + return p; +} + +void kfree(void *ptr) +{ + int idx = addr2idx(ptr); + if (idx >= FRAME_ARRAY_SIZE) + { + uart_send_string("Error! kfree wrong address\n"); + return; + } + size_t flag = disable_irq(); + if (IS_MEM_CHUNK(frames[idx])) + { + int order = frames[idx].chunk_order; + ((Chunk *)ptr)->next = chunk_bins[order]; + chunk_bins[order] = ptr; + frames[idx].ref_count -= 1; + +#ifdef DEBUG + uart_printf("free chunk at %x\n", (unsigned long)ptr); +#endif + } + else + { + free_pages(ptr); + } + irq_restore(flag); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// test // +//////////////////////////////////////////////////////////////////////////////////////////////// + +void test_buddy() +{ + int test_size = 5; + void *a[test_size]; + uart_send_string("\n\n----- Malloc -----\n"); + for (int i = 0; i < test_size; i++) + { + a[i] = alloc_pages(test_size); + } + uart_send_string("\n\n----- Free -----\n"); + for (int i = 0; i < test_size; i++) + { + free_pages(a[i]); + } +} + +struct test_b +{ + double b1, b2, b3, b4, b5, b6; +}; + +void test_dynamic_alloc() +{ + uart_send_string("allocate a1\n"); + int *a1 = kmalloc(sizeof(int)); + uart_send_string("allocate a2\n"); + int *a2 = kmalloc(sizeof(int)); + uart_send_string("allocate b\n"); + struct test_b *b = kmalloc(sizeof(struct test_b)); + + uart_send_string("free a1\n"); + kfree(a1); + uart_send_string("free b\n"); + kfree(b); + uart_send_string("free a2\n"); + kfree(a2); +} diff --git a/lab7/src/mmu.c b/lab7/src/mmu.c new file mode 100644 index 000000000..9f4dbcd93 --- /dev/null +++ b/lab7/src/mmu.c @@ -0,0 +1,172 @@ +#include "mmu.h" +#include "utils_s.h" +#include "utils_c.h" +#include "mini_uart.h" +#include "mm.h" +#include "current.h" + +#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16)) +#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30)) +#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB) + +#define MAIR_DEVICE_nGnRnE 0b00000000 +#define MAIR_NORMAL_NOCACHE 0b01000100 +#define MAIR_IDX_DEVICE_nGnRnE 0 +#define MAIR_IDX_NORMAL_NOCACHE 1 + +#define BOOT_PGD_ATTR PD_TABLE +#define BOOT_PUD_ATTR (PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK) +#define MMU_ENABLE 1 +#define PAGE_SIZE 0x1000 + +#define PERIPHERAL_START 0x3c000000 +#define PERIPHERAL_END 0x3f000000 + +void setup_identity_mapping() +{ + write_sysreg(tcr_el1, TCR_CONFIG_DEFAULT); + size_t mair_attr_01 = + (MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | + (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8)); + write_sysreg(mair_el1, mair_attr_01); + + memset(IDENTITY_TT_L0, 0, 0x1000); + memset(IDENTITY_TT_L1, 0, 0x1000); + + IDENTITY_TT_L0[0] = (pd_t)IDENTITY_TT_L1 | BOOT_PGD_ATTR; + IDENTITY_TT_L1[0] = 0x00000000 | BOOT_PUD_ATTR; + IDENTITY_TT_L1[1] = 0x40000000 | BOOT_PUD_ATTR; + + write_sysreg(ttbr0_el1, IDENTITY_TT_L0); + write_sysreg(ttbr1_el1, IDENTITY_TT_L0); // also load PGD to the upper translation based register. + unsigned long sctlr = read_sysreg(sctlr_el1); + write_sysreg(sctlr_el1, sctlr | MMU_ENABLE); +} + +void setup_kernel_space_mapping() +{ + /* three-level 2MB block mapping */ + + /* 0x00000000 ~ 0x3F000000 for normal mem */ + pd_t *p0 = kcalloc(PAGE_SIZE); + for (int i = 0; i < 504; i++) + { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_BLOCK; + } + /* 0x3F000000 ~ 0x40000000 for device mem */ + for (int i = 504; i < 512; i++) + { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK; + } + + /* 0x40000000 ~ 0x80000000 for device mem */ + pd_t *p1 = kcalloc(PAGE_SIZE); + for (int i = 0; i < 512; i++) + { + p1[i] = 0x40000000 | (i << 21) | PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK; + } + + asm volatile("dsb ish\n\t"); + + IDENTITY_TT_L1_VA[0] = (pd_t)va2pa(p0) | PD_TABLE; + IDENTITY_TT_L1_VA[1] = (pd_t)va2pa(p1) | PD_TABLE; +} + +void map_page(pd_t *table, unsigned long va, unsigned long pa, unsigned long flags) +{ + for (int level = 0; level < 4; level++) + { + unsigned idx = (va >> (39 - 9 * level)) & 0b111111111; + if (!table[idx]) + { + if (level == 3) + { + table[idx] = pa; + table[idx] |= PD_PXN | PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_PAGE | flags; + return; + } + else + { + table[idx] = (pd_t)va2pa(kcalloc(PAGE_SIZE)); + table[idx] |= PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_TABLE; + } + } + + if ((table[idx] & 0b11) == PD_TABLE) + { + table = (pd_t *)pa2va(table[idx] & 0xfffffffff000L); + } + } +} + +void *alloc_stack(pd_t *table, unsigned long size) +{ + void *stack = kcalloc(size); + unsigned long pages = align_up(size, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, USTACK_VA + i * PAGE_SIZE, va2pa(stack + i * PAGE_SIZE), PD_USER_RW | PD_UXN); + } + + return stack; +} + +void *alloc_prog(pd_t *table, unsigned long size, const char *file_content) +{ + void *prog = kcalloc(size); + unsigned long pages = align_up(size, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, UPROG_VA + i * PAGE_SIZE, va2pa(prog + i * PAGE_SIZE), PD_USER_RW); + } + memcpy(prog, file_content, size); + + return prog; +} + +void setup_peripheral_identity(pd_t *table) +{ + unsigned long pages = align_up(PERIPHERAL_END - PERIPHERAL_START, PAGE_SIZE) / PAGE_SIZE; + for (int i = 0; i < pages; i++) + { + map_page(table, PERIPHERAL_START + i * PAGE_SIZE, PERIPHERAL_START + i * PAGE_SIZE, PD_USER_RW); + } +} + +unsigned long get_pte(unsigned long va) +{ + unsigned long flags = disable_irq(); + + asm("at s1e0r, %0\n\t" ::"r"(va)); + unsigned long pte = read_sysreg(par_el1); + + irq_restore(flags); + return pte; +} + +unsigned long el0_va2pa(unsigned long va) +{ + unsigned long entry = get_pte(va); + if (entry & 1) + { + uart_printf("Failed map virtual addr at 0x%x\n", va); + } + unsigned long offset = va & 0xfff; + return (unsigned long)(pa2va((entry & 0xfffffffff000L) | offset)); +} +void free_page_table(pd_t *table) +{ + // free the page table created by translating from map_page() + /* TODO */ +} + +void replace_page_table() +{ + asm( + "dsb ish\n" // ensure write has completed + "msr ttbr0_el1, %0\n" // switch translation based address. + "tlbi vmalle1is\n" // invalidate all TLB entries + "dsb ish\n" // ensure completion of TLB invalidatation + "isb\n" // clear pipeline + ::"r"(current->ttbr0)); +} \ No newline at end of file diff --git a/lab7/src/sche.c b/lab7/src/sche.c new file mode 100644 index 000000000..50424ae2c --- /dev/null +++ b/lab7/src/sche.c @@ -0,0 +1,158 @@ +#include "sche.h" +#include "current.h" +#include "timer.h" +#include "exception_c.h" +#include "mini_uart.h" +#include "mm.h" + +pid_t task_count = 0; + +list running_queue = LIST_HEAD_INIT(running_queue); +list waiting_queue = LIST_HEAD_INIT(waiting_queue); +list stopped_queue = LIST_HEAD_INIT(stopped_queue); + +int get_the_cur_count() +{ + int count = 0; + list *head = &running_queue; + while (head->next != &running_queue) + { + count++; + head = head->next; + } + return count; +} + +void add_task(struct task *t) +{ + size_t flags = disable_irq(); + insert_tail(&running_queue, &t->list); + irq_restore(flags); +} + +void kill_task(struct task *_task, int status) +{ + size_t flags = disable_irq(); + + _task->state = TASK_STOPPED; + _task->need_resched = 1; + unlink(&_task->list); + _task->exitcode = status; + insert_head(&stopped_queue, &_task->list); + + irq_restore(flags); + thread_schedule(0); +} + +void restart_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_WAITING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_RUNNING; + unlink(&_task->list); + insert_tail(&running_queue, &_task->list); + + irq_restore(flags); +} + +void pause_task(struct task *_task) +{ + size_t flags = disable_irq(); + + if (_task->state != TASK_RUNNING) + { + uart_send_string("---- task state inconsistent ----\n"); + return; + } + _task->state = TASK_WAITING; + _task->need_resched = 1; + unlink(&_task->list); + insert_head(&waiting_queue, &_task->list); + + irq_restore(flags); +} + +void sleep_task(size_t ms) +{ + size_t flags = disable_irq(); + + add_timer((timer_callback)restart_task, (size_t)current, ms); + pause_task(current); + irq_restore(flags); + + thread_schedule(0); +} + +void free_task(struct task *victim) +{ + if (victim->kernel_stack) + kfree(victim->kernel_stack); + kfree(victim); +} + +struct task *create_task() +{ + struct task *new_task = kmalloc(sizeof(struct task)); + new_task->cpu_context.lr = new_task->cpu_context.sp = new_task->cpu_context.fp = 0; + new_task->kernel_stack = NULL; + new_task->user_stack = NULL; + new_task->user_prog = NULL; + new_task->user_prog_size = 0; + new_task->state = TASK_INIT; + new_task->pid = task_count++; + new_task->need_resched = 0; + new_task->exitcode = 0; + new_task->timeout = get_current_time() + DEFAULT_TIMEOUT; + new_task->signal = NULL; + new_task->sig_context = NULL; + new_task->ttbr0 = NULL; + new_task->pwd = rootfs->root; + for (int i = 0; i < FD_TABLE_SIZE; i++) + { + new_task->fd_table[i] = NULL; // file descriptor table, max 16 + } + return new_task; +} + +struct task *pick_next_task() +{ + if (list_empty(&running_queue)) + { + while (1) + { + }; + } + struct task *next_task = list_first_entry(&running_queue, struct task, list); + unlink(&next_task->list); + insert_tail(&running_queue, &next_task->list); + + return next_task; +} + +void switch_task(struct task *next) +{ + if (current == next) + { + return; + } + switch_to(¤t->cpu_context, &next->cpu_context); + replace_page_table(); +} + +struct task *get_task(pid_t target) +{ + struct task *_task; + list_for_each_entry(_task, &running_queue, list) + { + if (_task->pid == target) + { + return _task; + } + } + return NULL; +} \ No newline at end of file diff --git a/lab7/src/shell.c b/lab7/src/shell.c new file mode 100644 index 000000000..f49661779 --- /dev/null +++ b/lab7/src/shell.c @@ -0,0 +1,230 @@ +#include "shell.h" +#include "mini_uart.h" +#include "utils_c.h" +#include "utils_s.h" +#include "peripheral/mailbox.h" +#include "_cpio.h" +#include "exception_c.h" +#include "timer.h" +#include "dtb.h" +#include "mm.h" +#include "exec.h" +#include "thread.h" +#include +#include "vfs.h" +#define BUFFER_MAX_SIZE 256u +#define COMMNAD_LENGTH_MAX 20u + +extern void *_dtb_ptr; + +int split(const char *buf, char *outbuf[], int n) +{ + const char *ps, *pe; + int idx = 0; + ps = pe = buf; + + while (idx < n) + { + while (*pe && *pe != ' ') + { + pe++; + } + + int size = pe - ps; + if (size) + { + outbuf[idx] = kmalloc(size + 1); + memcpy(outbuf[idx], ps, size); + outbuf[idx][size] = '\0'; + idx++; + } + + if (*pe) + { + while (*pe == ' ') + pe++; + ps = pe; + } + else + { + break; + } + } + + return idx; +} + +void read_command(char *buffer) +{ + size_t index = 0; + while (1) + { + buffer[index] = uart_recv(); + uart_send(buffer[index]); + if (buffer[index] == '\n') + { + break; + } + index++; + } + buffer[index + 1] = '\0'; + utils_newline2end(buffer); + uart_send('\r'); +} + +void parse_arg(char *buffer, int *argi) +{ + int i = 0; + int argi_index = 0; + argi[argi_index] = i; + while (buffer[i] != '\0') + { + if (buffer[i] == ' ') + { + buffer[i] = '\0'; + argi[++argi_index] = ++i; + continue; + } + i++; + } +} + +void help() +{ + uart_send_string("help :"); + uart_send_string("print this help menu\n"); + uart_send_string("hello :"); + uart_send_string("print Hello World!\n"); + uart_send_string("reboot : "); + uart_send_string("reboot the device\n"); + uart_send_string("info : "); + uart_send_string("the mailbox hardware info\n"); + uart_send_string("ls : "); + uart_send_string("list the all file\n"); + uart_send_string("cat : "); + uart_send_string("print the file content\n"); + uart_send_string("dtb : "); + uart_send_string("print the device name tree \n"); + uart_send_string("async : "); + uart_send_string("test uart async send and recv\n"); + uart_send_string("set : "); + uart_send_string("set the timeout (set message second)\n"); + uart_send_string("buddy : "); + uart_send_string("test the page allocate and free\n"); + uart_send_string("dynamic : "); + uart_send_string("test the dynamic memory simple_allocator\n"); +} + +void hello() +{ + uart_send_string("Hello World!\n"); +} + +void info() +{ + get_board_revision(); + // get_arm_memory(); +} + +void parse_command(char *buffer) +{ + // int argi[BUFFER_MAX_SIZE]; + if (utils_str_compare(buffer, "") == 0) + { + return; + } + else if (utils_str_compare(buffer, "help") == 0) + { + help(); + } + else if (utils_str_compare(buffer, "hello") == 0) + { + hello(); + } + else if (utils_str_compare(buffer, "ls") == 0) + { + cpio_ls(); + } + else if (utils_str_compare(buffer, "cat") == 0) + { + uart_send_string("Filename: "); + char buffer[BUFFER_MAX_SIZE]; + read_command(buffer); + cpio_cat(buffer); + } + else if (utils_str_compare(buffer, "exe") == 0) + { + exe_new_prog("/initramfs/user2.img"); + } + else if (utils_str_compare(buffer, "wtf") == 0) + { + uart_printf("Current task count :%d\n",get_the_cur_count()); + } + else if (utils_str_compare(buffer, "thread") == 0) + { + test_thread(); + uart_async_send_string("exit the test_thread\n"); + } + else if (utils_str_compare(buffer, "reboot") == 0) + { + uart_send_string("rebooting...\n"); + reset(1000); + } + else if (utils_str_compare(buffer, "info") == 0) + { + info(); + } + else if (utils_str_compare(buffer, "dtb") == 0) + { + fdt_traverse(print_dtb); + } + else if (utils_str_compare(buffer, "fs") == 0) + { + vfs_test(); + } + else if (utils_str_compare(buffer, "async") == 0) + { + test_uart_async(); + } + else if (utils_strncmp(buffer, "set", 3) == 0) + { + char *args[3]; + split(buffer, args, 3); + unsigned long time = (unsigned long)utils_str2uint_dec(args[2]); + set_timeout(args[1], S(time)); + } + else if (utils_str_compare(buffer, "buddy") == 0) + { + test_buddy(); + } + else if (utils_str_compare(buffer, "dynamic") == 0) + { + test_dynamic_alloc(); + } + else + { + uart_send_string("commnad '"); + uart_send_string(buffer); + uart_send_string("' not found\n"); + } +} + +void clear_buffer(char *buf) +{ + for (int i = 0; i < BUFFER_MAX_SIZE; i++) + { + buf[i] = '\0'; + } +} + +void shell() +{ + while (1) + { + char buffer[BUFFER_MAX_SIZE]; + clear_buffer(buffer); + uart_send_string("$ "); + read_command(buffer); + parse_command(buffer); + } +} \ No newline at end of file diff --git a/lab7/src/signal.c b/lab7/src/signal.c new file mode 100644 index 000000000..1b46aa58b --- /dev/null +++ b/lab7/src/signal.c @@ -0,0 +1,63 @@ +#include "signal.h" +#include "sche.h" +#include "current.h" +#include "mm.h" +#include "trap_frame.h" +#include "mini_uart.h" +#include "utils_c.h" + +static void sig_ignore(int _) +{ + return; +} +void sigkill_handler(int target) +{ + if (current->pid == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sig_return(void) +{ + asm volatile( + "mov x8, 10\n" + "svc 0\n"); +} + +void sig_context_update(TrapFrame *_regs, void (*handler)()) +{ + struct signal_context *sig_context = kmalloc(sizeof(struct signal_context)); + sig_context->trapframe = kmalloc(sizeof(TrapFrame)); + sig_context->user_stack = kmalloc(STACK_SIZE); + memcpy(sig_context->trapframe, _regs, sizeof(TrapFrame)); + + current->sig_context = sig_context; + + _regs->regs[30] = (unsigned long)&sig_return; + _regs->pc = (unsigned long)handler; + _regs->sp = (unsigned long)sig_context->user_stack + STACK_SIZE - 0x10; +} + +void sig_context_restore(TrapFrame *_regs) +{ + memcpy(_regs, current->sig_context->trapframe, sizeof(TrapFrame)); +} + +signal_handler signal_table[] = { + [0] = &sig_ignore, + [1] = &sig_ignore, + [2] = &sig_ignore, + [3] = &sig_ignore, + [4] = &sig_ignore, + [5] = &sig_ignore, + [6] = &sig_ignore, + [7] = &sig_ignore, + [8] = &sig_ignore, + [SIGKILL] = &sigkill_handler, +}; \ No newline at end of file diff --git a/lab7/src/sprintf.c b/lab7/src/sprintf.c new file mode 100644 index 000000000..246748b62 --- /dev/null +++ b/lab7/src/sprintf.c @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/** + * minimal sprintf implementation + */ +#include "../include/sprintf.h" + +unsigned int vsprintf(char *dst, char* fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig=dst, tmpstr[19]; + + // failsafes + if(dst==(void*)0 || fmt==(void*)0) { + return 0; + } + + // main loop + arg = 0; + while(*fmt) { + // argument access + if(*fmt=='%') { + fmt++; + // literal % + if(*fmt=='%') { + goto put; + } + len=0; + // size modifier + while(*fmt>='0' && *fmt<='9') { + len *= 10; + len += *fmt-'0'; + fmt++; + } + // skip long modifier + if(*fmt=='l') { + fmt++; + } + // character + if(*fmt=='c') { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } else + // decimal number + if(*fmt=='d') { + arg = __builtin_va_arg(args, int); + // check input + sign=0; + if((int)arg<0) { + arg*=-1; + sign++; + } + if(arg>99999999999999999L) { + arg=99999999999999999L; + } + // convert to string + i=18; + tmpstr[i]=0; + do { + tmpstr[--i]='0'+(arg%10); + arg/=10; + } while(arg!=0 && i>0); + if(sign) { + tmpstr[--i]='-'; + } + // padding, only space + if(len>0 && len<18) { + while(i>18-len) { + tmpstr[--i]=' '; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // hex number + if(*fmt=='x') { + arg = __builtin_va_arg(args, long int); + // convert to string + i=16; + tmpstr[i]=0; + do { + char n=arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i]=n+(n>9?0x37:0x30); + arg>>=4; + } while(arg!=0 && i>0); + // padding, only leading zeros + if(len>0 && len<=16) { + while(i>16-len) { + tmpstr[--i]='0'; + } + } + p=&tmpstr[i]; + goto copystring; + } else + // string + if(*fmt=='s') { + p = __builtin_va_arg(args, char*); +copystring: if(p==(void*)0) { + p="(null)"; + } + while(*p) { + *dst++ = *p++; + } + } + } else { +put: *dst++ = *fmt; + } + fmt++; + } + *dst=0; + // number of bytes written + return dst-orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char* fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst,fmt,args); +} \ No newline at end of file diff --git a/lab7/src/syscall.c b/lab7/src/syscall.c new file mode 100644 index 000000000..15235a26a --- /dev/null +++ b/lab7/src/syscall.c @@ -0,0 +1,248 @@ +#include "syscall.h" +#include "stddef.h" +#include "trap_frame.h" +#include "current.h" +#include "peripheral/mailbox.h" +#include "mini_uart.h" +#include "signal.h" +#include "exec.h" +#include "exception_c.h" +#include "mm.h" +#include "fork.h" + +void sys_getpid(TrapFrame *_regs) +{ + _regs->regs[0] = current->pid; +} +void sys_uartrecv(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + buf[i] = uart_recv(); + } + _regs->regs[0] = count; +} +void sys_uartwrite(TrapFrame *_regs) +{ + char *buf = (char *)_regs->regs[0]; + int count = _regs->regs[1]; + for (int i = 0; i < count; i++) + { + uart_send(buf[i]); + } + _regs->regs[0] = count; +} +void sys_exec(TrapFrame *_regs) +{ + const char *path = (char *)_regs->regs[0]; + const char **args = (const char **)_regs->regs[1]; + _regs->regs[0] = do_exec(path, args); +} +void sys_fork(TrapFrame *_regs) +{ + _regs->regs[0] = do_fork(_regs); +} +void sys_exit(TrapFrame *_regs) +{ + kill_task(current, _regs->regs[0]); +} +void sys_mbox_call(TrapFrame *_regs) +{ + unsigned int channel = _regs->regs[0]; + unsigned int *mailbox_va = (unsigned int *)_regs->regs[1]; + + void *mailbox_pa = (unsigned int *)el0_va2pa((unsigned long)mailbox_va); + mailbox_call(channel, mailbox_pa); +} +void sys_kill_pid(TrapFrame *_regs) +{ + pid_t target = _regs->regs[0]; + if (current->pid == target) + { + kill_task(current, target); + return; + } + struct task *victim = get_task(target); + if (victim) + { + kill_task(victim, 0); + } +} +void sys_signal(TrapFrame *_regs) +{ + int sig_num = _regs->regs[0]; + signal_handler _hand = (signal_handler)_regs->regs[1]; + + struct signal *new_signal = kmalloc(sizeof(struct signal)); + new_signal->sig_num = sig_num; + new_signal->handler = _hand; + new_signal->list.next = new_signal->list.prev = &new_signal->list; + + if (!current->signal) + { + current->signal = new_signal; + } + else + { + insert_tail(¤t->signal->list, &new_signal->list); + } +} + +void sys_sigkill(TrapFrame *_regs) +{ + int target = _regs->regs[0]; + int SIGNAL = _regs->regs[1]; + int is_find = 0; + if (current->signal) + { + struct signal *cur = current->signal; + do + { + if (cur->sig_num == SIGNAL) + { + is_find = 1; + sig_context_update(_regs, cur->handler); + break; + } + cur = list_entry(cur->list.next, struct signal, list); + } while (cur != current->signal); + } + else if (!current->signal && !is_find) + { + (signal_table[SIGNAL])(target); + } +} +void sys_sigreturn(TrapFrame *_regs) +{ + sig_context_restore(_regs); + + disable_interrupt(); + kfree(current->sig_context->trapframe); + kfree(current->sig_context->user_stack); + kfree(current->sig_context); + current->sig_context = NULL; + enable_interrupt(); +} +void sys_open(TrapFrame *_regs) +{ + const char *pathname = (char *)_regs->regs[0]; + int flags = _regs->regs[1]; + for (int i = 0; i < FD_TABLE_SIZE; i++) + { + if (!current->fd_table[i] && !vfs_open(pathname, flags, &(current->fd_table[i]))) + { + _regs->regs[0] = i; + return; + } + } + return; +} +void sys_close(TrapFrame *_regs) +{ + int fd = _regs->regs[0]; + + if (fd < 0 || fd >= FD_TABLE_SIZE) + { + _regs->regs[0] = -1; + return; + } + + if (current->fd_table[fd] && !vfs_close(current->fd_table[fd])) + { + current->fd_table[fd] = NULL; + _regs->regs[0] = 0; + } + + return; +} +void sys_write(TrapFrame *_regs) +{ + int fd = _regs->regs[0]; + const void *buf = (void *)_regs->regs[1]; + unsigned long count = _regs->regs[2]; + + if (fd < 0 || fd >= FD_TABLE_SIZE) + { + _regs->regs[0] = -1; + return; + } + if (current->fd_table[fd]) + { + _regs->regs[0] = vfs_write(current->fd_table[fd], buf, count); + } + + return; +} +void sys_read(TrapFrame *_regs) +{ + int fd = _regs->regs[0]; + void *buf = (void *)_regs->regs[1]; + unsigned long count = _regs->regs[2]; + + if (fd < 0 || fd >= FD_TABLE_SIZE) + { + _regs->regs[0] = -1; + return; + } + if (current->fd_table[fd]) + { + _regs->regs[0] = vfs_read(current->fd_table[fd], buf, count); + } + + return; +} +void sys_mkdir(TrapFrame *_regs) +{ + const char *pathname = (char *)_regs->regs[0]; + + _regs->regs[0] = vfs_mkdir(pathname); + return; +} +void sys_mount(TrapFrame *_regs) +{ + const char *target = (char *)_regs->regs[1]; + const char *filesystem = (char *)_regs->regs[2]; + + _regs->regs[0] = vfs_mount(target, filesystem); + return; +} +void sys_chdir(TrapFrame *_regs) +{ + const char *path = (char *)_regs->regs[0]; + + _regs->regs[0] = vfs_chdir(path); + return; +} +syscall syscall_table[NUM_syscalls] = { + [SYS_GETPID] = &sys_getpid, + [SYS_UART_RECV] = &sys_uartrecv, + [SYS_UART_WRITE] = &sys_uartwrite, + [SYS_EXEC] = &sys_exec, + [SYS_FORK] = &sys_fork, + [SYS_EXIT] = &sys_exit, + [SYS_MBOX] = &sys_mbox_call, + [SYS_KILL_PID] = &sys_kill_pid, + [SYS_SIGNAL] = &sys_signal, + [SYS_SIGKILL] = &sys_sigkill, + [SYS_SIGRETURN] = &sys_sigreturn, + [SYS_OPEN] = &sys_open, + [SYS_CLOSE] = &sys_close, + [SYS_WRITE] = &sys_write, + [SYS_READ] = &sys_read, + [SYS_MKDIR] = &sys_mkdir, + [SYS_MOUNT] = &sys_mount, + [SYS_CHDIR] = &sys_chdir, +}; + +void syscall_handler(TrapFrame *_regs) +{ + unsigned int sys_index = _regs->regs[8]; + if (sys_index >= NUM_syscalls) + { + uart_send_string("!!! Invalid system call !!!\n"); + return; + } + (syscall_table[sys_index])(_regs); +} diff --git a/lab7/src/thread.c b/lab7/src/thread.c new file mode 100644 index 000000000..b647e65c0 --- /dev/null +++ b/lab7/src/thread.c @@ -0,0 +1,76 @@ +#include "thread.h" +#include "mini_uart.h" +#include "timer.h" +#include "sche.h" +#include "list.h" +#include "mm.h" +#include "exception_c.h" +#include "current.h" +#include "trap_frame.h" + +void thread_kill_zombies() +{ + unsigned long flags = disable_irq(); + while (!list_empty(&stopped_queue)) + { + struct task *victim = list_first_entry(&stopped_queue, struct task, list); + unlink(&victim->list); + free_task(victim); + } + irq_restore(flags); +} + +void thread_schedule(size_t _) +{ + if (!current->need_resched) + { + return; + } + + unsigned long flags = disable_irq(); + struct task *next = pick_next_task(); + next->need_resched = 0; + irq_restore(flags); + + switch_task(next); +} + +void thread_init() +{ + struct task *init = create_task(); + set_thread_ds(init); // init the thread structure +} + +static void foo() +{ + for (int i = 0; i < 5; ++i) + { + uart_printf("Thread id: %d i=%d\n", current->pid, i); + // sleep_task(500); + delay(1000000); + } + kill_task(current, 0); + thread_schedule(0); +} + +struct task *thread_create(void *func) +{ + struct task *new_thread = create_task(); + new_thread->kernel_stack = kmalloc(STACK_SIZE); + new_thread->state = TASK_RUNNING; + new_thread->cpu_context.lr = (unsigned long)func; + new_thread->cpu_context.sp = (unsigned long)new_thread->kernel_stack + STACK_SIZE - sizeof(TrapFrame); + + add_task(new_thread); + + return new_thread; +} + +void test_thread() +{ + for (int i = 0; i < 3; ++i) + { + thread_create(&foo); + } + uart_printf("end of test_thread\n"); +} diff --git a/lab7/src/timer.c b/lab7/src/timer.c new file mode 100644 index 000000000..a17bc0ccd --- /dev/null +++ b/lab7/src/timer.c @@ -0,0 +1,155 @@ +#include "timer.h" +#include "utils_s.h" +#include "mm.h" +#include "mini_uart.h" +#include "utils_c.h" +#include "thread.h" +#include "exception_c.h" +#include "current.h" + +timeout_event *timeout_queue_head = 0, *timeout_queue_tail = 0; +void core_timer_enable() +{ + /* + cntpct_el0 >= cntp_cval_el0 -> interrupt + cntp_tval_el0 = cntpct_el0 - cntp_cval_el0 + */ + write_sysreg(cntp_ctl_el0, 1); // enable + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(SCHE_CYCLE)); // set expired time + *CORE0_TIMER_IRQ_CTRL = 2; // unmask timer interrupt +} + +void core_timer_disable() +{ + write_sysreg(cntp_ctl_el0, 0); // disable + *CORE0_TIMER_IRQ_CTRL = 0; // mask timer interrupt +} + +void set_expired_time(unsigned long duration) +{ + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + write_sysreg(cntp_tval_el0, frq * MS(duration)); // ms +} + +unsigned long get_current_time() +{ + // cntpct_el0: The timer’s current count. + unsigned long frq = read_sysreg(cntfrq_el0) / 1000; + unsigned long current_count = read_sysreg(cntpct_el0); + return (unsigned long)(current_count / frq); +} + +void set_timeout(char *message, unsigned long time) +{ + add_timer((timer_callback)print_message, (size_t)message, time); +} + +void print_message(char *msg) +{ + unsigned long current_time = get_current_time(); + uart_printf("\ncurrent time : %d.%ds\n", GET_S(current_time), GET_MS(current_time)); +} + +void timeout_event_init() +{ + timeout_queue_head = 0; + timeout_queue_tail = 0; + unsigned long cntkctl_el1; + cntkctl_el1 = read_sysreg(CNTKCTL_EL1); + cntkctl_el1 |= 1; + write_sysreg(CNTKCTL_EL1, cntkctl_el1); +} + +void add_timer(void (*cb)(size_t), size_t arg, unsigned long duration) +{ + timeout_event *new_event = (timeout_event *)kmalloc(sizeof(timeout_event)); + new_event->register_time = get_current_time(); + new_event->duration = duration; + new_event->callback = cb; + new_event->arg = arg; + new_event->next = 0; + new_event->prev = 0; + + size_t flag = disable_irq(); + if (timeout_queue_head == 0) + { + timeout_queue_head = new_event; + timeout_queue_tail = new_event; + core_timer_enable(); + set_expired_time(duration); + } + else + { + unsigned long timeout = new_event->register_time + new_event->duration; + timeout_event *cur = timeout_queue_head; + while (cur) + { + if ((cur->register_time + cur->duration) > timeout) + break; + cur = cur->next; + } + + if (cur == 0) + { // cur at end + new_event->prev = timeout_queue_tail; + timeout_queue_tail->next = new_event; + timeout_queue_tail = new_event; + } + else if (cur->prev == 0) + { // cur at head + new_event->next = cur; + (timeout_queue_head)->prev = new_event; + timeout_queue_head = new_event; + set_expired_time(duration); + } + else + { // cur at middle + new_event->next = cur; + new_event->prev = cur->prev; + (cur->prev)->next = new_event; + cur->prev = new_event; + } + } + irq_restore(flag); +} + +static inline void set_resched(unsigned long current_time) +{ + if (current_time >= current->timeout) + { + current->need_resched = 1; + } +} + +void timer_handler() +{ + unsigned long current_time = get_current_time(); + timeout_event *cur_event = timeout_queue_head; + timeout_event *next_event = cur_event->next; + if (next_event) + { + next_event->prev = 0; + timeout_queue_head = next_event; + set_expired_time(next_event->register_time + next_event->duration - current_time); + } + else + { + timeout_queue_head = timeout_queue_tail = 0; + core_timer_disable(); + } + + if (cur_event->callback == (timer_callback)&thread_schedule) + { + set_resched(current_time); + add_timer((timer_callback)thread_schedule, (size_t)0, MS(SCHE_CYCLE)); + enable_interrupt(); + thread_schedule(0); + disable_interrupt(); + } + else if (cur_event->callback) + { + cur_event->callback(cur_event->arg); + } + kfree(cur_event); +} \ No newline at end of file diff --git a/lab7/src/tmpfs.c b/lab7/src/tmpfs.c new file mode 100644 index 000000000..6233927a1 --- /dev/null +++ b/lab7/src/tmpfs.c @@ -0,0 +1,176 @@ +#include "tmpfs.h" +#include "vfs.h" +#include "utils_c.h" +#include "mm.h" +#include "stat.h" +#include "mini_uart.h" + +static int lookup(struct vnode *dir_node, struct vnode **target, const char *component_name); +static int create(struct vnode *dir_node, struct vnode **target, const char *component_name); +static int mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name); +struct vnode_operations tmpfs_v_ops = { + lookup, + create, + mkdir, +}; + +static int write(struct file *file, const void *buf, size_t len); +static int read(struct file *file, void *buf, size_t len); +static int open(struct vnode *file_node, struct file **target); +static int close(struct file *file); +static long lseek64(struct file *file, long offset, int whence); +struct file_operations tmpfs_f_ops = { + write, + read, + open, + close, + lseek64, +}; + +static int setup_mount(struct filesystem *fs, struct mount *mount) +{ + // should set mount->root as a obj before call setup_mount + mount->root->mount = mount; + mount->root->f_ops = &tmpfs_f_ops; + mount->root->v_ops = &tmpfs_v_ops; + mount->fs = fs; + + // clear the internal content + list_init(&mount->root->childs); + mount->root->child_num = 0; + mount->root->content = NULL; + mount->root->content_size = 0; + + return 0; +} + +static int lookup(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + struct vnode *vnode = NULL; + list_for_each_entry(vnode, &dir_node->childs, self) + { + if (!(utils_str_compare(vnode->name, component_name))) + { + *target = vnode; + return 0; + + } + } + return -1; +} +static int create(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (!lookup(dir_node, target, component_name)) + { + uart_printf("[create] the %s file is already exist\n", component_name); + return -1; + } + +#ifdef FS_DEBUG + uart_printf("[fs] create file:%s, parent:%s\n", component_name, dir_node->name); +#endif + + struct vnode *new_vnode = vnode_create(component_name, S_IFREG); + new_vnode->mount = dir_node->mount; + new_vnode->v_ops = dir_node->v_ops; + new_vnode->f_ops = dir_node->f_ops; + new_vnode->parent = dir_node; + + insert_tail(&dir_node->childs, &new_vnode->self); + dir_node->child_num += 1; + + *target = new_vnode; + return 0; +} +static int mkdir(struct vnode *dir_node, struct vnode **target, const char *component_name) +{ + if (!lookup(dir_node, target, component_name)) + { + uart_printf("[mkdir] the %s directory is already exist\n", component_name); + return -1; + } + +#ifdef FS_DEBUG + uart_printf("[fs] mkdir:%s, parent:%s\n", component_name, dir_node->name); +#endif + + struct vnode *new_vnode = vnode_create(component_name, S_IFDIR); + new_vnode->mount = dir_node->mount; + new_vnode->v_ops = dir_node->v_ops; + new_vnode->f_ops = dir_node->f_ops; + new_vnode->parent = dir_node; + + insert_tail(&dir_node->childs, &new_vnode->self); + dir_node->child_num += 1; + + *target = new_vnode; + return 0; +} + +static int write(struct file *file, const void *buf, size_t len) +{ + struct vnode *vnode = file->vnode; + if (!S_ISREG(vnode->f_mode)) + { + uart_send_string("[write] not a regular file\n"); + return -1; + } + if (vnode->content_size <= file->f_pos + len) + { // enlarge content, +1 for EOF + void *new_content = kcalloc(sizeof(file->f_ops + len + 1)); + memcpy(new_content, vnode->content, vnode->content_size); // origin data; + if (vnode->content) + { // avoid the free the 0 in beginning + kfree(vnode->content); + } + + vnode->content = new_content; + vnode->content_size = file->f_pos + len + 1; // pos=22 len=8 30 + } + + memcpy(vnode->content + file->f_pos, buf, len); + file->f_pos += len; + + return len; +} +static int read(struct file *file, void *buf, size_t len) +{ + struct vnode *vnode = file->vnode; + if (!S_ISREG(vnode->f_mode)) + { + uart_send_string("[write] not a regular file\n"); + return -1; + } + int min = (len > vnode->content_size - file->f_pos - 1) ? vnode->content_size - file->f_pos - 1 : len; // -1 for EOF; + if (min == 0) + { + return -1; // f_pos at EOF or len==0; + } + memcpy(buf, vnode->content + file->f_pos, min); + file->f_pos += min; + return min; +} +static int open(struct vnode *file_node, struct file **target) +{ + // TODO + return 0; +} +static int close(struct file *file) +{ + kfree(file); + return 0; +} +static long lseek64(struct file *file, long offset, int whence) +{ + // TODO + return 0; +} + +struct filesystem *tmpfs_create() +{ + struct filesystem *fs = kmalloc(sizeof(struct filesystem)); + fs->name = "tmpfs"; + fs->setup_mount = &setup_mount; + list_init(&fs->list); + return fs; +} diff --git a/lab7/src/trans_el.S b/lab7/src/trans_el.S new file mode 100644 index 000000000..066bc1c7a --- /dev/null +++ b/lab7/src/trans_el.S @@ -0,0 +1,9 @@ +.globl from_el2_to_el1 +from_el2_to_el1: + mov x0, (1 << 31) // EL1 uses aarch64 + msr hcr_el2, x0 + mov x0, 0x3c5 // EL1h (SPSel = 1) with interrupt disabled + msr spsr_el2, x0 + msr elr_el2, lr + eret // return to EL1 + \ No newline at end of file diff --git a/lab7/src/utils_c.c b/lab7/src/utils_c.c new file mode 100644 index 000000000..e3d874f46 --- /dev/null +++ b/lab7/src/utils_c.c @@ -0,0 +1,185 @@ +#include "utils_c.h" +#include "mini_uart.h" +#include + +/* + string part +*/ + +int utils_str_compare(const char *a, const char *b) +{ + char aa, bb; + do + { + aa = (char)*a++; + bb = (char)*b++; + if (aa == '\0' || bb == '\0') + { + return aa - bb; + } + } while (aa == bb); + return aa - bb; +} + +int utils_strncmp(const char *a, const char *b, size_t n) +{ + size_t i = 0; + while (i < n - 1 && a[i] == b[i] && a[i] != '\0' && b[i] != '\0') + i++; + return a[i] - b[i]; +} + +int utils_str_delim(const char *str, const char *delim) +{ + // TODO + return 0; +} + +void utils_newline2end(char *str) +{ + while (*str != '\0') + { + if (*str == '\n') + { + *str = '\0'; + return; + } + ++str; + } +} + +void utils_int2str_dec(int num, char *str) +{ + // num=7114 digit=4 + int digit = -1, temp = num; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +void utils_uint2str_dec(unsigned int num, char *str) +{ + // num=7114 digit=4 + unsigned int temp = num; + int digit = -1; + while (temp > 0) + { + temp /= 10; + digit++; + } + for (int i = digit; i >= 0; i--) + { + int t = 1; + for (int j = 0; j < i; j++) + { + t *= 10; + } + *str = '0' + num / t; + num = num % t; + str++; + } + *str = '\0'; +} + +unsigned int utils_str2uint_dec(const char *str) +{ + unsigned int value = 0u; + + while (*str) + { + value = value * 10u + (*str - '0'); + ++str; + } + return value; +} + +size_t utils_strlen(const char *s) +{ + size_t i = 0; + while (s[i]) + i++; + return i + 1; +} + +/* + reboot part +*/ + +void set(long addr, unsigned long value) +{ + volatile unsigned int *point = (unsigned int *)addr; + *point = value; +} + +void reset(int tick) +{ // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() +{ + set(PM_RSTC, PM_PASSWORD | 0); // full reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} + +/* + others +*/ + +void align(void *size, size_t s) +{ + unsigned int *x = (unsigned int *)size; + if ((*x) & (s - 1)) + { + (*x) += s - ((*x) & (s - 1)); + } +} + +uint32_t align_up(uint32_t size, int alignment) +{ + return (size + alignment - 1) & -alignment; +} + +void delay(unsigned int clock) +{ + while (clock--) + { + asm volatile("nop"); + } +} + +void memcpy(void *dst, const void *src, size_t n) +{ + char *_dst = dst; + const char *_src = src; + + while (n--) + { + *_dst++ = *_src++; + } +} + +void *memset(void *s, int c, size_t n) +{ + char *p = s; + for (size_t i = 0; i < n; i++) + { + p[i] = c; + } + return s; +} diff --git a/lab7/src/utils_s.S b/lab7/src/utils_s.S new file mode 100644 index 000000000..2db1bb5ab --- /dev/null +++ b/lab7/src/utils_s.S @@ -0,0 +1,34 @@ +.global branchAddr +branchAddr: + br x0 + + +.globl get_el +get_el: + mrs x0, CurrentEl + lsr x0, x0, #2 + ret + +.global switch_to +switch_to: + + mov x9, sp + stp x19, x20, [x0, #0x0] + stp x21, x22, [x0, #0x10] + stp x23, x24, [x0, #0x20] + stp x25, x26, [x0, #0x30] + stp x27, x28, [x0, #0x40] + stp fp, x9, [x0, #0x50] + str lr, [x0, #0x60] + + ldp x19, x20, [x1, #0x0] + ldp x21, x22, [x1, #0x10] + ldp x23, x24, [x1, #0x20] + ldp x25, x26, [x1, #0x30] + ldp x27, x28, [x1, #0x40] + ldp fp, x9, [x1, #0x50] + ldr lr, [x1, #0x60] + mov sp, x9 + msr tpidr_el1, x1 + ret + diff --git a/lab7/src/vfs.c b/lab7/src/vfs.c new file mode 100644 index 000000000..dac00f62c --- /dev/null +++ b/lab7/src/vfs.c @@ -0,0 +1,505 @@ +#include "vfs.h" +#include "utils_c.h" +#include "mm.h" +#include "tmpfs.h" +#include "initramfs.h" +#include "mini_uart.h" +#include "current.h" + +list fs_list = LIST_HEAD_INIT(fs_list); +struct mount *rootfs, *initramfs; + +static const char *next_lvl_path(const char *src, char *dst, int size) +{ + for (int i = 0; i < size; ++i) + { + if (src[i] == 0) + { + dst[i] = 0; + return 0; + } + else if (src[i] == '/') + { + dst[i] = 0; + return src + i + 1; + } + else + dst[i] = src[i]; + } + return 0; +} + +char *get_path(struct vnode **node) +{ + /* return a absolute path for node*/ + int count = 0; + struct vnode *itr = *node; + char *compenent[128]; // brute force =_= + for (int i = 0; i < 128; i++) + { + compenent[i] = NULL; + } + while (itr->parent != itr) + { + int strlen = utils_strlen(itr->name); + compenent[count] = kcalloc(sizeof(char) * strlen); + memcpy(compenent[count], itr->name, strlen); + count++; + itr = itr->parent; + } + count -= 1; + + char *ret = kcalloc((count + 1) * COMPONENT_SIZE * sizeof(char)); // +1 for slash + int index = 1; + + ret[0] = '/'; + + for (int i = count - 1; i >= 0; i--) + { + for (int j = 0; j < utils_strlen(compenent[i]) - 1; j++) + { + ret[index++] = compenent[i][j]; + } + ret[index++] = '/'; + } + ret[index - 1] = '\0'; + for (int i = count - 1; i >= 0; i--) + { + kfree(compenent[i]); + } + + return ret; +} + +const char *path_to_abs(const char *pathname) +{ + struct vnode *target_node = NULL; + const char *_pathname = pathname; + + if (pathname[0] == '/') + { + return pathname; + } + else if (pathname[0] == '.') + { + if (pathname[1] == '.') + { // parent + target_node = current->pwd->parent; + _pathname = &pathname[3]; + } + else + { // cur + target_node = current->pwd; + _pathname = &pathname[2]; + } + } + else + { + target_node = current->pwd; + _pathname = pathname; + } + + char *prefix = get_path(&target_node); + int prefix_len = utils_strlen(prefix) - 1; + int _pathname_len = utils_strlen(_pathname); + + char *ret = kcalloc((prefix_len + _pathname_len) * sizeof(char)); + memcpy(ret, prefix, prefix_len); + ret[prefix_len] = '/'; + memcpy(ret + prefix_len + 1, _pathname, _pathname_len); + ret[prefix_len + _pathname_len] = '\0'; + + return ret; +} + +int set_itr_node(const char *pathname, struct vnode **vnode) +{ + /*set the beginning of traversing and return the index of _pathname start*/ + struct vnode *target_node = NULL; + int index = 0; + + if (pathname[0] == '/') // root file + { + *vnode = rootfs->root; + index = 1; + return index; + } + else if (pathname[0] == '.') + { + if (pathname[1] == '.') // ../ + { + target_node = current->pwd->parent; + index = 3; + } + else // ./ + { + target_node = current->pwd; + index = 2; + } + } + else + { + target_node = current->pwd; + } + + *vnode = target_node; + return index; +} + +int set_couple_node(struct vnode **parent, struct vnode **child, const char *pathname, char *prefix) +{ + /* if the pathname='/dir1/dir2/text' -> parent=dir2 child=text */ + struct vnode *target_node = NULL; + + struct vnode *itr = NULL; + int index = set_itr_node(pathname, &itr); + const char *_pathname = &pathname[index]; // pathname=../dir2/file _pathname=dir2/file; + + /* if pathname='/' -> _pathname='' */ + if (!_pathname[0]) + { + *parent = rootfs->root; + *child = rootfs->root; + next_lvl_path(_pathname, prefix, COMPONENT_SIZE); // update prefix + return 0; + } + + /* The itr will be a directory (root is the toppest) */ + while (1) + { + _pathname = next_lvl_path(_pathname, prefix, COMPONENT_SIZE); + + if (itr->v_ops->lookup(itr, &target_node, prefix) == -1) + { + *parent = itr; + *child = NULL; + return -1; + } + else + { + if (S_ISDIR(target_node->f_mode)) // S_ISDIR --> is directory + { + if (!_pathname) + { + /* encounter the last component */ + *child = target_node; + *parent = target_node->parent; + return 0; + } + itr = target_node; + } + else if (S_ISREG(target_node->f_mode)) // S_ISREG --> is normal file + { + *child = target_node; + *parent = target_node->parent; + return 0; + } + } + } + + return 0; +} + +struct vnode *vnode_create(const char *name, unsigned int flags) +{ + struct vnode *vnode = kcalloc(sizeof(struct vnode)); + + list_init(&vnode->childs); + list_init(&vnode->self); + vnode->child_num = 0; + vnode->parent = NULL; + + size_t name_len = utils_strlen(name); + vnode->name = kcalloc(sizeof(name_len)); + memcpy(vnode->name, name, name_len); + + vnode->f_mode = flags; + + vnode->content = NULL; + vnode->content_size = 0; + + return vnode; +} + +void init_rootfs() +{ + if (fs_register(tmpfs_create())) + { + uart_send_string("[fs] Error! fail to register tmpfs\n"); + } + rootfs = kcalloc(sizeof(struct mount)); + struct filesystem *fs = fs_get("tmpfs"); + if (!fs) + { + uart_send_string("[fs] Error! fail to get tmpfs\n"); + return; + } + rootfs->fs = fs; + rootfs->root = vnode_create("", S_IFDIR); // tag --> is directory + rootfs->fs->setup_mount(rootfs->fs, rootfs); +#ifdef FS_DEBUG + uart_send_string("[fs] init rootfs success\n"); +#endif +} +void init_initramfs() +{ + struct vnode *initramfs_root = NULL; + if (vfs_lookup("/initramfs", &initramfs_root)) + { + uart_send_string("[init_initramfs] fail to lookup /initramfs\n"); + } + if (fs_register(initramfs_create())) + { + uart_send_string("[fs] Error! fail to register tmpfs\n"); + } + initramfs = kcalloc(sizeof(struct mount)); + struct filesystem *fs = fs_get("initramfs"); + if (!fs) + { + uart_send_string("[fs] Error! fail to get initramfs\n"); + return; + } + initramfs->fs = fs; + initramfs->root = initramfs_root; + initramfs->fs->setup_mount(initramfs->fs, initramfs); +#ifdef FS_DEBUG + uart_send_string("[fs] init rootfs success\n"); +#endif +} + +void fs_init() +{ + init_rootfs(); + vfs_mkdir("/initramfs"); + init_initramfs(); +} + +int fs_register(struct filesystem *fs) +{ + if (!fs_get(fs->name)) + { + insert_tail(&fs_list, &fs->list); + return 0; + } + return -1; +} + +struct filesystem *fs_get(const char *name) +{ + struct filesystem *fs; + list_for_each_entry(fs, &fs_list, list) + { + if (!utils_str_compare(fs->name, name)) + { + return fs; + } + } + return NULL; +} + +int vfs_open(const char *pathname, int flags, struct file **target) +{ + int res = 0; + struct vnode *target_node = NULL; + res = vfs_lookup(pathname, &target_node); // find child return 0, can't find child retrun -1 + + // can't find file(vnode) and don't need creat file + if (res == -1 && !(flags & O_CREAT)) + { + /* can't lookup and without O_CREAT flag */ + uart_printf("[vfs_open] fail to open the %s\n", pathname); + return -1; + } + + // creat file handle + *target = kcalloc(sizeof(struct file)); + (*target)->flags = flags; + (*target)->f_ops = target_node->f_ops; + (*target)->f_pos = 0; + + if (!res) // find file(vnode) + { + (*target)->vnode = target_node; +#ifdef FS_DEBUG + uart_printf("[vfs_open] find it by lookup\n"); +#endif + return 0; + } + + // can't find file(vnode) --> creat vnode + struct vnode *parent = NULL, *child = NULL; + char child_name[COMPONENT_SIZE]; + + set_couple_node(&parent, &child, pathname, child_name); + if (!child) + { + parent->v_ops->create(parent, &child, child_name); + (*target)->vnode = child; // file handle connect vnode + return 0; + } + + return -1; +} + +int vfs_close(struct file *file) +{ + return file->vnode->f_ops->close(file); +} + +int vfs_write(struct file *file, const void *buf, size_t len) +{ + return file->vnode->f_ops->write(file, buf, len); +} + +int vfs_read(struct file *file, void *buf, size_t len) +{ + return file->vnode->f_ops->read(file, buf, len); +} + +int vfs_mkdir(const char *pathname) +{ + struct vnode *parent = NULL, *child = NULL; + char child_name[COMPONENT_SIZE]; + + set_couple_node(&parent, &child, pathname, child_name); + + if (child) + { + uart_printf("[vfs_mkdir] the %s is already exist\n", pathname); + return -1; + } + parent->v_ops->mkdir(parent, &child, child_name); + return 0; +} +int vfs_mount(const char *target, const char *filesystem) +{ + struct filesystem *fs = fs_get(filesystem); + if (!fs) + { + uart_send_string("[vfs_mount] Error! fail to get fs\n"); + return -1; + } + + struct vnode *vnode; + if (vfs_lookup(target, &vnode) == -1) + { + uart_send_string("[vfs_mount] Error! fail to lookup\n"); + return -1; + } + + if (!S_ISDIR(vnode->f_mode)) + { + uart_send_string("[vfs_mount] Error! the target is not a directory\n"); + return -1; + } + + struct mount *new_mount = kcalloc(sizeof(struct mount)); + new_mount->fs = fs; + new_mount->root = vnode; + new_mount->fs->setup_mount(new_mount->fs, new_mount); + + return 0; +} + +// find child return 0, can't find child retrun -1 +int vfs_lookup(const char *pathname, struct vnode **target) +{ + struct vnode *parent = NULL, *child = NULL; + char child_name[COMPONENT_SIZE]; + set_couple_node(&parent, &child, pathname, child_name); + if (child) + { + *target = child; + return 0; + } + return -1; +} + +// change directory +int vfs_chdir(const char *pathname) +{ + struct vnode *node = NULL; + + if (vfs_lookup(pathname, &node) == -1) + { + uart_printf("[vfs_chdir] fail to loopup the dir:%s\n", pathname); + return -1; + } + current->pwd = node; + return 0; +} + +void vfs_test() +{ + struct file *f1; + /* + // absolute path + vfs_mkdir("/dir1"); + vfs_mkdir("/dir4"); + vfs_mkdir("/dir1/dir3"); + vfs_mkdir("/dir1/dir2"); + + if (!vfs_open("/dir1/dir3/text", O_CREAT, &f1)) + { + uart_send_string("[v] open the /dir1/dir3/text \n"); + } + char buf1[10] = "012345678\n"; + char buf2[10] = {0}; + vfs_write(f1, buf1, 8); + vfs_close(f1); + + vfs_open("/dir1/dir3/text", 0, &f1); + vfs_read(f1, buf2, 8); + uart_printf("read buf2 :%s\n", buf2); + vfs_close(f1); + + if (vfs_mkdir("/dir1/dir2/dir5")) + { + uart_send_string("[v] vfs_mkdir /dir1/dir2/dir5 fail \n"); + } + if (!vfs_mount("/dir1/dir2/dir5", "tmpfs")) + { + uart_send_string("[v] vfs_mount /dir1/dir2/dir5 success \n"); + } + + vfs_open("/dir4/t2", O_CREAT, &f1); + vfs_close(f1); + + vfs_mkdir("/dir1/dir1"); + vfs_open("/dir1/dir1/t3", O_CREAT, &f1); + vfs_close(f1); + + vfs_chdir("/dir1"); + */ + + // relative path + if (vfs_mkdir("/dir1") == -1) + { + uart_printf("fail to mkdir /dir1\n"); + } + vfs_chdir("/dir1"); + if (vfs_mkdir("../dir4") == -1) + { + uart_printf("fail to mkdir ../dir4\n"); + } + vfs_mkdir("dir2"); + vfs_mkdir("./dir3"); + vfs_open("../dir4/t2", O_CREAT, &f1); + + char buf1[10] = "012345678\n"; + char buf2[10] = {0}; + vfs_write(f1, buf1, 8); + vfs_close(f1); + vfs_open("../dir4/t2", 0, &f1); + vfs_read(f1, buf2, 8); + uart_printf("read buf2 :%s\n", buf2); + vfs_close(f1); + if (vfs_mkdir("./dir2/dir5")) + { + uart_send_string("[v] vfs_mkdir ./dir2/dir5 fail \n"); + } + if (!vfs_mount("dir2/dir5", "tmpfs")) + { + uart_send_string("[v] vfs_mount dir2/dir5 success \n"); + } +} \ No newline at end of file diff --git a/lab7/users/user1/linker.ld b/lab7/users/user1/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab7/users/user1/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab7/users/user1/main.c b/lab7/users/user1/main.c new file mode 100644 index 000000000..4a8ceeea0 --- /dev/null +++ b/lab7/users/user1/main.c @@ -0,0 +1,286 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} + +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + + +unsigned int __attribute__((aligned(16))) mailbox[8]; + + +unsigned int get_board_revision() +{ + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + int pid = getpid(); + uart_printf("[User1] pid:%d\n", pid); + + exit(); + return 0; +} diff --git a/lab7/users/user2/linker.ld b/lab7/users/user2/linker.ld new file mode 100644 index 000000000..bac8da058 --- /dev/null +++ b/lab7/users/user2/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + _stext = .; + .text : { + *(.text) + *(.rodata) + } + . = ALIGN(0x1000); + _etext = .; + + _sdata = .; + .data : { *(.data) } + . = ALIGN(0x1000); + _edata = .; + + + _sbss = .; + .bss : { *(.bss*) } + . = ALIGN(0x1000); + _ebss = .; + +} \ No newline at end of file diff --git a/lab7/users/user2/main.c b/lab7/users/user2/main.c new file mode 100644 index 000000000..e4f23e9f3 --- /dev/null +++ b/lab7/users/user2/main.c @@ -0,0 +1,305 @@ +#include +#include + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +unsigned long syscall(unsigned long syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + unsigned long result; + + asm volatile( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" ::"m"(syscall_num), + "m"(x0), "m"(x1), + "m"(x2), "m"(x3), "m"(x4), "m"(x5)); + + asm volatile( + "str x0, %0\n" + : "=m"(result)); + + return result; +} +/* system call */ +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} +void kill_pid(unsigned long pid) +{ + syscall(SYS_KILL_PID, (void *)pid, 0, 0, 0, 0, 0); +} +void mailbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(unsigned long)ch, mbox, 0, 0, 0, 0); +} +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} +int fork(void) +{ + return (int)syscall(SYS_FORK, 0, 0, 0, 0, 0, 0); +} +/* normal function */ + +static void uart_send(char c) +{ + uart_write(&c, 1); +} + +void uart_send_string(const char *str) +{ + while (*str) + { + uart_send(*str++); + } +} + +unsigned int vsprintf(char *dst, char *fmt, __builtin_va_list args) +{ + long int arg; + int len, sign, i; + char *p, *orig = dst, tmpstr[19]; + + // failsafes + if (dst == (void *)0 || fmt == (void *)0) + { + return 0; + } + + // main loop + arg = 0; + while (*fmt) + { + // argument access + if (*fmt == '%') + { + fmt++; + // literal % + if (*fmt == '%') + { + goto put; + } + len = 0; + // size modifier + while (*fmt >= '0' && *fmt <= '9') + { + len *= 10; + len += *fmt - '0'; + fmt++; + } + // skip long modifier + if (*fmt == 'l') + { + fmt++; + } + // character + if (*fmt == 'c') + { + arg = __builtin_va_arg(args, int); + *dst++ = (char)arg; + fmt++; + continue; + } + else + // decimal number + if (*fmt == 'd') + { + arg = __builtin_va_arg(args, int); + // check input + sign = 0; + if ((int)arg < 0) + { + arg *= -1; + sign++; + } + if (arg > 99999999999999999L) + { + arg = 99999999999999999L; + } + // convert to string + i = 18; + tmpstr[i] = 0; + do + { + tmpstr[--i] = '0' + (arg % 10); + arg /= 10; + } while (arg != 0 && i > 0); + if (sign) + { + tmpstr[--i] = '-'; + } + // padding, only space + if (len > 0 && len < 18) + { + while (i > 18 - len) + { + tmpstr[--i] = ' '; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // hex number + if (*fmt == 'x') + { + arg = __builtin_va_arg(args, long int); + // convert to string + i = 16; + tmpstr[i] = 0; + do + { + char n = arg & 0xf; + // 0-9 => '0'-'9', 10-15 => 'A'-'F' + tmpstr[--i] = n + (n > 9 ? 0x37 : 0x30); + arg >>= 4; + } while (arg != 0 && i > 0); + // padding, only leading zeros + if (len > 0 && len <= 16) + { + while (i > 16 - len) + { + tmpstr[--i] = '0'; + } + } + p = &tmpstr[i]; + goto copystring; + } + else + // string + if (*fmt == 's') + { + p = __builtin_va_arg(args, char *); + copystring: + if (p == (void *)0) + { + p = "(null)"; + } + while (*p) + { + *dst++ = *p++; + } + } + } + else + { + put: + *dst++ = *fmt; + } + fmt++; + } + *dst = 0; + // number of bytes written + return dst - orig; +} + +/** + * Variable length arguments + */ +unsigned int sprintf(char *dst, char *fmt, ...) +{ + //__builtin_va_start(args, fmt): "..." is pointed by args + //__builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + return vsprintf(dst, fmt, args); +} +unsigned int uart_printf(char *fmt, ...) +{ + char dst[100]; + // __builtin_va_start(args, fmt): "..." is pointed by args + // __builtin_va_arg(args,int): ret=(int)*args;args++;return ret; + __builtin_va_list args; + __builtin_va_start(args, fmt); + unsigned int ret = vsprintf(dst, fmt, args); + uart_send_string(dst); + return ret; +} + +#define MAILBOX_CH_PROP 8 +#define REQUEST_CODE 0x00000000 +#define GET_BOARD_REVISION 0x00010002 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +// unsigned int __attribute__((aligned(16))) mailbox[8]; +unsigned int get_board_revision() +{ + unsigned int __attribute__((aligned(16))) mailbox[8]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + mailbox_call(MAILBOX_CH_PROP, &mailbox[0]); // message passing procedure call, you should implement it following the 6 steps provided above. + return mailbox[5]; +} + +int start(void) +{ + // char buf1[0x10] = {0}; + uart_printf("[User2] Into start\n"); + int pid = getpid(); + + uart_printf("[User2] pid:%d\n", pid); + + unsigned int revision = get_board_revision(); + uart_printf("[User2] Revision: %x\n", revision); + + pid = fork(); + + if (pid == 0) + { + uart_printf("[User2] child: exec /initramfs/user1.img\r\n"); + exec("/initramfs/user1.img", NULL); + } + else + { + uart_printf("[User2] parent: child pid: %d\n", pid); + } + uart_printf("[User2 ] exit\n"); + + exit(); + return 0; +} From 20c876d15736b2c2438898f03cb1f1fe749bb70f Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 27 Jun 2024 09:36:55 +0800 Subject: [PATCH 22/24] Create ReadMe.md --- lab8/ReadMe.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 lab8/ReadMe.md diff --git a/lab8/ReadMe.md b/lab8/ReadMe.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lab8/ReadMe.md @@ -0,0 +1 @@ + From 0a1dac142fe104fbd641388bfc3379a27c8e2866 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 27 Jun 2024 09:39:51 +0800 Subject: [PATCH 23/24] Add files via upload --- lab8/img/FAT_R.txt | 1 + lab8/img/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 31790 bytes lab8/img/bootcode.bin | Bin 0 -> 52304 bytes lab8/img/config.txt | 3 + lab8/img/fixup.dat | Bin 0 -> 6745 bytes lab8/img/start.elf | Bin 0 -> 2883108 bytes lab8/include/bootloader/BCM2837.h | 54 +++ lab8/include/bootloader/mini_uart.h | 14 + lab8/include/bootloader/rpi3.h | 13 + lab8/include/kernel/BCM2837.h | 54 +++ lab8/include/kernel/arm.h | 28 ++ lab8/include/kernel/cpio.h | 11 + lab8/include/kernel/current.h | 20 ++ lab8/include/kernel/entry.h | 9 + lab8/include/kernel/exec.h | 11 + lab8/include/kernel/fdt.h | 110 ++++++ lab8/include/kernel/fs/cpiofs.h | 8 + lab8/include/kernel/fs/fat32fs.h | 8 + lab8/include/kernel/fs/framebufferfs.h | 8 + lab8/include/kernel/fs/fsinit.h | 13 + lab8/include/kernel/fs/tmpfs.h | 8 + lab8/include/kernel/fs/uartfs.h | 8 + lab8/include/kernel/fs/vfs.h | 96 ++++++ lab8/include/kernel/head.h | 6 + lab8/include/kernel/irq.h | 20 ++ lab8/include/kernel/kthread.h | 16 + lab8/include/kernel/mini_uart.h | 24 ++ lab8/include/kernel/mm/early_alloc.h | 15 + lab8/include/kernel/mm/mm.h | 14 + lab8/include/kernel/mm/page_alloc.h | 59 ++++ lab8/include/kernel/mm/sc_alloc.h | 21 ++ lab8/include/kernel/mmu.h | 81 +++++ lab8/include/kernel/mode_switch.h | 8 + lab8/include/kernel/panic.h | 6 + lab8/include/kernel/preempt.h | 7 + lab8/include/kernel/rpi3.h | 29 ++ lab8/include/kernel/sched.h | 18 + lab8/include/kernel/sdhost.h | 11 + lab8/include/kernel/signal.h | 89 +++++ lab8/include/kernel/syscall.h | 32 ++ lab8/include/kernel/task.h | 92 +++++ lab8/include/kernel/text_user_shared.h | 25 ++ lab8/include/kernel/timer.h | 16 + lab8/include/kernel/trapframe.h | 83 +++++ lab8/include/kernel/waitqueue.h | 19 + lab8/include/lib/bitops.h | 12 + lab8/include/lib/list.h | 459 +++++++++++++++++++++++++ lab8/include/lib/string.h | 14 + lab8/include/lib/types.h | 18 + lab8/include/lib/utils.h | 89 +++++ lab8/initramfs/Makefile | 33 ++ lab8/initramfs/linker.ld | 26 ++ lab8/initramfs/syscall.img | Bin 0 -> 246920 bytes lab8/initramfs/test.txt | 1 + lab8/initramfs/test2.txt | 3 + lab8/initramfs/userprog1 | Bin 0 -> 36 bytes lab8/initramfs/userprog1.s | 19 + lab8/initramfs/userprog2 | Bin 0 -> 3152 bytes lab8/initramfs/userprog2.c | 278 +++++++++++++++ lab8/initramfs/vfs1.img | Bin 0 -> 404216 bytes lab8/initramfs/vfs2.img | Bin 0 -> 404984 bytes lab8/initramfs/vm.img | Bin 0 -> 247488 bytes 62 files changed, 2120 insertions(+) create mode 100644 lab8/img/FAT_R.txt create mode 100644 lab8/img/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab8/img/bootcode.bin create mode 100644 lab8/img/config.txt create mode 100644 lab8/img/fixup.dat create mode 100644 lab8/img/start.elf create mode 100644 lab8/include/bootloader/BCM2837.h create mode 100644 lab8/include/bootloader/mini_uart.h create mode 100644 lab8/include/bootloader/rpi3.h create mode 100644 lab8/include/kernel/BCM2837.h create mode 100644 lab8/include/kernel/arm.h create mode 100644 lab8/include/kernel/cpio.h create mode 100644 lab8/include/kernel/current.h create mode 100644 lab8/include/kernel/entry.h create mode 100644 lab8/include/kernel/exec.h create mode 100644 lab8/include/kernel/fdt.h create mode 100644 lab8/include/kernel/fs/cpiofs.h create mode 100644 lab8/include/kernel/fs/fat32fs.h create mode 100644 lab8/include/kernel/fs/framebufferfs.h create mode 100644 lab8/include/kernel/fs/fsinit.h create mode 100644 lab8/include/kernel/fs/tmpfs.h create mode 100644 lab8/include/kernel/fs/uartfs.h create mode 100644 lab8/include/kernel/fs/vfs.h create mode 100644 lab8/include/kernel/head.h create mode 100644 lab8/include/kernel/irq.h create mode 100644 lab8/include/kernel/kthread.h create mode 100644 lab8/include/kernel/mini_uart.h create mode 100644 lab8/include/kernel/mm/early_alloc.h create mode 100644 lab8/include/kernel/mm/mm.h create mode 100644 lab8/include/kernel/mm/page_alloc.h create mode 100644 lab8/include/kernel/mm/sc_alloc.h create mode 100644 lab8/include/kernel/mmu.h create mode 100644 lab8/include/kernel/mode_switch.h create mode 100644 lab8/include/kernel/panic.h create mode 100644 lab8/include/kernel/preempt.h create mode 100644 lab8/include/kernel/rpi3.h create mode 100644 lab8/include/kernel/sched.h create mode 100644 lab8/include/kernel/sdhost.h create mode 100644 lab8/include/kernel/signal.h create mode 100644 lab8/include/kernel/syscall.h create mode 100644 lab8/include/kernel/task.h create mode 100644 lab8/include/kernel/text_user_shared.h create mode 100644 lab8/include/kernel/timer.h create mode 100644 lab8/include/kernel/trapframe.h create mode 100644 lab8/include/kernel/waitqueue.h create mode 100644 lab8/include/lib/bitops.h create mode 100644 lab8/include/lib/list.h create mode 100644 lab8/include/lib/string.h create mode 100644 lab8/include/lib/types.h create mode 100644 lab8/include/lib/utils.h create mode 100644 lab8/initramfs/Makefile create mode 100644 lab8/initramfs/linker.ld create mode 100644 lab8/initramfs/syscall.img create mode 100644 lab8/initramfs/test.txt create mode 100644 lab8/initramfs/test2.txt create mode 100644 lab8/initramfs/userprog1 create mode 100644 lab8/initramfs/userprog1.s create mode 100644 lab8/initramfs/userprog2 create mode 100644 lab8/initramfs/userprog2.c create mode 100644 lab8/initramfs/vfs1.img create mode 100644 lab8/initramfs/vfs2.img create mode 100644 lab8/initramfs/vm.img diff --git a/lab8/img/FAT_R.txt b/lab8/img/FAT_R.txt new file mode 100644 index 000000000..5d2252cd1 --- /dev/null +++ b/lab8/img/FAT_R.txt @@ -0,0 +1 @@ +fat_r test \ No newline at end of file diff --git a/lab8/img/bcm2710-rpi-3-b-plus.dtb b/lab8/img/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..3934b3a26eb82fd65dbcdfca6f6916da427a3fae GIT binary patch literal 31790 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 literal 0 HcmV?d00001 diff --git a/lab8/img/bootcode.bin b/lab8/img/bootcode.bin new file mode 100644 index 0000000000000000000000000000000000000000..944263a654c7ab1bdcced973988d4e75dee80de3 GIT binary patch literal 52304 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 F{tH{OT897t literal 0 HcmV?d00001 diff --git a/lab8/img/config.txt b/lab8/img/config.txt new file mode 100644 index 000000000..e82fa85fa --- /dev/null +++ b/lab8/img/config.txt @@ -0,0 +1,3 @@ +kernel=bootloader.img +arm_64bit=1 +initramfs initramfs.cpio 0x8000000 \ No newline at end of file diff --git a/lab8/img/fixup.dat b/lab8/img/fixup.dat new file mode 100644 index 0000000000000000000000000000000000000000..e928ee3fc1bf00e638365cfa0bc4c9d94940bd7f GIT binary patch literal 6745 zcmeHLUx*cD6#str?009!>v+4adf8pK)wXTjmZ(iCMAXDAO{y1Dq)f6R5wZ}(h$7A2 z3L+mQ^(6?QKza-8B^0E`q=!K8t)d`&i0DBmsdK*h&dfLC+`Zo2G=t9EnRCAL_q*pi z-=CT005yBOa32hHf%RSF-NcVMg$1}o1|P%J=ieUVWou3xT-MD}<*mqK+Zb#TVcw)+ zlmf0UH8_x@4D7$nOK|xP&$_r&m2t%?>5aP}9BTAtP~i`o=I+C}#iM;)JA)_Zch#xr zW5~kk1#@+gyTiNn9-ZN*S*8o$_!`Kg_d;P|uRV=0H0y|1p>^6zA5&dioV~5{fb;Lj zbjQY)dDUz_ZOot682*_C-&>g=#+UkyIlPM;UFY_P7kG_e{6SwT7v68nYB*#fYjNjp z)2ae2vW6O~u&*X4)~PJf_ts4Gv-IZ_7Qw8u3{7l;vCRfivprz#6tz=>?nK5;APKic4au-bzMeXz{oSe#O;k}m`j$lvS;Mk(B zt2gKS*Oir8c)YOomS-F@T!tRII>!v@p_0t)Yaq6=&M*YA-F!122qYmhP>dEX@6327gxr8Lue# zy-uvHP^W=loD-Vo4A z;`6aAg?ygCKAw<#L}6HO#~W=*;sFlJfvdu(lSZrY)J$+bZ+3X8pcZeT z@i-Hc9IOc1mLMs_5}d)uSA|IGr~rc``|AYXTr3VoD4W1xAn!?3q|;Mz&`oFOA1yv| z?~^0p>PVvX)&LaxSEUX`WFZWhM-vLU0+JK3$!ow@&Q+{JH#0R$r&a66M#r}IoZ zYUt)eyjf*XssYrxznQ45b<WRw*eNqS&qc7S3W4(J zkh1+@pr8{pQcwJ$%S}G6Y-Zr{c>b28{VLLkf(J-E?N{|a=lZKqk zXN2HXo_20@@MggB8x>@@yw2n)KR$CJaz&+LYD>xU@VdKXj=T9Ih=8i!NL-5DEmW+q zeWYZ0%QoZkT#&cPQfjlIVDdK6Dp_lD zz?D({-j`iCOW}$Xu~YVRL~?^6f3DW|qtG+Xz{HbbwnM3-s|MHeY=njRd(SnN-5JL_ zs-V_&d^*~aoj92bu>wZUL^FUU-KqF`s{WSYonS4Qbc4qEnpu3E@F0fH5ni+gyY>)H TT!2(M{@_o%dmo8$>KOh8=fLZL literal 0 HcmV?d00001 diff --git a/lab8/img/start.elf b/lab8/img/start.elf new file mode 100644 index 0000000000000000000000000000000000000000..2f1fc7d33a6c93137a2ef64f392ccbae21b8e73f GIT binary patch literal 2883108 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%0D$3zP({3EelSe7#oMEf!iJ|20wD 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

    59Ef>IQH)}_Ccg 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⁢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 z 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

    OsYV~&167_7A_{2gZ{FA6jVANZO#rM|3KNhpu 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 z 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
    s2DgTKQweq)8rU(H$!xQ#Z%U zW6}k?@I-eL0_4(B!QW=1WDGuSG`fvoWtxK76*P#kbH_Bq#LmLV0L#V_nKR1Nn?~Cxt$SY49f?Oj` zx8ZtVC2Jvy5V6gu8=@U1%sTTap;y>0s3jWl6=NdfFEP&p{-QsuRXJe`Wv#OoaR(27 zw}S+YP^FxRA+(LJ0!Ii%T)^KSAR_Y~5u)~#GmhcSpI{}u54WlI3POOb3aOR_PI?9M!Yb?2mRiD-()uipVlHuQkWh|8QjZS!132v4ikuZ?lcRkke@ zyNVE}P1rS3DKqg8^EJHM4x-1A17U9UT!5M>5PA|;+Jf_#1iL*Wq925&Rip8O?g+I zRlnA(jwfmh8_m0l)>K}NGGyAriM4D@d%7K|ySwvKmoKQ?^2-Hz%4y4?1y6+q$MiRx z5nl`B!QW*@ zD$HwQUn6$}!gH0a;W6Il%h>$pig98)R=~VPmP68D1FL8Aq1lsuK4Y^ZKOG$1)t+*@ zL7c1b;pt^;lx#kPUHyu;Be3v*$-58(te+;WM{(;8lmI@+)s^?mKVNCri!qMe z`!Vv=V83aK)Nwm?uB{i)m33xzw&2C6FoRX<7%U>v)z!iA zw3yiFnoyRFiRBf;e@NTVm}0$uRcFH~I@H;)sk6~FG#lKWrRUQ(=jM~vrH}w#=~<2W zh;`&XPz29l!?Qs#qNa|UIV~Nxa+P zk+K=-H>?(K7goD95S^cknN8p9OlMY@A|fbs?<f);e)=FM+)aQGf}=_1Y#nM(Y>v{&wpM|(e2+ir4ppk=$b zK0QNi8918FEC!lELvdemH=|XZ#0x!WWDVJO4ES@uB6!lyI~{s;wkuETFyqlml&LH% z3fLG(jW)3n9qbrPEl?g$jrD%LoVCST@PK+py7LrAcn6+jq~zsyfKH$7Dz<9(Y&t(} zb0sjKkvPkEwe1(xwl67>rn)e|DudjdNRtd`ZN}R{Kx+(e?p6-)AK$b!TpoheDDUOv zg;tH{%`<|>c7C|E)oN>})YgLa1HdKL>fl{1+y=C7$%*oQj&(Z}aNd9SNZOSc)B3PG zbqCeD&A@Or7B6O2R!4JN9Z56Z4|d!@A3>^gsAB+aH=^yopzV!;%KY`NX`8jM*ku;? z&9adSo=4BO$RSkgS<}^Q0K~cd@9nz>r( z&edth9mYG8+b+Ptz(tn*ZhdpF15Ov@fgk6zJ6iqW}t7&cN3f+RU z%9)fF3+tcdN4a8ALo1y*lWTS4*SRt_d()Y%W?^@6Yzx*Lw<0`sN(*2@>q$MI>!`1} z$C8Jg4O+cjrY`IrpgY^bV@!F2ZNEX^)zob7;`=q+q#C#`2mA?mRC_*!A* zRoKfaRJLZh!eUUT$_jb}n}%0NZdrZJ>eE8_XiE$mdDme;5rZL6Y87fauy*R2o9a>X z%d+A8I5Eb`+P|&bDH+IN{S4+D9;#EP)_BA!V`M6pVr&UpNb3fC+xpYNZ_GZw1N(S= zO{@bW&KYfqLYvX-JF`3(Nqfg&Rts7zQXU75y`8nrRH$spa)w2Dud?sXa)^tqygG^? zwGP}>dJv^SxAE0m@YSrw8mrbbqo+kFM1L_3e06FD{J#mi;_m+HRQAQ#HSmj_1bbZv z@TRHb7JhHw_a^XmGoFLcT83GP@Lu?KRvaRSa~1pE%q{KsS^@COp@(a1mQX7&)H0i2 z)-vmfwaj`NZuw?T8D{YYW--`Do!UbgV&bry&YMPFK0&xe{;)b^-g9oz9xC^jJ{LnaQ5{0_B_Ni>XPqG z%?hhfEp>f_d%3JugzLhIBOJ4BV$T{e;Q#!Fb8;lT0BaIToR1nUEva>GmYb{O!q?A2 zjG?zC)KWg_)ta3aPinAUz+Zb?oYDsA?46XCZirKCccs7zf(zEIm~`TwGDP{|7~Qu4zYHkiBWO&y0w7Iunk z_6x0ZHtr4MDaQMCna7z~!Pa<=mErsi1sXeiq?~NhRqJei~wUjvrn`01@9S)nbC?PEW$1$DBE;Xyo*t@81JnzkH}^q z-YV?6g`Dls!Vl-&EUUx!##;(7mxb8V7@nEB0NKI$Oet`&rwGs@tuq>D5{4_$;z9K5 zdQ@*|!n%E|JZ9~{Zye9)%;#$R8kLT2mw8Lx&=|fc6RnUbu^l2!*qw2{((v`pgzjdd znQXrg{9G!y+|;R?Gisw8L0-VsRTQfiwV=_Nrn+jBuqfS{WOJ=Xq2QVwN|%|@%UJK1 zOYv=Jvk6?e)SYK#T=}&8O5ihgp45Cr8*bYSZC0`w97bNMy;dVSyYj*#wrIhb^CqXt z@kBiwU(2E0ys%v5w1Jh5^nSH;3FDS9uH01f=Ezzz#^vhDjb**YZGolduCu7`Q0vD( zoTrW}Dole@1uGGa`rBGh1lU*-=lgWP_PRM^hg8cVCb<$YaFCbP>|Lze?!e$8%O4x3EEoL&AU%U*CDmauwh4JGAqP}m*SLlXwRy+6PSF-tV7%a&{%l3gzO4&&wd>P zX;syDW*NY2%$aOyqH!3J=2|+)s0wRXCC9LD;#Dqe`~(dWos~Q zNMB|KjsEZDJKvE5{Wo$MjL)V>31%Ja@*(Y*@-V?^JsM+Z9vXx3I+Jy1`u`ZlX8At+ zWpbHkA(uIbZ}=?YZn+GD=I3H#sScKo0<_e*v=5XQG6iY6QU|-1l#eN5rQ`OONh^i* z+C^}TIk-iva5-rZe+a!1dv3m)`DmmCUP&Qe%2!B^Lm{C2oGm`gyl0?@Dx>s>)DmX0 z#yU*a%tu2k0w@Y6GP@dPOT%vX=p;mUlO-6pGHE4rWQ6?<_zS*y4zmS4o|rE-9c$*y zE~dlYt?ID#st)@l{B@G#vD(h%MBl%nKa3n|Gloy2{he2FBFSA?ur;r?rA?oz>-+&} zYSUW}wHd+-6vx6Du8uZs_+gYC<@$Q>2Z|21xCTXiw{{?Py;a*e6DO72g{(aRJpaKq z0!r#w80)Z8SWtK75RdQqRfpxA?08j|$K;KIg?Z@s;qQVHmso17PN7K8o@n`FO_U`G zItb_F_i9F1)=gmA!%G2ooFMipYxVAo%E|vxS2?F)=J}c!wVZ46X;}BHOJKS!=V)H6 z&s-PRr)&&gmmyA8>clzau-J}=29fn@vP8!bjBrT}-ppD{{E6u#9@ekSCNEfmouPP( zB#$!OouaXr?f>-7@?n+DWJROJ9brbAEE^n2bb@SxC)HQT?y2yl3K>}Mdjz@;CR_E< zSMdHvyla)GOgN1L4*4sF`!u9EtSLRys*^HNZYRpIdS~7v)qSTPf<&gMc(KSdZ2$fq z!Mw+b-Y_PAjy5!B^qpFa(k_(#>9=`Wuc-bfwr>3#-zfl zE9-`(#t3k*x^fC38j}a@HXYLt@8i-jo^X%b9ero{aOM||=^fx}g6aTs$rN`!YoxBz zB-+x}^`Ksy&E$xEpuYC~hh@rtYx8T0~A#)L2T3?M7V0VvZ#Il|%CdJb6RH*rt#pucXZRI41zAuKH zB%Ib=IeQf}IRSs&Rp>j!fPW%>*?T?wZ+kEz@NHRF%0J4L&f5CXZEEd1 zRi{4hy1lLSR{@W_KR3i00c+57QDEm8YcBTR{ka-lZvH*G{osuD<-%SvJV_^2)9ySi z>{t||R#J9psq%)Fc6V#rX0qA)ICKDZkQ`YU6zJpXPA(-ea%M}=cj^Z4CB*YlcfcQZ zd;6KZtVw3w6Qh(+(A;YJTk3;`G(!yde|Dt>)EJ!O+Gb`eir*$!HG*SWdt>hv#e=?l zl=JAi*-AZdWsDW$xI*A3r*5*h<_XwCME_rb!2TK^e7Xkwrq8D$|BKIz*8Md*kaztr zfdHd+1kSyS%X7!v`IYHZUZ=i7GT*Z3r-Vr-{>mM5}q)w=sWcq#x426!&f0S z4}JvnyNxA%r#Els&AK}JY1pMyL zS!~;w8keY19K;}Li~CNE;nrFWfRA7a`E$35pUXcdp7{(CW^kT_ZV%hL=s10b$f zX(qErTGn}eFcuo#&SH4{!)n@V#$#0|Hx{e87?>RJ&$t=HjU>h3NjY7p6ymn6lg5bw z|DQjL7DZYCj0pJua7&as=aSYXDn>jO#&9d(-}xESROqE%r9LjNW(8V)jkqDxk2{UE zJqNoLZjF_l%UO$Flz;WJ7_?Zaw)iqyd}(fQ#*g6nCv(}1ci`#exi++sj&puzab(SQ zw0cJEm4@ZY(pUr4(fsN&-jdS_IY@B zAa@;2IC%tXxW=@s)4;`J_dAT5&j&biXFc!W16!MiD(lt`&G%iHatGJd(*Mgkvofr$ z?_1~LygO@or~lz~zAL46Z3Dc`)U4fz9a^=RQTYzwy0f;Hh4T8RJ-B>QJUBnD|Kj5~ z`kZX$95^`~o5lDh=cIJEb2j!tqz3$&zjROS2v&q#R*38>Bwl{EwhVY9LNSll!G6QQ6g69Z(rE3 zKGC1UPQl2|ZCgKJ=Qa&$d3_b{dwu`*ft}|??u5ccWpo@n!$rnlfJe2+sp{>IA$~^B zcqXC)rx|YHz>N;u1MPhc_6UFsSkh(ZKFY&Zk8wI9Kq~_N?txACj-kDCfoeSk`H6)l z)9LE@apnhX4qVjhoAjR7_uvO{{N1?|zs-%r80R9FKvNq@+1W5j$9xcG=-BzJFh-~-r|oHmVc~PuO_t2{ z%{H2=tOHH29ni?xi`X3#H6<4D4+fa8N#A4z7MAd&wWtky(_f?TUgw+Bqoy51TEM?( zz&E)EX`KA4MZ@hE4N%zinLy2M`QzS4ECba7)&9Oh+hND(^+okOV`!sK+d1*sI1Oyn zyuLusGe)GOchP4vSP4y!*Ei+;WvG{gXa|&#ud^$N@bPJ_K5CJ0Jsa*B=l~&jviXLe z09!+8VyF6)FACQL^E*c2TE6+Wql9bC=HHDMuAMQzJ0suo^-|&XvI>doy?HMo*G4sv zGvwN`2J(Ay?YRbWkzD(zfqaeh^=kThHGRFBzFtk=pr&t7(>JK;8_3tf?NNXr)*_y4 z((n@{YA;9=gZ**Rn3Cq}q*vm5LGPNc8+v_1Pv+jXp(jgkr}{*$jmCGELekR|5X9!I z0%}QW4e|vc(sfoN_{3_krzMV3&u8Hb7Y^|gaN8l&FpCBc6j^~cGjM0 zChPe0GLam181`6uE-UV$#{44=y~oteXiUj_ZP>FU-(LuBzP)EbZ2OQiES;+9I0Xe7 zti_6cX{h?wU~M)jioQr|DsX^LEi!lqmXlToPLjH%I&WmpCB>a(hW0Te%j>hEh2z+L zUUR@E5bHksJ(Jo-p`u@@w|Y%YkOXEpWVMwWtF4GmRKow_&)7`LULnS*YG466G7BHsj+y4&o+0w)QrV5Lm%{99&v3vt)(Gd=Hk8{hkmVqE%L^z-j4-&y%zD?|5c z-JyH=2A$QkS7>+|7SkIj^u!yVp}T8a9P`2s)8;*Wp}glkC531E1CtK_-^Ux=yaTrU zR>hXzso3)F_)O0?DxL%(7`U;NLHtKc8N>r;fFa+DGbpo6#g^w(Z23sVpHV8FECZgP z9TjsvQd354WSA3yN&8&IoCsjfl^_lcVGbw7{xA4)2TS(;k64lb-1ri>Avi%f%o0z6 zG$fim3BX#xT&iO2$EO87zdNM3`8vb5-aJBbm(r!HpkHdbDqNNLD43Am3Jv0z4rhQj zpodvM8D9V9)TL;>UlcdXd(s7IvBH6aTQ^4|)=yYBB?{75_brdSH@zXHZW8QD!aMK` zy9O(_JL`=md0#r|U-5nz(YA4VO@A$(+zCz9nl>)B)L~wwna^%~H{mu#9&S_Qb$8?c zys=G+W^9zJeio5`o@TB&VA1w3Mm^GBg}*#F{Pl?fTASvGS+!*T#WQ@eMmnq1&2Gr% zb_;Ki)*q8Mp*4CNc7^*VFGgIUS0ZGFeCl zL}n(FjXf&~2y!x62%98;g4CL4CJBTHVSuQJK%U70VY35@T5B`$0Tjh+gN3TCy*$Yv zjytxtw|aY9P!plG4K5%cF#qp)CIP%}@BO^*{{xxl?ECqh-}!AvBTc!(<@@ts5geNA zGc*Z1E0tsT$Sdbxp1}JuG=_zQ1Gk=G_N8RNbr*cVP2ma$?)|QNx{SRlh%)Ut!tg23 zUe9oSZB4_7ru$(#U@}qutlepAn%HDsGr={R*V-JrXS9r1Yi70NpJ_53olsVObh>ur zbrLUM2|RUzD5H89HFXW-%0ytZn+Z#~`urLv=X(kMm*H3ZLF1$2^SqBv+dJV-@80Pz zPe`^Q9(p`pu+WV~u*+e>1*3A(DFcgevdu>Fe{DZ5>|KK<#8ynDu(9r;Mx( zR|2u@uL0C_~X><%EEb&adS2Yi?GJl=;JJ84dCU*LcADfWaDxA*g;Of+%5$g8VpB)0EQ_#M{wHhyFJKEiJ|us=4hFMZEk;Xv&L6YWNAW}%z9 zbsQSF!51=IZlt>w5GE6!QQI>G^BKtyj?i$vv|77m<6nvU@9@f>)Qt?DCp=doM7X@`|jg(eag*4#f?XfMui`OV?3Wd-1}O zS+fw-IH;x&pMX9W#+t zg#!isT;CG!Fk&B^w?1&77_87HYUZ8^JYa>w`DQdf`ck;p+}wF69CQl4bS(%-l?uzp zj6>8uzQEf)t#!geFEoll&+1Z_%sM*$K)#~xfqUt!7WF5yRQ2vzfV;EysXv+p9oZ1G zWgUf4VDznUpyZo-Z3|1+dGa>wD|mTQT8s$U+Fwp&ZLH)HJPevwegE>LUxHh3ScmQF zF8L-hUKhrEm54FNyM^Z@z#4X+$DNO0hkS0-{mfQ6^WXD1OLgiBI6JdMz?;Jpa4%PP z&Z>omR3>njAHtYACY?{$YTF5Kx2i+MK2(SVjs)kx z_Vw^NeaD4Kbw#|*U8JZxi^aaF@5F*bS&3gm7s;$m;~}Y4q8Tz1m*wgwqzBa3-NoA* zii0J0`ZPYaMcY2SSbKALaWDuuwcnyX61Yk&COYu`%@$7*_9mh5=U9fP=Wza<=qOU zXMROHI6{vU17aSJ+8K9}-PxmUQ9C8DIln*Qb3?la5)2&hJ0^YWYdEE?H51}EfiX8dJ^rn!7aDzWM=epjN+H`dIk9ZP#QXC{tPa09H$gyp~Q ziV+S<|Lwe7GnTFI5f{A^WUqI6nobi?Fl(=URXeucwg79V-n|ZMX|;WoyYZpOeU&XO zMsfj_Rp&-T6s{%`cH<{9C>HWXycHACqICr;;`rESz#&;mN`p({N`jSfVk`^YhcFdf zlV`v)VfYoZ6Kth14Vm;dT27bhE0p+yM5kyhA^v+H3iBtov7?$A)IYnUJASlirp~n? zPyU$98FVcnGtX`ghizL%;hf_&z?#ECGAJUw*|g_4{zCXWna%7&MeV56Mk3~oO5%ra z=d2UZ4G&5?=Z3~2^mrxhIZ@eam3EYdUJ{3Guju`)80(v>y(OA`mD*M_WX2Zn$jNPZ zR<%;4r^oVwI)eV2I+8xG-U2(?qbTv0l5CmXj7}eG;n*&S|Ejt3negdjPwT!Y_*D2# zfaQf#3BCg?PWN3o*WCH?^|Ng!dkwyRJ>?hh9fj|T?mGqFVfbFqeILX3 zZ($2$t#75NxWfYrHSU8O+!UK!8X2W7bu?wtwr!(u-^`1(`Pg2H^=U@@ZH4s0o3U&! z`SP-aA=rXf&h52zUg)!d^8VlWD-q_@x)mGrH4%v%%2%^`C6p`JCG1AVAsxEG8``S6 zrux;4$u?B(P`s{;p)+*;k0jUi@NUM?{(GufI@3(&O4`wg2pf_q+HGKj%p3LH)c(5l zHFb5h>+E3~-jf9ICf0N~Bn_{JVEjV&a3~5k{5L*L$%^F~TcJGSybt~6h z=YiZ9gGo1r5e@gOXpCqY-e`)>yMtDD!#FyX?SrBz)+pFnnhpByuF-Akh$8Ttz(o@k zLr{V7(y^fGoE|WDgMt-}9C{iIewGXk&-uNiAB*V%*976>q|( z_FFZR*5x;-N^t|Y*gSN7d%danU6Y#QU6Y%Bea?q?H-jX0eU~f#1K5qPW-Dv#_+@e% zDU>v1=xvSDHO1|3odW;cO;xlZ9<@z>%bQy1_2xPR#u4KW9f8zqDt;Y@uCU!d7?wI1 zX5u2$Q6>p;t0wI-d~o`h2bzx3c4O%Dv7I`H<2WbzOz@4?eZS=%mkDT_*Q&?6l1j9!RFBb!BCIuIhYRZ z56i$>Z>q1evoU0J)MP5*#FMs10k1IG7|qxVxcJ~dAGB?0guM=ZE*Jgq3}SnZp~{Ro z@77z4(KtffYaIAxHtj$mrBRUlD8y-kJyelvH7TP&^MrmU_D93F{;4yupX}=Xs_4;d zr@Z;5f2)2#{FHkV_#C zDA-D&FHi;J`0TZ=VHgu!UqM{oY?Q~#f($DjJowJp6p*bOu=XIv z=kAnS>3HBt6%_WOw~3H&Z6+N=+?bMHu(5SyBD24_O@Q~->*rs!C;n|trf;+Wwo8Ywih>{ zJyk?LgqfO&Tf;&1kt+6EhB!AtPbK!o3 zYwp||K3VGZWN+|Jy~DC;$|-tC^;dleIsZqi!hz$LWlIlg(=H!^ZXwrq!99!|d_ErY z_3ZNr_a?G(aL0*2i@a-r^zNLhR_3fbyToDl(&~AAk;TWuyOUi8L4nL zr3$t-xha=XN!B?8+c)yM92eYc@upgfyw-dQ_6>+cU@^fWF&@jsKv{-wf-kpaVoTn( zsTpc_<;S2p49a5W+~B|7MDez-^VZd@Shk|B7I1cG9o|4b7zkZ3(-k3M{m=2mg9&ab z*>Ztc*2p? z48B}SVK-rL<2A-J-#!Yrx2n^}Hex;SxC@2@Q~%zEkR(XXoIbW)-{HHijYLYuk1ukQuCK|j1SQC9p}407DHBq z^-o6Xk(Y{9(HfCXNP-)3Fpy4&yVR!sWQypE3o-enHuSd@y8nyjmCVBqz)oLD=D<$J z9+dB;9$F(;*#MQNB*;pTODR@ORvQa` zxol*C{s~)`2tg{#07~}sV z|4kX8H9leWvI)BUpN{%pF9ck3#xpmemx_N9iEzys$6tXznJ~UNvq58QFfoiIJ6e}5 zV3geMPlnRwA{E0R@HR25P#G{9m58r}{B;#*X|OsAiV?%NjYxsB8}SaxQY^ga9ZV6A zQD$^l#n1Gd!-2_&Vg7Jn(_D~fV*hOs{6d$*MYrJ)kYy5c+)DY;FoWpc$E=%!+2HtWo!ZnWIkVYjYq8l^b zj{9!5SDwat|D!86TF(%`JYV*NA&u zj4%24{f>+c>rAEEoWjqK&&^~M9wrYB&6w&$Pnp~X%8=rpDU7hi_!5I_9sQ6lTn9b5 zND4;1ECA*;zp!)zOL-qVH?bN)|3CArgQaq#JrhVY^_tw&;(>KB5=FfZ=8oQGf;PI1 zM76@km`Q>(cU;U?4}tGtO#ca9_q36r(LyBg`E24-_7Jo(J8`d-)xLuSZR-GsVa z&qPmN3}}|oJ#J94+1zCVRQS>QnP*JC(>)$%%|yP{IM)rDZ0?+Jpy#reUJTsn6y@5f zPR!HIHh$Rpz?~GBla@Wn%JvoP0T4Mg8@vK{nwPpDi5Cu>yb=ZZzY*C6pDB3y*i?O; z#GjE<>B<`-tch>T1H1%nT}ZP`28!NKpPeRtI$8bg%VtsiQM97RjtsQ0d@^~ z6?=_29Qe~^d3+c43zOm_WFMf<2r4OeYmCKbFxdj)F0&pL2-)E z;7fEG{06-Q-xrH*B{~h>sV>R^FLlx$%CuU3`w!6Cv3po8zJ3|wQ;FMK%{7DiY7Wz0 zS~Edrl=PfB!rn*1g|K?@f?12os>^51om;k`df}awmGc)YDl298ezrbq>z2VWcpUmV=V;#6FcF1rsvrU6yhc}XekUkNkW5!5lP&1&7QHG6wMjxNaR#RO# zrRDn{Id$l5_@evQkvr9k__8}yi~3j&UTypUx2P13vffO;+KMn?yD%c4 za-#s-oBIyM5e7}GH3gKP-Xl5C*J$yV9&7PG49U@5Q;JuP!m5bm`r=C$a>dK3DxLDo zV7?NKz;`2OCUV}Z=RA#j5C_Z1L%Bm=p7SWTv%1DGd&hcRE&e#9FV|X7(}I;Fuh;bQ zmu09aO-@%!r|ciB3G@i~Zq)Skzw0HXp9b_*idxfJrzA~G${RjmI9^g`FrM+>hto_d z`i2LET@tACN)EpC^s&D{8*UMBn8|ms+w=mA?zAhU^9~~VMxrG@f#pZw8AYvlKS0=N z0Iu;DGR-F940Fm9X@Bu8*LUSkmeWORY@%;MFL0hB7SCe4z6H)x6v26(f?FzLIM3d1 zfy3l*z8VXU*S+HY&~TYBdC!}XhbHZug91fk>paYOL7gmXqPbP5^*jt$&8CdY5pNs zDT@_}*R{r#c9obcy2M7>Ra2IK&}FHxMC7`@Et375cxAne(*qJECMEWG`c-k%dxPgo z(mn6#IihVW^xf;B@9LojCHt7TAabs>V*TgG`AiAWcliWvo2in~Im3b3-x1Kqgx*Cn9HlkW!vW*pmrrMO z&dSw5WSUk$_>>u~T?T1bb`M~nYlF_H$r?i-Rk)^)(R;v=`-I^myzGe;Y!2BSYZnd) zu-6^;(-clFH^ghiSZJ6;-LbdRdGsC{EgN^;qFD`5?lCYoL$vsxjF8w1qGP46>163M z`VoBtu>Tl|t~u8myES^d;T{ov+6_WK0u~@Ex zMVFtUS6_cDQ3(Aos zo%RHo?P$g6OYJ?9M#2GWA5qwQvNeUCF%&jN}X8-!|K9Q3hv7DSFHko-b*F1C{p86Oz;w>4_%roM| zuAoNDDr|jWL=@4%dRU)rYZBKwpaGdF0B32j8?5bOjl3{+oz0sH9$@B)U`bqWPwC7P z4=20IH}k$e(AtwUvMT{Fez!jEPkzEM1oy|Zr`dR?waL*|I?Huo=Q+(MGTSpwfrx8R z(^BGB?fu73=leEjK;l}MY0{B~{!*qX|d_}|EBRrq$`+k@{T-(Np1VGsZ)5$s8Z33sWiWHwv;V((er`7V!@g<4`udK!hwgrf7FpB z)s#P)BlsjOA`39}l4+Mgd)y)I{6woVq{My<`(s0+Kn^Y$Tp3IBm9a!$8TiG@SW4`J zYvbF&wINUe)>)G&sRyId+F^CUzO;Pg93)f}{}NaQf(!<1SG&#ZPR#6gO@YkR7@BGE zQm*fjP!wswO1T#J&?&vron)$)As04P!%CjtZsp`>a9#_x=kYs7LRj@u{Dv#rt)iSL zmr5}2As5RDSY3D}s8co*ywBE5Mp~}~item4ag|%W{llQK+W=e) zCYg-#rNG?7%gqYb0ka9j_z{`ZRBu#n(O7$GOadt7Ii_q!yJ)Sm@it82_#eO(p-13Z8b+HS}75a}LG+ zhLk;jJBgAFJ6YQ2$Q|(-^~s;2ga@ye@I2`jcY3Y`68XcTnQEY-L!bS6>{H}7B9TwS z;^gZtyg3{kw`?~~2czus-y6IX`2EwquITw?TJ-!@mCIt9m)vS@whAoS z+1-?thu7sQT996p`Pm};GkxIpSsaQys@U|8>vAr+Gdjd)QmNi+FgS2 z9J%A(`LMez6STu9D=x`(!6ktk)kAojvEGc6zz-ehm~L3YOc;aJ7g=#^4Q5eeJzIIX zrg%Bqk(ORdJSMi{oF=;?f6N{VtLvoBWTaK5N=JN#n?&9Z8Y#cfpL3g4ljtot?H4?4 z94NibikBnqsg5RV9Hs}&GFQGPr!7MS{8b#+0`DY z;~f33!$mspCr3?XgXI|p%hUZRPxqs|h4iyCti}>Oogq@*q~~r;@7MG)7Lslg9V~+k zmZAGmhVDlhylx9+s7)kNhOzxtd;f8ikz@PxSQDY(E^>x3Hs28~C13vk)2`vU#hy9P zh5t-5p~O_ZL}IucIC<@Pef(kB_h(HG(bWVyV;s>+0~U&C6% zxchG7;bS2#bDv($$d$x@7isU$swvkDJ7SMNY9a%0liG|=k2P|2nZ>w69(n7&BAIe< zJ^6E@m%W>$ADw29lx!{X>M|>ly|xwB+~eZC?%P<~S&L7tN;I?9x-$g5Ev{f$+%M3| zs>b=<6$aLpG)OCkwR0v*joe7&9NCWB{B`nY_1hT{M9sj;AQ0#iOxs^hP3mQ5Y> zpV9rt%B&s+pPM^V!_A!}JO=9}y>_bIyUsoV?D)}{LtC&2>jVSVx zuq#-cvda@ATU27j>$LJ#_>KAuy+Y!<%tp1>Y)p5=tXx2OExuzETA_sat zaM0Z&jqyA*8_&gR+bZI^B;)>G$ykb96#1LPYi2Y4y%*uqfh8gb&B|MlH8WuqK)`g*jz#XB) z2U)x_qw%e|dQ7r)Q7AsJAQbmtLMZ8pc$)$D8PYk2%nwP;RU!T-@u9e%Ot!&#_SQJO zZDrY-i@Fz}?wFMqtP4X1lqfzp45d!&N?>jAI;s?wk_lWjmdy(?*i1um4Zg<=UkbBjt7^zHvU_*INAV zy;qZJpkx3sc##Hr{8E(+%!0P~ufEB60qN`51L9NdP40E~K@*QXX|k+_S+t#wV*ymf zLK^H}a*~jTQaGucrbt=P=;OY;2O$O0Ua_}-5nRXnm*TffY6q4nefgSBLwsI1!Q&ob zyp$}+L>0RX@;Zr^>m(fg#s!ij$I1-fzZQ5kPNGC5T?wyTNi@sX0^N8$fcP!Qsi>p6 z+SC#YWSlh8V8%_zrOUJXn;8iB2;yeDm~bTu&QMJ_#2n`4aka0M{Lt6dEwzR0I0Y730$N3Kap)D~)G z0cNSYyq5Qs{9%;XG*Z%q#8uF3V})#TR{ z$Pgr}DXb~F9BBD~NRjrx%EgP|F2u0)VxSAn{i~~Tp2Z1Hw5nWzPR@%1#$@xPr^U5C zekbhh+O7tkJ0y-v_OSG5(QOVVx9zJRrDN8oY0}C&g2jcUT92tT*kiv#YxCyXeBxgB z@YqsFu(V0`Nw~evsJ1!NzERFMlg>Jh%`B(mzLPo9na8!l54&RMiAqRkfRvogdJJvx zm%&%cd~JkWuuiunxX0RvmKZSF8tJXRD{sUysg%IwfaL>auwQezn0PZzl&gXHhqx?^ zR?$g!i)fF9{3c%HZIuMo)b&PBiOrz=XOF=r_VV2h^4Xb-;cvpIWj`Tr-x`J2(Xx&} zbO2xLepn{4?(y=g+eM8oh;7-d0!J>@T$9>h=RHZ`REu&s@Z0wzV`}9h^JurWi9K#! zCfzbAjum9&u^S-&!P_}`pDNf%_c{W5Vs=<3v#Y9P?^2ESmsFGe7pmF5-_r)G)swa1 z+K-HpRrB{3gfUn(Q-)T}XD=8ak8POh6OXFI1b$Xri^R*3lj_G|-Ya5;sIyEwSLzlG z4W-&JBi~zWY185}HJapFBf4Cd1GR%KK1N!^;b;w$l1Ou-JWGjImhzIyS>oNl0Ntib z6)gKz(b6i#`U*8ecQFw#UI$cz#US>rKA^9c1EA^9V8tZ#!crQnoU~sxS=t{ypqedZ z?tN;MC0mA-NQ;R6$5=pXP-86yjKVMrL3kW$uviYL@fNBr!h3BAs4dZ=NbO=(EL&;d zuuW1Vjix%|<*!RWbuHM4xqhE0HCi4Z#565gTWXB#lqD~Sc?m7!sm+tx; zuBUa^U*UREcYOladfoL0xD?%WGGy2JJFlh4>C6&We6Xe8yV9!hJ0|wlI>-RrIA_-r zVW8y!LPpz&gPxsVS#=j~BH)(S6^^rA3e12t{t=o_&&TaZ=&ehS99rza7QZ;h?EsHFwZ-2#%k2bL%m2&SYoa(s`aR>Ew)n5iX1`G`Z=Rv=pPxe~ zG7774(qquAAZm7TF>H`r2`nC80?y25n%7o?uM1okS7Yux58UjfA#p714jKmp(P!x4 z)XFT#TB#LTL~irTE&Rbn$@bYqYc?2fRqBL+lkox(T-m18|4Xj2>$yq>bG;kM1v~gJ z>QY1%M?WHxJc4d9!;aASrnFl1PnGM^Yt&CF4~#eX3VYN^9`(cz_DrHk z|M6X*r;cGaT=!VwM%-FkuI$0L(Z*64d}DeeHG+dz$?EHNC>xZ#BdI7kpOws^WQ_P= z$?@3Niz*}K?$yf`P;L#%6Y)A{Exyat3zcl-yPX#Tzx)rTgIB`F9HDH~FQ8`{8E1;_ zu=egC!+8TKMVQgXe)oH8@hh%&I#`d74Em1i-}xAm4}-q^)c`#tG)66QAaFUlbmjOz=^-)Gq}3)=%3s=1I2xK(}` zRu4|(pU69ri*cPqDj2WdP3!0go6{KSWprTkq_#S`!4L9_3P)d=16 z#2;>i<|{p}Cx|B64VqvTH7F0W`-zq4r80|aUuzFP!OD0q7jl55T$7=xC-05?8uaQs zU5&mFVDydX+Zy!ey_^#T(U3c4JEo_=A@}5@I(Tr?`TixCacB$mByLFB!1C52htW11 z?~m7^3>kT!NiRNJLAtCC**AssFPTCr(C?mL`aW;4ped7SskQfajmL=Kg{c-k?AEk2bC%JXBw0ktxYc_3H(aa9ZV_8gUX#u1qGAbX< zjEa9OtBW%2A7PWY>0)41C4pqdmkSw9Owyvy;F_XLw(ZT_lU1iqt4QDIQE#tUP@3Lf znI5I>9-rF32w%q8VA2=w(A^Vof0QipEfU={PD+roC2^nvZSm4iH?`6ONON|oe;VUT zv{-)zNgoM0F9sIgX|S;tTnywc>ZU)9Pe&h^G(#q>8&eBPZSf?7EMjN5V3pG~lW#EK zUeVrYXs8K_b^tVgidjMX%e6l=tUm#()NLRSNCy#FKMl5-xeA0x^h zXHg^5F$Sk2#XgfXh$x}0aR)|eM|TBr2YK+Rijlk6bf2pw$XODWwanbt%NI^f>!Q~J zQ_UQek4__e_cU@X&}?O4SxIBm^-BzLrn+&-0ad}D4}UHAYhAM3c{LFCaP1iIfpD+a z`!HiI`oN(MUnAEb2aQFnKHwarB}go|y4YzCDeBdX7KN5-yuEe`qeB}9KEe&A$utW# zX-xwsk6TF;kauyWd7HVE$i8Laz(82>{{ktbfs<`k;!TwSH%(M*HBpyl&a}@KFeojf z5@km5$Bp9sCR3wrmKkqa9G?vthl;ZZ9PM1XgG)IDa%bf1nCi+x43-7`h4ST@2^4(yMd?MJBJ>Kkd zrL4R(rzhBBdU8&VS(#IA)`C5x(mY1s`!NIBGeQRLbQv2W^TFve;RQ3uAV$Xh0W)Ov z`Z0P)S&m*`4OljSlQtUZF`{ct9L6idm5h3~WP6cz=>3u+IulaicA04sLJlGvZH~$@ z=bG}2`BK3evE_L?;U=qxMj`HZ;dExzlkTPBz>^i_q`ljVnaZTxz+><&f{j|2X)=vB zL7qH?SB7bc4x^Gdm+_G1Pc<}f6ycLDSY0NpI2hTqnk{llPI4{}ibhi^OgDP8eJlvWN7pE$g!5najYL^AQ5C?O@C#c%>ys)vU zp1Pj*l*Q3+IUi0jfV%SJ=0$0XR$jA;?nU_v(@Nmt&Txby!Wm+Ea&u1M9yzywlXLS6 zOnu#P7YoeK9GVK=Q$)6l^lgtf6Q6uFu=PEoS<1N@Xn)UvwFde#USr) zR&zr~?_cS5N;>c3IJAe%S3=xk80XB^>kBt%vP>Tl7jZ;C-Yexm`_7$ zw(oB>^m`LH%_j2$_atDY3@pMg`eKV6md|CH*>Be6E|>C&m|(XcQf`x^XfTb7g=2vtTq~4WZ*HxriMh@@XgVn=Lm4kf4j7K z9H@c`@_iwpIyw|xJr{o(#qaX-fsO~~hRAZmnSUJo^mZD$XYm~&!}79F^rT^-mk?Pf5N9O# z6R7v$$V|}gmayb1@7_$dG(NCt@;r0HmfpW+H&C;UymIFHTJb*+MZ4%2A>Q;_%JH{2 zW18eNm0cHw>_+}79>M9&0K#W@G|6ixf4<$ zs6##ACGf(*{AdC6OO24-^Y{$V$s&5lF;+>5K2?60!v22wVTFkJC0wiZLf{W;BQLl! z$<2=*VWGqy;xb3GRK))*$MO*W!_a;dPr=S02VAC*?@0VWC8N0~h=rWMANzM{@Eh@2 zh=Vif??{u*F9%&H+fMwia^&f`1a1@Yhq-a6hlphNCtR1T<8pW}y?ob6_mG?JGMu5r zvRORC6VuYljIOgh#5gJ^FUo)>T!dAQWm z+CyQ4TRsx2P_+Q}Koy?84?r!AFfX+IUlq6GJi%H zR@n^xx!Z0shz6HI`gSL*DTwiuldyWa$mYaM!JAl^keRS@vo$G0^d?QVWLV(V21i@* z-(@u56vud>rRR4NEj!h_wo4zQY}E2JA$mDNy5JQG_;gkdm&SRyd@(HvZi3rfWZo2i zj!{5KIF(V-Hz>)G>RTHbdq*zwo8{)tudW&T4?a9yGx*Z9R;L3Lt{P$yeR4~NhkeuB zM8sZ2Ydp&4`~s|xGvs0#2YerEB!B0P^)hj1q#U%)V%f}Rc?L(4FKX^A2_qD3KwgZS z;9NL3vO=EdyfLz3p22xzObvNlUUO%67-Nl5D{~sWWqH)eMye!L@RsDdQd!SQ_qgl5 z{k6o#Ez(;yZg!_UIBxbl=4UT8qcpT*XeCt*jz(l1Jv_J)UHK(xH`a9tR#kK7$}oS1 z9wESOc6%M>bjSHstnLZd>)xo>9qA>jOH8X>8(A-6zRMO_zmXkKhCXf@TsN#or?kz+ z$n4U*l04Em4?SRe4P%8};Y>HnpW*eX$Vzk;q@{nZZ5~{SX$6jgcBjE7X^bn0*Ex&~ zdVIL^{|4TyTkD4u8N=9a)Rpe&(;gaZS$dA$aieAS97m2>o^88%CySXkS|Sz-gVqM=c6NmTq(4HJ zuLPd>dlbD8Fy3LN%qj^=nH@J>Ow z**itRVNprd#8|g2NH{$y*{!4=L?8INhr;RqtaErt*^G1|Sc;Y|Clg@wV z;RduWVPC-2U-6ticb3#H=<<-I7Qm$gXGOS%14>Ni(O)zR&(HHotQ5e}pYxH~wx>mM z*z?oVB016lH`7=S9d0VRi$TpczSbdPgh=OR-Xf1czyG;Qb@~7!JcNo|-$x7kjvdIX zgL_{Zpa$X%JBV^sTY;D6>Uhm<1}yq6ki0FL`ssIpgl&;E4J;NA!d(VgANz2Oz^su@jzy(0LnyfsjsvrXA7?kVTb_2@&W}D|a zWb+gOGvxqp&>MSJq<(u*jWfa%>f;{MN2(U1V6HeL8d-o~pSI zoW0onG(Gi8Yxw-xn5uoD<&4(H z+^nAtH7hN0uJyaX&$qJjp3=)3TCex%^`rd3zSrpfBWWkWbl$J8KVCkP&qk50^hLtq zv}g3t!}%8i|NJ=%_nZ7{{bthnD#m7|Uc-tX)G$@pYl@V=cda1rHM2Z`WqLg?r$u`F zvR(tLv$^xawFm@Bbneq3NMc@+bH9$+CFPA8g!N+jemzbs5YqSQ&_yU1W)pPClj~6R zxZIo^$1{3dPEMB`#+&SR30q8u;bg(WX4&F7 zvf*(66j2KYxZgmR2zOygW7L^Fzc%8wYxK>~qV#lKX!S2T@RHDcuEQSm5k4g<9@uHB zWwRrzCAF$CvwS$_QNsx2q&pt2Y8(bEh53rpp4spaMuEAj(!ScT4zyJ=KsQb&#Veob zBJ(Bf6scXG7ak>2DM6y`^C+C)eYi@+H`#_Z87__Ib?`ydZP z1s*W!(2qK_N)XSW90?ANj3z|X=&UM)N)+(Nl8p57mI@wF8G zizo4Y9oYQN?$7xINut6R+Y!Rvpzo%;sZ$aLj$bMzL06PK-SmCn%dZkd$ePG59aj-X zGrN-}a0LaM2|6Pt&}2X(xL8Uw7YDp#Ud>3)NmJzpZ(~%eSStB0l|Vy+{voY>ra_nT zWb#)cc(bggD}mi6FMSBB4X-=*ZMhH*3j}h zWIDdYGF%#2M>%&XG})#2f4=p*j&Ucpk}T0YEYa#9fUTIl==-bcHR$gx;W0;s{<&xgU{ikuzA9~p%x?P_%w+MJ*`NxTP1@Ee zKJ+2sH?cHUY0_@o<^Q>*RBK)?cHA2@VBNM6e*F0H1&yhj2FItsr#`!+RXw<* zs`0Ch3mYRNxo>0QypsGVV8sT#9SgG-WL0H(X)I>2bIVDZDTq1_&v>t*_FZ5?`|9g+ z9hv7HTQW8Y`b^i%WN<1n({AZR}JK^>kXW|SQ!t{Rz1kE z=KJ&U%`N2mv+>O-BK>n&Ja}pqEPkrkUy5)3ZCpQP@zdnY?CJczGljXg^ZGg!_I+9C zGzqt)^X&qUdkNzqamv*HAZMDd8A+k-tB$xo`bf;M zVKEkKk~L=ZE%wy(n3$NXaWNBPa)4WB*zE2!oXQ;G3EqS_lR!9vQ@T4r9D!dM_6ub> z$<`$&urN~``?bX27mp*smiD=g5_8)H{3@^^#i(a{Op+X#f5*(zppsq*?=~BVv6sd@ zVOIP{(AUdP@q==;^lxD+{;Id%}F5O(a~eYsPMK zj(4~DF;gjS=CHSmSIbF%7xwv5$VRZUi)+YD>*{GCvPLY~`8xG|V5KshTuPDT3xP>b zziNL9pSj2KvOF$v{OKe4Ms{O49~kp9hrsKt zfOd$gTIdmlaMQUd+*Iy1huUP}CgW7r$4l`qA*z(@VN~A4%}+n zj50Sc9$|uPaJw|lX2%=yMp^>7xAQwMX+~S7IZ<}@7x|`ZCfT%uabUCHhU|QhU`K6$ z-iHW1HpPFgO`%T6?ds2eGI{g#ZjWSf^of}@!cli zcKu-+gZwWFv3j2l9#zPTOfF-5g2&UqgTvM`?NBejx^==#jbFVQuJ`e`0x5)+v=i-W z(fT%Z%6gyrbkQPLi>lTayAsM(d{3qN#&G4nDW5yr$Cj11Pu=5C#@Wl2+c@wm+cJ{M z+a~YL?47WnymvZi;5JMtM)uU91SZqzpWGIOBSP_i*BTE$yCr_zYJrPr2~V64ym#mi zrjHyg6YF~7C*`Q5zP87bnXQWTi)Kr(7_H6$O@EA{-95=O+o#=~DQPY7yj&7=6)vpJ zp3Q4LqKY;r&K6`r>*4mH?YXYL+|TnK&+(zv4i{#$UKvyAQl=QreESzG-#WI$)jG9h zoX2%xW6Nz~KgA4`Zd`U;EL?WnQ22P^@d>rAJe5c?cQcUk?AeCRj@Yrpf&4>Q_Ig2Mqa}R(q>gu3o+z z_VM)iCimK=>jB6!apI(#|F2q6Tf4IEL1-dR8d{;(9jL6aW>xLP8UoJR$H~w%(Dy2P zossCfH8<0P6P}1kVxB0v?iW2`u~^_Ln|*h@gcH@_k~Gl)(%wODq8n$d&uqk5=%tJo zXQWKatB5N8eI!O-^|7)B-}F|aB0%P3f(9vn9u<{5eX^*UV7W{2!zw}#CwxpM4vGV;E z_<$4ZrLuC8(>;0#T$`QXF1Iha((e&=xc`8=y!R~QMK4LI}N&M!5S z8TXo(`-hdxCNif9BZPy~qB-PA#BLEr@EB7M-ZkeB9vn6x@C`)M$QDR;IpA0PYlYPU z!-xk2JLMEXbCU=bX#yr~g6y7jREb+Y=8azC%&MFPxkfaf>%L697}H16m<}d6`eGd3 zb2z$u4CrPvYNnJN{+1I)KqGbv%w@11QY$PGzm^gO%|4AXNm*m}>v4={jaMCIL00^E zt&k4Jt5$3$t)(g0OA}3O{cA^FjAMB1$s?ruX>+{%U0~Nld;dY4_YfGB1UV71&I?GU z#P@X)+_b28GGlu*IqUPfD&+byN!@);JQy56XZ*QPhMhugZ;rHeE+Lx z8xITSkl2B%`0!=ObsW$6+X(H*N5 zPgOlh8e+6!G#D1(5&8g9&qQh~c3xJ)Gthwq?3cEW?oP#`X=C0CfN$OZbnQrRrcPy&4 zBbLUiqdFK(g@b1Q`M^_8FbTI)uwN1J?|FhW;1x|`)WYP{u}2VU*?K;(6`@fGO}3so z)-o8jNe?R_F$jBLFl?P3R;=eX?uggWm*&B~JczzjL)ve3lvD@E*PyQxvu40LdGT5} zd;lW}JCl7KSJ}ITKFr8VQ3}HDhE)N~N&N=G)+w6{wr<%M_)snT;!V*S7(>85Ws)$- zGN}hn)N6O(6&iu;z$thjlQ=#VbQOmgzYN zF&xZ}eolzdA*})0%CR(h0N5Of(ss&i)~NnzfccEd`{X8$I&{c?6fd-j!C&WDZBg4| zOMjg=`z(Xf!iZR97$o{Ckv_^6)pBKKBpi3O`c~_3`DpB~bI*5JdW8Xo*|rlYmIw9; z49N_cw=6GZFct_Otmi@ zG-sQBf5ird$Dcm-PrXFrApU;-FGL?(4s@SsMx4OF;I9R~5xvyZ-7PBq*k)K$yC9pn z0Xt$0P69qi9clBwFhkC5^FKF3&ht?@watHWhV1m=R>0=TG;n1TD0Ti5Ghlu4spr*i z^VwS1v(et4k9ig`e|CLMaDBIb8xGf+g#m(oo&yYQ@n85A!#?pE>m`M@_~n-q(Jt_| za>;;4}*r++fSz2e&-SgvM~z1 z=8s&^PaMc+w;dfz`JKyYCIdzApM*TfG<=Qb4_zbCGYa?bT_$;o`3=)iGn-4(4zqRy zr}}8(a$F4*{KWwKWVyIWW&efUe%5SOKv@{VEUW+J%?JB^s9!&bw=ctyr2_=mvl_Uk zmE9~^zpnio$+w@v-R^2YIc9(!C-{Qh zrKO-6$)`4(2mDAUP7)5;p*1o$vu%SbIM+rSU5%xUu8pl5_<3y`OB&PW1vi$=0~c{F z5qHzp@d&k`W~vG`{~d=s`@W4HOnT9cGIQ{9e1ACLPV3bY*PL-Vvayb zTjcu`jp~T11-}ICnyvQ>Zzoi}mV28`(eJ~NR1qkMm_>NoCdlb+5q0d?4CwhK;`{$t`x5Y|s=M!V*SV8S$YdWjXC`~tvXBr~xtSy+2uL(2ptjsh z5(p5Ikg$oA+)2U?bx>QhwVB}p8boVQkha>Fn@pm(RKTU1wjxLjiVYP+QA57pxf8&? z?e{+K^F1G$`Q3ZYx#yn!{?GsXmk$C2H30#M`UiEc2j>ypUC~WA2Bu+03#?O%KjAI>JBMK*u|s2~Aknj($jbim@sX$k~%VToKAi zT>h;|rfEOhP=_zn4|oCC$=%wW;pGjK6F}b;><9EeEZI?h#NiFWd_{#|??7qb;5zz~ z4})(R@a_3F*?2QtW#dgpH>h~i&3Of#o?E*@KZkjM{({eDqb0#*cnCg|;6Zfb243sR z=9`396VRS?om0IrSiPovjWhlYjCLa1Eitp0=Fet<^$ z%(6+84C!LhCWjI=TBmwx9mNmZC@*NhxAIyF!eM1I)v8ch|I&tjU)+a7k*2fQ3tzTd zzjlw7TvXbUj{grIWMpMDtH3tnHOUps30nO;tWJI}K`xK-ZdC6S)HygGZ`OO&(iN5U z4yr2+i*V(utEpBrh(SsquN-8&(0+}RiD83rJwx{^k@}MHuoX5PJ19oUq}F~S6h$t} z@t|FQL@14M2Imef-nU<>wx5Bo#}@DFFV)&%j*EJOtaz}dY{k-YN6?{$VZy0yQF(nO z-n_`Ydhuc~e9|a?0q+^13vKISg=L&B6T!x}sj-}&PsbU-Z0IV*vP!(4Nmr8SJXS#Y zyu#2C^jpS(69R&LDKwj61x3h?Qg~-!*a3}k@L620Foo)duy|g8&JT0~=c(QVLeCCp zEx+=eodwlCjL44$==0Ia7Bi=`OlB~*IGbQ2^u2x(E~$KR%f#kM%@e-zy*^7c$76@7 z#uEBQKWmzocvrl$&1UCtogpQ*{n_bgTNM>)akjO@YHe>hgIYwfve;zlgst$R=6%;w zsGPaFZy*KIAG%4g;oFaGo41o-XMwSiyqHnejE_{-fjh7+Yh}(#^P23H6Y6tUPF^`h z^{UuU(l&>+E^qWp%iw|Ue`@Q7a(o|ewsdgb#>v6{+)ik_J9N{o5PcQ&N?_Z!$bW#O zQ>iX^<$@NLUt=Uz(fp=dMTXW4zWBc!pwEQrQ5XZ|IkX(vD95RzKOXG+H;*>h-DR*f zXmsvihX)Hmy_8b3UH^;n-bhMEhR6GQ62?1vY2SbYd{7bnzL=QM`mh#aj1`XdhM${` zx?q>4BAi7yXG7mjXE9zq=mi12!J=>O3gZx(lf~oLm7R=V&{PAIM{vSva9QOUdeQVA zco_?x*9;#)+O7;Gszv86;-gA3C6_LSyDre{Cr5nid#;supzp4fDQp!74d8H48Pvby zjeFBZ#qK~3KYSYYu3Rv4q!)xcF%rdN>tYqynHZ|e_@)l{jt?ki`o18yZ6rx)+klas zgnBvA#&@E%haOd=m3BHqq+=UmJrZo2hx1KQvx}hr;M|b6M)fkGG>=fdNn#YoJuG+- z{l0GowqWE2$IUlK6si7ynxmC94RDz-IB+OKt$aD{I;?DMTVsFCMeBK{sAD^0vo(Uf ztOPy_(I4}_Xv;>dcx+Wvg~Vfo3w;+u7*c8G+O|e<;Gi&l-{aniI~KhsDeN*{m*n6) zLx05ao^TyDq6QT34+#4E<$l_;bX9Qpx%2_w4Cr%`$0N`Gt}6^a-KyKeNa%U?Xc&CD z?f-2UF`s|q^)M1~tR>cZ%mzIGFYL+J!*X+mcxnXfBpq$%|C zVX!WFYNA~MKfeU4<81bP{qZp3b~%RJ$X`A@hrKj%sa^N;b8mCs2rW4L3Cr2eTT1L9 z$Nud6qpM;FkF#M0xer0^U4EuE9VO89@U@P%X!}+9jOAmwH_VSZjiaT5FLd%aEp^Od zT5374C_Pq&x5bV8k>8Pm!!JW=U^KIzh>VNT`58>}z+C1&rV^r*4>6mW-OQ8B)65IZ z@0k<8>e>^b&R_H(w6z07{ie#Z{59B1M}xo|Fui{pmF1bqUR!j0zAx$#^s zH-($d<#R>cEN(7W%FXBQ=N570+!Ag%xOxrTTJ9mPk!$9*a67n%xktG@+%GvFq@<38m+$M@qh_ciw&H^6bci4Wz&`6xb) zAI{tP1U`iy&8LH#o6Aq(r}O!I5kHHc%a`)=`TO}rd==lozl1~U1hj7Rz~+H2{xyCq z^D2>q2@He<@D=cz^UXYLBV=o191(UEeTTi^S^=XvZt51CPE)X zXtELd?XQAmxC5az2u(FY`vya2A+#K!la0_%2192fbOAywM(AG#L+2oL4nm(2Y2Dr) z480SfE`+uip@G5Bxd_cg=sQN}Zw5n45IP2-&l;i64Tj!@P$xp~HA1z)(7O>Di_pi7 z&^?2pr3ek>r1p706Yw4&2fPK2C2$IG4{$2*QQ$P-!@%2tJAl)HTYxgK8JGub1iF9^0rP=tfj0os9&0*3=11I7V=28;s!92gGV0}KT| z4m1Iu0CK=z00)TF{!8F@z$bxU1Ahg)3~UAV0e!&Ffqvkpz`ek8Kn?g2a3Amk;C|qr zfCqr@0-pk&1U?OX6W9iP4R{b306qge4m<>W8Tc&l81OmZi@;w4p9eko%4e+z zuFEV!G=zYQr%3G#>+w3V(}I*p>mG!9yf48Qdx2>tDAQhjLs79oq2Hq38H0L{lM3KN zzThVH{x;4|en`D%tTX)!^`5#eNWK5?>1eYFr(R{S=qR;wY`-t`+Z3Y|^H2)<-TUJ& zg5@PB?;WU#2%JH(@hx0$r{#42kLBczau#8iVJf<{%UJ*4%K72ie=X;GYlG$dm#2SF zP9Ehv1|Gu*y9(=CFrZ8-tCuduR*Y1`c05HKdDl>c6Ou|Av2<||D{Cr@gh3Ckgdo&- zV(H>w!a5j7Sy4tvWlhjS!VPD>gVy~?#nJ{NqH-PVIa7br#ycw4!Ho}fJcsNln}GVN zpnFAl;aNdXItW<|*KE~rBUQQ1L3fWe;9K0V1Q_(qHg;?ce0G+vqAsQvQ{O2Dp9p)Y zI!RK*W7rX@qFyP1zA~})7MWLLV0FvT`nHux#Lt)peBEEWr3NY0&qA`q#KXt7`h~s( z{K21ITW2Opl{pnVuT<D z)%=H8_lThhL6-b8}Dbkml{v`$Kk)DVY;c8UJ6xfvsrW&!F${PjC-He=6 zf0W&URI`*>s8ja>0lJANNaG{*1EK1WZhF0aDCMK+6Gh}??kI+avtV;7r_sK}B*bIu zK--~}%j9};4*ru!dp6IstAtfnDgC|+ABD=H9-K}q?}laIt>6%xOt7G2_U!6wHk|xo ztUTL0B<%S^40#3%pE=V6?e*+KR+4ilnq(cakxXc>ixVxAEK@8~Et6l7u``HD)4lG1H4DcxJ6x;CNDt=3So75-X6?Ztsbxm7OP zM$vu(mdJV^s&b`n^k|H7jsNF1z7w7dn7xD}9`YvwR>e*_z6+Vpcv1OC7Pl{~YSzHF z_c%JN#}Zpt{ZCC1NruZjU_eZHBEt8 zrqT^rbJ#iV1Eh9{{c;$OXK6}V&&Lz&y8RlrZZ5twvF^s!g9GCB7-jRUZcF#paM}tX z7E2U)`T%LX@yFShARlUDeE9ZvDny*jKRiI=YV0@a{u;Sa_sl9^Djq2;`?EZY-^-pry6X+u)i5`!z;sY0CVYDQU?EOB;^)0Dq&jtR0pP zlojVO|6^G<7-chBVlR?|6JkAnlAS2#>k~lR8E*%S?JFnIG2g>-y(tu1;|nGW8gV zQP6*bE%*(F#qSM<#c%wA^MAt@{OnH3Eel#;==VL>Lz3|Y{zn~VjqjiI_wYZk`;KDZ zt00(@8bx`5lq*eV*3WtvC*-K&SIJ-dLVr(ZW6M8Fc~;2^i{}VrGj5lM#!)H5=7SHA zp>n!Ry&7%Q$SX*@Mi$h;qcpSNc;}6|v~?W_fpY5V9p|CJ>%nynvP%;}AkC9h5t5aY6Jnf11zYXg z^R(4UdD?1quh3SzaLLUR^cq^Nt!1#!T8utxG5QR@=(Af^+7}qTM$ZEFa?CP8rza5x zm&8xP1vNp36znpCw$M!zd7B$_1PlLQdoNc=9G*$>gK3173R3YYIQPa^+k_C43P}@R z@8uuzm`!Rr!nm(QJVnnEMA*Ec9Bal8EjTq?r<@|nv1Y)rE&<1y&7~Y`Ha9O@1Pwz| z;?24AEQEd?RJ@sm2Fgp9Bb9iAk4+_@&C6`EXrvYQeLt6;ay)XS>JF1E>6>w`u-iDF zd+tgdPCzLS$j=GOM4Thj8dJ_PgR>XLV?`<3uTV}?kR$u$m&REN(mVXH=4zBhu%Qnr z|2@47@0fRaz*m16QsC{#Ns0buqOQU_2v3A76M3kLw-YO_5@m)h0~Y8syaM%+v;UcM zshOklwbAY`VeewonnLJ_p10ixZ7Ik4L0>C0A0_4r&*u@EQ_PhDKHtHXjl9x=kdarq zaA&>32oVIoNl^~l6{awP;I|TlnVfMg=Zu<9{%IjM-tx6x2^tj!0j32H@!;}HvGhdRnQ^OvVMuCS#eL$QVM(yvn*uM2$+wh@jK0la>Avmqx-^rRxhf1Og+U3yVlxEm2=5`i6 zaG+BPzc+;2?s(vtPR_*kD50bzwC4f*9_VDl7ls_@3=O|8#JnTC%It})VqLH=Z`#(g zAeva4=x?fdXJ~Ph`v9Ibo=Vk_epE<~9I|uhf)LM;1^JMYH&WX2@nkc7#>Q{iF)eMj=oIAH!KB<_ zg0ujS`PV@hH3TO)SA9D+hudj6sQu(~kQ=L$G5Q&{J((n8h5YibW$_NJ0`G$l<#DQa z)?9difR~P99p%9}afAe`nUZ3+DQ!RoPyFNyC7v9rK*bnF%%r5Yi8g0jwyo?)0TDFWR!N$?kz3kOrm}dxuLL%%7>}g{ zHvcx*NMq}ASWVXOuEy4<1`;6Q-`MINcmfiT%d6^Z7FDfX1b^&{Z~*H_rT*Q^YiqHu zqAu5Pk%lqUg3i&*Klly_)eRYX7$RP$c0X%f+OSRA*ZSPPD4* zP2Sfx*Cj+KdyxZd+ASbPX<#d9ZQXdtr|I?a#Pj!A^h|96xWw|XIGJyoIIP+G=G-YHf_Sfa0 z4W56(qggWUg5c}`aTs!^H)6DZiJ=}Uo=%|>xCfIXmE8550xLJusg737imMwYt>4^b z%7qleE{hH+Bvq9`Kbed_*VjA0(?w;Ayf3*<-kY@N9#$*3ySyM18f6bh#qPM;NpKHu zl=D=SCeWCO@k_t-h9oLve}-Yi#KJ?_eY@-8>z&Fy#B&wx09)k^4)Q!F^%Z0@WMO;n zb-OZCbIFT-^6_z*y(IVhZhI?K8PdnX0I%5?%fBXH$nV1MG!HHN1BCCpoWqc4T{dm@ z^NTEf67G(`3rR%ZyxSS_j@8;1i6_58Uhi5%6j7ak9?d{Vp+9u`f!U*MP5vSCXTY*b z2&9QuG5CHwT<8y3Vig0h6su~Y+!ZKD5Am2~_SoyZ$!_*^VK%KG?6Eibc(F4u8)RLS zFCQ{Ng*6`UX%o&Le8aZ$Cq>U`o$5MxyjQW~=Jg}{27E4m=oZ(7fdN8VY(2*>kr;T_ z7WAIupAoBF@0cA2n}4{2YMH&MCK&S}!`XX|gC}a_bQ(Dcy6M}D>>MIwWJa2C8DyXC+}TIQM1 z747$}cypwC_>MLyZkqAbI0!Z`^kmvHYOb-fe^>P|0DM&RgAmwe|l2I zk5ZEw(vlir>abwW%*pwM`HqUpHA~AYLDfvAHcKZgfbp#S=u327FySB!$2F#P% z`X8p5Hu%pmZ*Ixl*>j5)I&OsA%I8Li+6G|FELYAzVAF}=GsSuQC^m+QEXY2kxG-RA#+f%z)Vcr z`%b}ni5^U;dJBwn^>P)-tyr_mqSA0pwv?;hH498cTq44nRWeR#r^%N1zr=BgTTqYt z<2ws&qLBWg?k2m;fTpDkCUg#Mc6fogmR4jiJD67 z1QM~|%|9cb25pRbZ&AHh=9{*soVp-Wshk_>RPSHrdyO=ZN}c}>+Odnr+O(GXH=?y1 zq6SlT$|ZUU@?ZvQdQ~6Aq5Sfj{EeJwOTIXm*HX0LbMqAlg%zyT&}R_JH_C-v4B4Qg z^J(jTa;mZQ<$*TnY+K~T&}&l?vDY)c6~80Yf{WBy86QLUeW@lrk5nDiiJD~cm_Yfk z9v*gP4w4XsY^&6VD7%usaJ`qrd+yUuJI$b|OdTf3=)E%0Z+?MQbO#f5>KNPCYkp0JJ|iL z*=mMd%lnD%CUBmZdFS*Qb`J7-@1Qh8^i$)ggbJt4uHsY^-gO$Y>gQ*%Z^4{-FX6rH zzvPrBV1TQMvO8H#qTh+76TqoWy0iTiGOTHDepv$OIaMx>M}708DYm7_F$!8^+fcnZ zIWsXE<%lZDN7}fiZ}W%P-^F+Nj|}ufiAyhD)bFc0At>)>F0>1Z!S_oYZgW8TM#=j4 z_@9|2<7v7rQ-di>Pi#tJ6#;%xo0Ex>kwf#0Z0et1C#P~CUhu|9Jp>k|G*`kHNV#;- zx?l5+U8N@7fs{j=uH?JpX{wn>wJZ5K7wbvyEJu5c={W7AEj;%#+QMN*3wx5A(87CN z5mI6TZQ}}Ke$kdZz2&`8Jk~ARPLL6w_wG0jbQz1*qjoH5=-0l=kFECiM++V+a%R+b z^-%l!Y1FoGus5#x&NaB>ZYHXc8K<$6m)z+`VhZ8oz*E$Bz8!8-Si=k2)JSxD_ zZ`cX1r_OL!K@-qn_#1`Hcx}xX$C6qjq!#*6WfhRGZo}UBS`7SxSVKUgD|C-y+07G$ z?Jby7kiQT2yRvulCTvI8-u$9GvQLH&4_zljY4WPsEI&jxQZHkB=aiJr9D*47OhY!u zhZ!*(VhZNmTNpMNvpAdKp*Ms4XXNG2V3zIXErT%&kz44^+zLwb2v$}jx7o;zT8{C^ z+_HK(1ffB%mDhZ=PLpcYy~fIa&DZOsSG4C|F|Mxp{+1AenSH<_Y&E|LjSDHnGQ=7g z9cvplf>&bU3I@%oy!!Vrv(V9xZd4_H1Z1UU!Wa6O_~&$3Mz@x%RUyW4UIqnH`UnWbC zBR<626O8AbTsizk)tB8pbM|D%-9aH{+Pj5wOCjW1yTVadUrW`S7J+nHRJ$00ZA+`G z8y1z9)vbcK8yzRl;w!kY{bIjWi&hwIVkNJQQS(GbExN1e=tSWKYnHhC=xkGn;p-_6 zywH;=-5oQ+_gVa%!WRBeF^O>JiA|8APj_)UBDxto9rO!T$e%raH_M23DFG=){0c2` z;4w<=;xx0Ju%Sx7FZE)$ebb;9sk6uLW1Wg1wiw^9^GN;E$7WH>SdVs-Vm-9+r||2s zU@fom-Sm`nMqu_@^Re0XS8KlL6qg9Z@m2(w8Q1lnVFw(7vC!ll_P9V25XvF6sAqi< zsWR=t7XmiC%8WZNs0-0Z`OzN8oGTG;34|xEo^>>($5iY;x}iw*MlQD5P4GtUw~!st zokPT6&6=gN$7izzMm|pHDsGaSoe5$&-kSYbSD-MrqoXkQKqr3^)|FDc1~^5;l3KSN71mTczBIQnDx|i&C0)#p=QGbyi|r z?}+b~#JI(Q!IsT~~p36QWa#|K+Gh66ztK z9y7FpN^zG++d8)l*YuQ8G*XR19XQm1qb;q?s1!Y7v3m3Y6YNG*7Jx>GcsLQ`FPqPk z80;lq-$O8#;DyKYs%s&nMaEFNmHNI~yb?>_w4`+o z8-A7?ssC^Jru}QaD=<-^u1Pf#{=Z}m-5?1%jl)3WN(Rjo$!v?C4Jyh6+NeWf?HyPn zuldrmL^%bJgbiA41huz+Npp>%hsv4Vd{IuE0@U{sE^8}ZYS#*M}5J0Mt9KA zuYDHcixU2_kF^RcJT&oyghkork&Sb!M7#^CDV(?g37HxslkKN zS@pI6y{Eau&Y4FD@W&Pj;L7)%Mqk{>YuU}b$kO*yPo>?R?8cVhRta9am-eg2d&Wa| z43uw^np9npHo2i}4gHw7E6d9;CW9Mv&>!XQ$(1XXu37{!{JPbv24$uv({B#O^Z)f( zSjbuhBL>0elNxTw=qJ^U!MogJlGZIwbI{Ki?&y3wz`@gH9CVOClN245S<&v7zw1xO#R;N#^Y$y6xM%8Hg?;BR2TgvxPcNimC)YC1awnuk>z`;Bj8_6|AT z9=|@$PNm9K!g1VZpW(D8PoF*i8{d%Zl}U_x3H(?IUOp7IK9zVr?}%JqmzH;Q0b4Hd zntFF-qUt^W=gM(7vrUh$(L34s+@TG`iZ93hv6Dnz+&3mcZ1OHuS#5ub3R)VRr9U)z zH>+jIjJgvv;--NXqwM^SknS60x01V1_V2yWUxbH*lHf<)AnU52YXUKobs+X?mW&%W zjPNp{b^7KeQksH|7u zJ9ES($HtYI1=D^`dZTe&hU?s)Z-FdB9wQDdIy{GrRzmdvLuEILp}#HmJzg;lJGI^N z)6ndu`|%c8P*m^R6=!f?pv7k7>v<{VKmy&tJS{ro7bTd-;gz@=y5oGOzt~YT3I2BJ znGV%dPr)3?gXM54?cq)!ikp-tQ;pw87i$77Dy zVwVps{kSx_ST-rpFx9zUmJA$kh7_?ZymbV#KZ)`y7*+Zl)(cApj;n|nFXSCwMCHka zz2uifBQKI?nU~3E!OY|`#mxPT3W@Ta%wx>2n5Q69K3e!M<~8Oc@+Pi&nQxfujG2vK zW7whWNJx&Cv+LQ#%nR(>kOAMyKEa-W-1lf9luH%v}EF*oo(jzi^@xcs9tYb!5i{ip_h;ou8xZ`!h$gsCxn#fT-Ezz z8EJiqKiE_85=5|D5A*t%H!rG3;f-vp)t#nUGeZg{DWf*{v6{!f+72tOp*o{zxGVg0 zmiyYyufRLqgY(*Wq$I76@KMSe7s+o3**6VRiF~BeZQR{Gjr5#JBpIdSI>xb@njwr; z7OBJQ>gZ`pgU26S9hj z+QM&}d0{-Rer1bRtjd18A((r{WYQYOBUMq!oQG|ZihwhVtr%$LqXdOW^BrgE z6%}xgTd#86V+|{TyTo}z6_YVi(=S2}R?ctZfV`we2;oO$~%Uq9HR{08Q~s)_eLu47E+MHS=Ck-+TWWmu@-zVhXjDLoC*@_%G&k5gI*R8; zAa$qIxVwDdp!NygoygI%ipJLa2hy}&+>hW6Y8Qbv;1|GX;6H#?j!OA7wiXS%Ii_Rm z;R5qcSCJR1`&YiNn753wzCNDHVw!h_S8p;(Csdnlr3z8@8FxCYNB@KEOb(hu4Gi`{3V+m$9ZF%bRF8JQ=!PKPc;B^1({9ub0 zj;SP3N@HtZ|E3-rMg{fFDbyV>u1RYhORa}LXm9EnIvB^+X~s4BpQZM5AGDj7MJS9e zlf6B|j8SzjYhD(KQ7IFxXSfkEhc)kt0MG5i3>Q|vN}RbxDV6YWk)(~uOwck=-l?qF zC~L!Y9&4jI9Um^lIgGe*EVUij*jjnryv&O4p-ddwW9Zv>wExhK;My^Q?MP(6ky7Ml z@6=q%8Bt+tIf6}40y&ufw11-RVU zI{JE=_Bh^kaWFh#Fx-ytClP*z3ASw<4ew}djY7B|;qMKGhhCp~fe<s!sKQwe=cPhJ$pV!#>%l@u3^ESSuvGwQuYR?$j+jagRw%(1y?Hf;7C*i5d zU8#ICFE_TT{oQFoGhflz`cS{eNF7nPckrp)!IrM+M~lAJ*t)F$V9(>mC>k}`3S~3~ zJK`VpcN!&1gQe{egK?#3moun;G()tV8S-J!BsS>5k;dIK`UAnQ+p_F&eCH`gL1&30 z`*tdoZeFGv`2zFRmx)>; z?*ByS8AY>q%q)0gHJ)i~mHKzfZ(P(*67q373BS-jaB1%p{bI@6@GU+S9GOQBjG^c9 z!H_(?03J!oH<8vCNSX#Sg{{8^MgyM#+JH|1M*uaT1K0{V4>~{I|K7ZV4>Y!({{CRk zhxope*4;?4AhX-3_q=f}b@Nc)Eo9~eb)5+#^7r5C7ghSb2d%Y%%shO?-uUE;-(v+w zSQ_%JN6N%2V4^+Q_C3}fgigY`w1lAb&os8Sejj}6FTPLHy6~?1NpR*og8OVdT{?Kb z9rqJ)KMRzOG2YP}-(segiJs;{AX#c@Uq?(;p;geAxBqI)ayd+$sY{+B{VAtkR=xR*S^ncJ_*Ln$ zSZSlOQ@XHeDiSeo)rO2cS6zduV3lxq0M4@P?Z4#3YyZ_QuxV4cL^%)?)*b z8mr@U5AWTaL*KgvDOS1|oEx+Dm2%t|TF!T{xBX5x+fBdK?OZymd>Btz8f|Dc57GA?w!x-s1NeI?tSluV5kaH&ie_|PY zibEul+Ad=8RKM@U#~{qrw?V<5KC*y>qeM;K+O=nLC?API%$H@M*wNOQGBuJRZ5Q=F zJF8}G?FuhiKFy3)dEdDWPyEbv@6^-I-LA4}%cuUu>CyO%rL(qmh0kR?WBwv&k}9Za zdT9cuChH~OVkPLGXS2#-nTI4851upi0~g^=gtW@X*^xW02Czd#NThr8A(^l{z6;!) zaCW>$v!?DvzVnhQ;8pAMY{oPE&t>sZI46zM|L#16_HP*InX$Pm9I|bpy0}BsKQMZA zxvL%RUpp`i?O#2x9M?++LeL8)MM5uZnYL-N~oW@WqfmD zl)E{bp1GRk-HD+JqgwRG6C}ussbdPjf$@%i3@hM+43uYLmW>2Ahn13Ua);zK&2|QjsfBFpgbBJ9J+d;%DmB}8Yt;ZWf z{>sSUXQ)$j)$1a^aE7Qo`p!R%&IW=~%bxNCypv>O!k0zG89?h1}3aU)`*mTx)pMia(yXTg)Orf?#R8+RH z_16OoDX)Xw#@cEE+cmO+(K7)p5PzE5lgQMU#1nPg164_;S>SJMOVkCW#P!u0b}YNB z-o;|oXQwe^m}Qt@xMrqu;~0!^Zdrqiei69ap`g2Lm5awUKb~wmJYDv#jzvo3>^E! zRxX)jjLkD>UAxdHuaAZlP9A<4*erSM|I54L1xdPP+cJD z$K{gSUb&8*IV@dM>8Pp1i33Z>i8Ktg< z*cMA3tY!}Kw8mt>UO;ZY@4b(hDp(ho6c3Ao!{n!=N!ZEHmqm=hN(-grUrVK03_EOl zWomPC?_f@2Y)?s*7VsI;%fn2n6ll?=8(fEdz`dP9?$AuzMAO!xU0VnjYYGh~G1!w$ z&9K6kh^9@;u)v-H5Zi+U*%uC6N>2U4i0oK1qYTDAur)eBG78=Iq6q zz~xY@J*Hk2UZvKIawtqMsr`rBM!gv9!eDg>^%5ZG&77YM3xZr<$@_%(6&75!=-p+K zS&49$nKzs3P+QYNFXU2DJ>%pwRgROJB#(1bd`rUS#GOgolda0)!w#||Aex3R4%wBZ z2M&xSH5H)Fbi3EhI-(aoDGafV$1Y15ncKd$(3x2wyQbbw4x zk`wV8EoaG${H}aP{&we|J3@B;Rc|tTGB;(lj8El$&85ie6JwMIlO=g$(lV5yE_GKR zBz;ZV$i)q#R*kl5WMZQ;N|Po=YnF+WYJyHFsq7SU1(&;%PZ7GU=~*uN%XWvyC3Qy` zSg(hr$9G4^y{Sj0uhhfhx&tA5-qIuD&bwmFoq>>t&$=Qr-JOsmbX9h8_RT}s?$EeG zSC_`h^h)Tqq<8981MBc~Qg?WIX16u27P;c-E$`^z>Bu1qxi+46^=yb4PxGQVeX_yr zDs-{k5qLHdB?)3Y@=QXW)yQi(@_1Lb#J#77(!7=+k40x)=UtK6F*&ztrE9z_pe|Xi zfF>GOENYX~9f3TfjXdJJBjZjX51J><<0SGt@1i-zOhDOkx4QGzoY`=0!|S_voqmZk zXgg+(M>}St9qT5pnba_O)s%7gPKFwzHE7!w9&IsV-<$uttly6RO}47>3#_1xWCEL7 z0XmM(%~$ZnpfXS*M!2bp&ZOVZZ$@c}qGko>mpY!QQnRC$IkHT6(t+9L%v8OvLKcIr z*pR>+oUME3I}`!)rY@6JR%gLudeqAC^{|8{enIQz+7%`!9k)8OtxOhl4M(dlqX4o_2GUbYI_ci`} zG13r7!ic+~b@@bz>FUnw`VhPG#C@;~edZ@+C+>x|K*6g*?=PNMI9)y=m>l#w1FbF6 zeh2y9ci|o9V6_ZN9-neln^{|y2pF6g-sQabD3n7nKC!=cwcRC zOG2VUt|UufA&)-)mCw1dPJRLw%Neq=ZuO#y+Ms@EQ1|f~^wZ!eI&O*_tIMVs{0%WE z++s%Uke_b0HFM-VxVSQ5mvxnBm`Z=t;R_0CLo{9pBWyUJ#*t-u1?UNTpmp0zTQ5I`rmiEO@GJ z^ECS$JulaycmrX+NL?zjzBDipp@%oB9hNPjw7yHMMtyzX)azu=N}YN5_1VGjU^_f| zGknC3Pv6SaqDy*aWogzD*3OW<>37vIYXAL1b{$*$M|rkANQ>|`UXhgw(5`|WgMJ|D zDku5_y|hx=ugfV1rbo}=jh0A7OB}jq6^sJKnpQeRqt0?3?^$Nki^GN_A)_S%W&3YsTY{Jqf4f)xmQ(*Pj5tX15 zh33e&RPVTZpmW@(PP7qxGx6*23n?jnf$s0p-Dd6>CM>$Gb<)!(wD=XQU?8sU7)ySUu7!ppSn$ z?`*s%pK<2t^VXhA81PxIM_}~R6g*;|nP-;ib*QaA_2c7ydiYAp3*Q3#E4E&Pvd~QLa}C2dsCfbBgMeD1o2y6@rT62=_k_Zd&X>$RFh8H^x+=d{dEzQtE85IU%;vL zv)G+19>6-4RN+X4t;3{>Gz@LJW;ud^=y@FPCe;~I5C0bAz`-FTE$|2lu5Xj#qM_4W zA&!x!z;eN!iBaeuD`v}?jpH?&%2iRGs=l#M$)6-u6;2GP8r@b5op0H+Ef5M_%8|+z z`T760V*S@ulQGh-z7=V#Sm|1{H$}60Lw8y9cA3|spH9@Wya5P>k#rGF;JzksYh3&mk25)&)k1#oL+R#DDct)kP6D%yZB}NKu4@8Pv z;o+zG$h?1D@$jWWe8~BDl*RuOVCZc-K6{I{%uBPzqiyIaMo`j{8lrxGf9S3!7p;*? z?Cdd#Dd8*c_~N+8So*e#AX#-Gtq_tnn={MrC=msmDwOhqVUvFz#@_rFLyZ=@M%Qpq z7%xhvWfnHRcDVa}Ghe(0%e=gnp?(bg1_6B=qHtQaO0>an2l9LGFB0M zm*yfr*ylSecY@aJ_en1bNIR_Q%6zmw=n#TdXVJRK9ry+@v8a>#jtK~hfnC)Y)F}sX zSACyNy!PMMHH_XHYut?)VB9ZlsCNX{IT%o{E?d$t*%18s!TMK$^l6ULg5YDAJ2(Hw zBr?*~EnQV!h39b8Ub%+Oq8gZipjf`TzMf(Q_QODsQ`F9%Pi4Rxh)i@7N*9^1A7)jD z9;94;bGOI)u*%AHQbHP~TgpMRe1$J6r4#TS!YY|S>4bFn)&Q@>$r*GUo>{G~l-M#M zg)6gyrxT=gF6$L``bMhh=kZn`S4B!pX38o+(fmj)lekn$-;|>ipaNy0FrM@d@+mKe ze50Nq_V(MDPpge<#=dzZR%r4~9_9Lo%IPxU{NJaC5SK27M{cBiG5Gwpi#iU!bq3;| zVw@G+swV3t8>qTm8M;rT^+%9WnWZzmUw`7c9sbSj;%ziXoV&D^fQGnx;%*o9%DveL zo$aC=TcP*2yLxWt?fLNYZH2dQ!Tu2ZlQVX3zQw(_@x6|`-N*?tFM6l=#BD-vsjv_C z0`3Fi?%UYj`2Lr0&*HvI+;$t&``rV7z&!(5PhOuPLQKvDi(lY;Q5sc2efxc}&&nt6 zHSxW+`b>oI@Ogb7C|4?vV3Q>~v?+5v;Fet*CxZlR@6^&fadG?sKiJ-%i2S1t`jA3!Dl(#=cDDh?3kozJj>(Rf)gbvH=gB# z&*nrWauXtwnB4pD)d+#K>6Pn4tVsT($@|WV{R#Xor@lA- z=Q6Wvm>wlBr&c-_HQ_H~<0kz2H)L&8yIE7tM!^Lc)cL}p>bw|t5`Hi5yr{2nUDa`RIBwT`y>cv3c!g1F(KlgApV8jjwrIT&_8;!lh4~uFDb~FmxFh|H>+L{c z`j2bwsrkfpmuqCxrMVd!vNx#k&YrnpM!6q5la?+nWk1l<#f9$$MmC+SeJVlRm5lMx zmUdt?9U)fve)&lm<6}uP{<1dW+qFd7Fn(iGHy4+^(dE)yP4tac4P)oh&M)*$t_NLL zcYdOCcBkSAqa$u%yM;;Pp2Ob#H}TX5e2PrDyZyf52SY$NetbNeGkFA^J9ei46OG5_ z38JAV&)O;zZ|bINat0B_WjyxioQ>BCGNMJl4Ee^Q3Vh`bJs%E=^vie_{4<)f$2+FR z(i>t$Pqxa83p~sKJOI}c$o|8APvPNW_;68@$`dORxNV`<;1f}JLNK04Val9&7Z`>m zA+}(gfVglYZYV=b%HaLb3`Cizwx&FiYM2Q6?qujG6$GESxWdvq+<1a8kBsv=Sv6G` zwAsaiC$Yn#5Kol;=x7dF6)MgX-PlE+hu-IIP>;`@XvbHp2{J2Z$dv@%6V`b-emu(G zW!r+X1k;|JS7WDAk&l4J7dkE_fNR(peCuJn)n>f4n^canD1s+hPdciSl2O!ZBjd5_ zccoF=5P?o+F0akARZM2J1<<|D3wKW`nOr)F^KfrGFbQ&^a=ZMP#42H0o1Cu*$_lbO znep7NyGOC$`CGvS6|^y`;K>2K60L?QLll17Xq{4>QJ`B&^#~uU*&b&-BRlF}Qprdq zR7>@SHpjj}v_$V-rQLPKH{_ocqu%W#zC>-_<7K0r+JeWilUw9OI-28M(D}Hn>4VZR zmDj5$S5GNVGWg; zDEFh2`+dLsH4E9-G8vW)fV_4_W)-4+A{QoAlF`t+eC%evn}2;No~UAgL0$|b5NKXA z{w1%~|CU$eU|#n@$}!kO*Gq%_aiJQvb*y7KhRS5FbpJs3688?+LtkC#3K}&|U0MS{ zPY3pekP0P)rvKOYpd{$c1c*;+m{+y5A^3c1P{xzWc|s&Rm<9BL@0BOTh00L}6#~7U zxC*gIpPL(_MK7>HBhReN2`t$2slIMH_)6Gg<@q+*l%ozo^^Um{?G7z~&xxvy0yE95 z*CPB9M(LD0>A81HvISD=7drVxGuu}c-I7-ClqmO0mz%s6^_JAVpvga~IZA}Sv5hYK z;*;yc)j9L>w1OYyYcqbtc#3APMBa6fQ72l(BCPcI?UJZg63wTxQLy97{TBG#gq}L8 z-f!p7y_V|zE0Es*agK0PF8F%LPlBs)baQ~J(BjP`imB{{6~U9cJW<}tpx)DiHGbz3)z1i=Ul-yz7KW0q3>{`Z5vyC1JRh@ zq;(f_s}=1iErZfBC~Z5WIy=$Vs`u=8lWYQ&Pj|Ac_GBKN8&Br_a2yoOp*ESRt->aw zj=@oJnhZIrGVBgp*D1L$FniB+UmWV&T@xdAbj;rKqQpb%Az1IT$M>^&%4+oE!iUOv z3r?kF6Spl!*RUE|^u1EPZk>*r+nc6N&?VvK2;`+|+P^h`oPp?Hk8 zWp+dx~Y=iU*SVDD^SFXC&mS3+M**Wh8~t<#)VwFvfe@S6ob{F+P&EvceK zsrRXt9<;R1@0ig=t!cDK*cJ3n$3NQY%}B!`tuWZ?INwCClt4o!9it`B7%k*;PNr#_ zke1G;f9;_Yfs&N&z=D*mH61mQcp^}YtCkv@_zuQaqIed*l`_RmHCYF(Bu}|ld=Kq8 zdVPUjFg;Iy;Q0cHcXy9X(nhpJK)(gtyPGT8N3&pPqa2nNG6=XE*R1JWY0xB~q1&=@ z1-NlC)Ksvm#Kx2Aw9qAZFwRhWX`pfcP3?uyJREZxmf-2sq}6GTRkeRdT4$8^l6v?Sb*x6^hA z#mUd*J0Q_NldfF*XHsADH_DEYhO)nT!6bInM2OuTvyHMRVO6mObo2oLuW2 zbmZrDV&u;~#b{M)>AGCCc1h+6^JNRSBfXnSFYd-TXN+;q?MUvX?b8(~3BT@p;zCOe z#%nk)!j43EOAV~Hiv@VQQ|zkArYmA?p2*4bZ@#&nY^u3Sfu>z;llSd)Zi#iDNmihz z?Me^!?e;s`<-b@*8ROGY`d|%s5`*Iq{Nn#GNP}al0b}!)Y86#PD9I}*n0aSWaE#J? z{?`LFdK8b)eDztyGD$wcnCi?6 zjq{m|aT%Gp**W90CS~Ph4cgI4R;Vt)fbZNuk-OM^6(=DTC$gIDz z&gLuxX2`(Cj*dkkSj9skoRa>mbu8ksYV%g41R9j+z4S%P&5h2_Gw*C3&6=!I-%{b4uwQxpDK|0$#dt_1#TZ#ansj3WBw(lSs|O7t2uc?V<$xcOjX&Ro8YoGc&`ua&8Pq*uzTta* zHtyV2*=`%C-p&$uQ=Kyg`hA@hsXXumqw5|uGrea*u`Gd$(C<6)teSMgH+%+sm+NWV zCi>O8*WC*}P~!Qf8#aWUb5mLHc%$o9A>{+#r`(~ZTs^xo;exh4zB0SgA}SZaNq{!d zwEHZFxOhpFdZ7nNHOtFwtfgF(j?I%+@$EU`@S=s# zIS8F22FZoT+6k|1FK@!T?l2R|`-q-j98R^%hzcIYv}YBR_O5m7^5j$k9>bD}R*NL@ zDb$|Xm^U0}ORrk6j^YQY62)xEe0E(vCpS!H}G8vqc z*$b_@c1E&Pi1yrM7SNt1OQGI|0@{$X2xu)@{?4_;UzfqkZWFw2;m)frTWjZF{RG{P zI4K!1j;%d^;+l@eQHj>^KU4Y%LkLS$7l|7A#^-QM`JJ$hKS>T;AkUC8QiT6zlYb2U z_aZ6%#7+;H>I)=hq@EJ@4pt_5Sl!X3yV+}cQA1w>?OlJ?3Uyn^_4S=n(Iw47> zm>;wsUO?;;@<5JB&cm4!xGV^bLoO|A@-1%Z`~z%jt^Vy_zmsACYC{;fr0XJ9xU)>M z)e>kMPS2Y|-mvBc|7gT8liZli`>n$oa}55(VXMaxf66fTczEEIS>+VCIvJ5BxglGT z9>e$R*BCGp#^a02*2q%APsjAsn#OY1Dj+rhsw2g*h7$76=yGi{Qv23;#bBBB7`sj2 z7e1CMU}bVkL9N!iys8s5yG5!-xuwtBl(4-My=wj%ujBlQ5o};}S$nu6*;Z#ZpVuA= zcS{|)E{xwpqauLuBN4ga{E2R+686tkWABh@e*HezVd}+~?`sPud5O?s=)zbjA#Rl7 zzBN=gY2{W|!m`AzeS5-4-tZZuuNK!&yTyBM_}Jp0o$-WeQ|UZsZ4CrOTACL(9OjsI`^3j zeOAmZ6)=4{Xd%XPXZP_jtTMdw80^pEwGtPvf5jlgeE${qZC?>? z`wG*WgQ-}B)~_Dh?>l^m^zjiu_>lIGj*@Fgqy=ZAjPobjh=O(Du|u>6e)Zsl%WnXtX0_GT0Hm7qrSPz| zc=1xK<2ab=i#Cp=v=Y{oz*0}06uN7w3r794>~0s-iEqn$u@wi{O6oN2Cslt2QaWg4 zsy82Si)mOAJ#9?$cCh%KJIyVs~E0C3=ZT?O2WO$}hC0Fj!21xT?$Q zlcaNPm%=+;K#)F}q|a#^^gpSNQk*mj4njCsG^pd_N+bOjyvZbn_xE@%nVW+yB8r%fOdG1oCl2ruT?0sPFJYo7)oQ^^mtq#59}}hi4*~9BadP99feV7c}6qm+UmjzbuM%AX98OIBeF-QXf~PYx56w= zovt|FM(GMC=nB|Bfvz~;)*Z$uE3~LI)>Ep%rUoaE4l~&;5xBhcOzzk}%HWxx?Hj{; zay$2q<~%u?3feVO+n;9ejMergao*H(MaPJgJR)HQ=W%GF|GqK@=-!IaqIYEZ-o%I$ z&O2OMFoBczB=NE!N97a5D4(!DF*Y}_iWkak-y!UO`l!vTA=Ji=^^E8mD$8T$eF;3c z*n38?p2#kBH1ULK`xB#64Bnub`;wwYVf2>8=F%G9Pux-|)~34}sg)h2T}14Cly)gW z$kSwBqFdq>W2aZ0+&CWb_Ytp}*GN-7O7`kBRDjm%MH?BEk2EzAdY2kJ03qM|ErHgg z=eQ>GCA6prtTd0v(Do9$^)hyL?uC@o02iQUo~> zr?xmqJSY|f{2E&}B{RL(u!6KoA88LJZ-TAH_=9u|9Vu=~j&?WY(!H#&VTw*E{Yu-N zKs6oqCKeq7Cu}6Qo!1!87Okuehcwxft0r3g*2w)1hd(iLZ&HFkB~nR{+)B387Qx)| zy)|8#SUgyZp?a#Jak4>q7x}j6dB8#_p~9V$z41WnfLmIOmOIiQWAAiuZV48=13%fX z;7a`8X|bQgq1;bEt?A+Jy44N;(|QRU4GNC(L!3i6KaUzbGnDCcap25QrqjjrtQF{q zGSJ1;POFgQnwup7B|gv~(J+r7?G`Gn=J7rf2B0I;S__bw196V>vK&PPJs2E znU^&#J0~Z19FL@VxzNYhTXnImQBi;i!S*-2bJAUg8wpqFrZbk)IgfJK^()#KjQ#(`id zNeWmGK{W}dpr@f8OV2KKl-h@60y~i>NRx5>61&dIfjcp~c92dvRBs_K-1t3hlqKd8 z$T?Fjw6S=t8Av-3GFjhj+}^Gb9(8Wctc-3$tUnr=OROF*OePAa{oTl+wIgX-7W#77 zH}4eglt&4&G+Cg!nJlDyG|x~iU1*i2d>;mVqFYo0`3s4jY|a`EqR%H38^C4Y=?c1l zSF$yZo@5pWI;FAThVSprJ0X`+!kA=OSck((u`bTc>N&7V zly+WQ8;*ACWe0QU_s#h}W&YH&hQp@KIFT%vbkF3wr`%i60}Y;?B$cza?ZiF+%`M0R zLP4E}$<%)jd=X&;86cM}_wy+;{X)tj`_F=cEHfx|U3;iq3ytuL)|m;j6VIRU<3ubG zTK6t!d_(WbXXrZ;N@@*?75g4|C$+?LM-S826G>`EOdlzSY2D0s#S@pk)m7*Y(oAI` z=3q~7$B5}$wW5bRx(XZNd8PO+jcE+_M06GRB}T#e$P?Vf_Pvkv>^7lC=sSbE@een* zt5F_x_CO7rQ9Z!C^qx zhg`Y>U~F_fp}stl=<2jm0H)!}bO96}Q)dL)*UtxeU`Ypv?9O8;uLM+CGOqEKD9M&W zIYP;KkrsnY+SSO_`P|VuLUksRaTP2@QVw>?@3h=}(td=YbN#ySzI*9;|7EwG`=N|F z=pooYHLx$N)_FdWGUe{r!1dX!rz*U6i0|WA72x|6Es&AV9yjT$iy|3x&+PZz_ZsE? zl+Uq(o}*`piI8qBM67q+hCYn=G6PQNq;F>=7&ZEtLagXEk)AZe1%j3A7G2&18l&zc;McMfVN}`b~W%dZzW?Sh*+y96Ih;S zG?|mp%a53hN+?cbUNylD?pdBZ3jPKqFG#=7^fc`+kKT(vUts-y zoYJwm7#nkKpk`>RA9!wG)l-}~x*}5g`_fZ7Eenc!8j1LU=hj6Iyg^LzBZM8#vH_0Q zZ$YPqP_CG|AKW=Tm4T=;5gLXg583@2aJ`6U%`FbKA_rC@JX(+aAGqTg%1wKktcLy% ze~aQE;Mz~Q;EFU%_NqUx2Rag=wpx>jJ8Ly~XicQi&ZCX!Y!NNRXd?l;QxoMjMhZ%w zrgP15hqz|5fW)uDhPYO915u$y|Bm4ntEVkNT2@aB?p`FToYZhu^@`n!Gzwp~;mh+; zQ_?#kC6uhqk?!Hd2B1q6>D)uuUFs>pKa6CQqxdT2mL(#7zc0Eo!@|j&(yYm#0!*?Y zWpy??YE=$1dgVASwPC!?(r7O}25IkL4w&`Ib}cH|1P+;?t<7GWvvypNWlc8MdkXtY zLk{1Y1cqnhxV7VX*w>ommEfLv)%R9V-dR3M`iB)NcxOM1-JdeesGZ%gxZx5#e~yA4 zDST_FwddThpzx^2;ZNtFvdmES;<7Srw)+xVM7-arz3aZ9T>+x6S9;PM z2Krf=^4Q3`bmaf2kyG_+*vK;d8Z=UZwhjT-)L9-Yh6Xf&o>#Gp-$w)`M%x6x48o3x z^68XMyHV=sDevhj%qZ{rIXpQDN>7(l8EzJoFs-Sp5b=U$E?ZXKwJ0O-u22cVJ04!_ z4GSVPV*xm3p8hitnvffY_Mp3%SGouaX2k$SO%O6-%t5@cJ-C*Z$D`)G?k>*QAnf?B zB82WT*6vP-TpTx50F6)I|B!n2K#+&if_TmJzUdp2D&<4&OKm>JO83UH@?6j`6jj`- z7O(hHjFW>g&&}N*iM%Ja`zmOKFF_B5_|u*U!Rd$i&0FbSWe^RZZ#aLQn*(Q)>NU~x z&DrJTz?TN-WN95KHlzU0bt|td1Mk(0>tYQ<;UyAH>UeXMoRupjoYOWKGjb$bp*>?< z=J;aqdOFrpYlUF&z!N!qP8LbfZ8EbSv3L$&?BBO0B8XRtq&YnO-hl7hLJsCX^f%hy!JC9_7iu3b-Kpz6xbf)XxQaABD9D9MpK^N{vj zm0>M@A%~BX&j8P*g*gX#`dle{Ma+ga+HnWr8f=GzNqThUOhD(;Q%}jh!8qFIxqF&el?AI5cb1 zwlbcZ8qnXxjZgpAfPnA4-BE0$^@F{9F4=xz_E`rktZOSY!?PV-<GDz< zm!>?v^Q;KeRFlE;%+GGmkcsgg~TXx%<_~PeAkjM?HBYMMe zK4!xW-#`E3w$P;L4V`-E#s9d&V(7asiYO&|%{T6zKEQc?kM$#ME9d#G*2D`gH8Drp zZTIsxe6K-ka^D(*@?O`UQFo^5y)00@Ri{jGGC8o2gy`I^V+@B`0jS_6meY40n zJv+b0Mt0B;KNI_s7TX~af6S3LBUpdP5kambR7T-ZC;Y7txzoF*e}0+nmRRKDQAd2i z`1vPjXvRP3?=N~8#P;JZ<_l`spxmv23!|aLDO)+^R~VORTUq6C?W{;glc8zPydte! z@12}EXH2|ubT)%_Vw7j+dDSg<({gm+OA$vZ30>_s9?1NTj?%zv+;%@*RT->JY$7wm z(_Ilx!|im<)K{jMibVbDRUP-oTIk9)@&;YmUJQlp)>eb(?-;!y%5{A%(|I0(IXvD$ zzyBUaN(>WNA3MNJ?ZNt3L*BEK0|G-O!*ta-C{am#$GKuZzcLp4z`p4*ko9aEN#E_( z-@SMa>%Nih#H>8Mm9AR9J_kE3gaqEVoO>^UmwFtqt$du*;$Al38nIy-ViK&Bu`fj8 z1RV2h60EyNzX*Q9%Ag&u-;-=H$#+1zYUmrE{XOuFK#m{%{fvW^&L&VTh#;h<`9?i% zdeEb;ZF3?A(~gg31j+19p9ar1%7>=|E9G{*K8#H3bMLtziRK=7Ix<*;z|)L#w4QD$ z@bu)l(|YM?8TZ&DHV~m1xaCnBHuD_Ho+QL>@Th+}PLZj2&pV&xS$I$XyYTp`?>V$h z|Dd<2ppUJP4~NFq{4ahOTmSrQXl$`x(6J?dM8{So?)pAE>xhs`pBqWu#;Uh$M%;$j zjdz!N)oJsK;Ts9x>l&&9t)WLB@;y9ZSgcknfMJG~19{>nm z>o7*9&8J`7apS#&(~jtSPLJbUrw8X0-90uQxcc2Dk!iXxSCBUzsQ8YKJGuvcxikd4 z2p%&7UKV-+V?K3o%qLSh=~if{ZapPNZ?(b-_jx`**WdX#O&{24ZY1x*Oyd&x zjjH2�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 z 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%0Do=T5fb;4Djj~7!{=r)d9UgZCLgEXmLc=sp4R) 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ʈ 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 jZFJHBCl*1**`Y)_5B`>r23yY&N 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 + +uint32 uart_recvline(char *buff, int maxlen); +void uart_init(void); +char uart_recv(void); +uint32 uart_recv_uint(void); +void uart_send(char c); +void uart_sendn(char *str, int n); +void uart_printf(char *fmt, ...); + +#endif /* _MINI_UART_H */ \ No newline at end of file diff --git a/lab8/include/bootloader/rpi3.h b/lab8/include/bootloader/rpi3.h new file mode 100644 index 000000000..90d9ab894 --- /dev/null +++ b/lab8/include/bootloader/rpi3.h @@ -0,0 +1,13 @@ +#ifndef _RPI3_H +#define _RPI3_H + +struct arm_memory_info { + unsigned int baseaddr; + unsigned int size; +}; + +void mailbox_call(unsigned char channel, unsigned int *mb); +unsigned int get_board_revision(void); +void get_arm_memory(struct arm_memory_info *); + +#endif \ No newline at end of file diff --git a/lab8/include/kernel/BCM2837.h b/lab8/include/kernel/BCM2837.h new file mode 100644 index 000000000..a38cc74e7 --- /dev/null +++ b/lab8/include/kernel/BCM2837.h @@ -0,0 +1,54 @@ +#ifndef _BCM2837_H +#define _BCM2837_H +// Ref: https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf + +#define PERIPHERALS_BASE 0x3f000000 +#define BUS_BASE 0x7e000000 + +#define BUS_TO_PERIPHERALS(addr) (addr - BUS_BASE + PERIPHERALS_BASE) + +// Auxiliaries: UART1 & SPI1, SPI2 +#define AUX_IRQ BUS_TO_PERIPHERALS(0x7E215000) +#define AUX_ENABLES BUS_TO_PERIPHERALS(0x7E215004) +#define AUX_MU_IO_REG BUS_TO_PERIPHERALS(0x7E215040) +#define AUX_MU_IER_REG BUS_TO_PERIPHERALS(0x7E215044) +#define AUX_MU_IIR_REG BUS_TO_PERIPHERALS(0x7E215048) +#define AUX_MU_LCR_REG BUS_TO_PERIPHERALS(0x7E21504c) +#define AUX_MU_MCR_REG BUS_TO_PERIPHERALS(0x7E215050) +#define AUX_MU_LSR_REG BUS_TO_PERIPHERALS(0x7E215054) +#define AUX_MU_MSR_REG BUS_TO_PERIPHERALS(0x7E215058) +#define AUX_MU_SCRATCH BUS_TO_PERIPHERALS(0x7E21505c) +#define AUX_MU_CNTL_REG BUS_TO_PERIPHERALS(0x7E215060) +#define AUX_MU_STAT_REG BUS_TO_PERIPHERALS(0x7E215064) +#define AUX_MU_BAUD_REG BUS_TO_PERIPHERALS(0x7E215068) +#define AUX_SPI0_CNTL0_REG BUS_TO_PERIPHERALS(0x7E215080) +#define AUX_SPI0_CNTL1_REG BUS_TO_PERIPHERALS(0x7E215084) +#define AUX_SPI0_STAT_REG BUS_TO_PERIPHERALS(0x7E215088) +#define AUX_SPI0_IO_REG BUS_TO_PERIPHERALS(0x7E215090) +#define AUX_SPI0_PEEK_REG BUS_TO_PERIPHERALS(0x7E215094) +#define AUX_SPI1_CNTL0_REG BUS_TO_PERIPHERALS(0x7E2150c0) +#define AUX_SPI1_CNTL1_REG BUS_TO_PERIPHERALS(0x7E2150c4) +#define AUX_SPI1_STAT_REG BUS_TO_PERIPHERALS(0x7E2150c8) +#define AUX_SPI1_IO_REG BUS_TO_PERIPHERALS(0x7E2150d0) +#define AUX_SPI1_PEEK_REG BUS_TO_PERIPHERALS(0x7E2150d4) + +// GPIO +#define GPFSEL0 BUS_TO_PERIPHERALS(0x7E200000) +#define GPFSEL1 BUS_TO_PERIPHERALS(0x7E200004) +#define GPFSEL2 BUS_TO_PERIPHERALS(0x7E200008) +#define GPFSEL3 BUS_TO_PERIPHERALS(0x7E20000c) +#define GPFSEL4 BUS_TO_PERIPHERALS(0x7E200010) +#define GPFSEL5 BUS_TO_PERIPHERALS(0x7E200014) + +#define GPPUD BUS_TO_PERIPHERALS(0x7E200094) +#define GPPUDCLK0 BUS_TO_PERIPHERALS(0x7E200098) +#define GPPUDCLK1 BUS_TO_PERIPHERALS(0x7E20009c) + +// Interrupt +#define IRQ_ENABLE_1_REG BUS_TO_PERIPHERALS(0x7E00B210) + +void BCM2837_reset(int tick); +void BCM2837_cancel_reset(); + + +#endif /* _BCM2837_H */ \ No newline at end of file diff --git a/lab8/include/kernel/arm.h b/lab8/include/kernel/arm.h new file mode 100644 index 000000000..c0e282c21 --- /dev/null +++ b/lab8/include/kernel/arm.h @@ -0,0 +1,28 @@ +#ifndef _ARM_H +#define _ARM_H + +/* ==== PAR_EL1 related ==== */ +#define PAR_FAILED(par) (par & 1) +#define PAR_PA(par) (par & 0x0000fffffffff000) + +/* ==== ESR_EL1 related ==== */ +#define EC_SVC_64 0x15 +#define EC_IA_LE 0x20 +#define EC_DA_LE 0x24 + +#define ISS_FSC(esr) (esr->iss & 0x3f) + +#define FSC_TF_L0 0b000100 +#define FSC_TF_L1 0b000101 +#define FSC_TF_L2 0b000110 +#define FSC_TF_L3 0b000111 + +#define ISS_WnR(esr) (esr->iss & 0x40) + +typedef struct { + unsigned int iss:25, // Instruction specific syndrome + il:1, // Instruction length bit + ec:6; // Exception class +} esr_el1_t; + +#endif /* _ARM_H */ \ No newline at end of file diff --git a/lab8/include/kernel/cpio.h b/lab8/include/kernel/cpio.h new file mode 100644 index 000000000..10ecf6d48 --- /dev/null +++ b/lab8/include/kernel/cpio.h @@ -0,0 +1,11 @@ +#ifndef _CPIO_H +#define _CPIO_H + +#include + +extern void *initramfs_base; +extern void *initramfs_end; + +void initramfs_init(void); + +#endif /* _CPIO_H */ \ No newline at end of file diff --git a/lab8/include/kernel/current.h b/lab8/include/kernel/current.h new file mode 100644 index 000000000..c98baf989 --- /dev/null +++ b/lab8/include/kernel/current.h @@ -0,0 +1,20 @@ +#ifndef _CURRENT_H +#define _CURRENT_H + +#include + +struct _task_struct; + +static inline struct _task_struct *get_current(void) +{ + return (struct _task_struct *)read_sysreg(tpidr_el1); +} + +static inline void set_current(struct _task_struct *task) +{ + write_sysreg(tpidr_el1, task); +} + +#define current get_current() + +#endif /* _CURRENT_H */ \ No newline at end of file diff --git a/lab8/include/kernel/entry.h b/lab8/include/kernel/entry.h new file mode 100644 index 000000000..0f7d560f9 --- /dev/null +++ b/lab8/include/kernel/entry.h @@ -0,0 +1,9 @@ +#ifndef _ENTRY_H +#define _ENTRY_H + +#include +#include + +void el0_sync_handler(trapframe *regs, uint32 syn); + +#endif /* _ENTRY_H */ \ No newline at end of file diff --git a/lab8/include/kernel/exec.h b/lab8/include/kernel/exec.h new file mode 100644 index 000000000..c3f48b435 --- /dev/null +++ b/lab8/include/kernel/exec.h @@ -0,0 +1,11 @@ +#ifndef _EXEC_H +#define _EXEC_H + +// TODO: Add argv & envp +void sched_new_user_prog(char *filename); + +void exit_user_prog(void); + +void exec_user_prog(void *entry, char *user_sp, char *kernel_sp); + +#endif /* _EXEC_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fdt.h b/lab8/include/kernel/fdt.h new file mode 100644 index 000000000..83cffc016 --- /dev/null +++ b/lab8/include/kernel/fdt.h @@ -0,0 +1,110 @@ +// Ref: https://elixir.bootlin.com/linux/v5.16.14/source/scripts/dtc/libfdt/fdt.h +#ifndef _FDT_H +#define _FDT_H + +#include + +struct fdt_header; +struct fdt_node_header; +struct fdt_property; + +typedef int (*fdt_parser)(int level, char *cur, char *dt_strings); + +extern char *fdt_base; + +void fdt_traversal(char *dtb); +void parse_dtb(char *dtb, fdt_parser parser); + +typedef uint32 fdt32_t; +typedef uint64 fdt64_t; + +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * Copyright 2012 Kim Phillips, Freescale Semiconductor. + */ + +#ifndef __ASSEMBLY__ + +struct fdt_header { + fdt32_t magic; /* magic word FDT_MAGIC */ + fdt32_t totalsize; /* total size of DT block */ + fdt32_t off_dt_struct; /* offset to structure */ + fdt32_t off_dt_strings; /* offset to strings */ + fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ + fdt32_t version; /* format version */ + fdt32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + fdt32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + fdt32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + fdt32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(fdt32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(fdt32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) + +// Ref: https://elixir.bootlin.com/linux/v5.16.14/source/scripts/dtc/libfdt/libfdt.h#L249 +#define fdt_get_header(fdt, field) \ + (fdt32_ld(&((const struct fdt_header *)(fdt))->field)) +#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) +#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) +#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) +#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) +#define fdt_version(fdt) (fdt_get_header(fdt, version)) +#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) +#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) +#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) + +#define fdtn_get_header(fdtn, field) \ + (fdt32_ld(&((const struct fdt_node_header *)(fdtn))->field)) +#define fdtn_tag(fdtn) (fdtn_get_header(fdtn, tag)) + +#define fdtp_get_header(fdtp, field) \ + (fdt32_ld(&((const struct fdt_property *)(fdtp))->field)) +#define fdtp_tag(fdtp) (fdtp_get_header(fdtp, tag)) +#define fdtp_len(fdtp) (fdtp_get_header(fdtp, len)) +#define fdtp_nameoff(fdtp) (fdtp_get_header(fdtp, nameoff)) + +// Load fdt32 (big-endian) +static inline uint32 fdt32_ld(const fdt32_t *p) +{ + const uint8 *bp = (const uint8 *)p; + + return ((uint32)bp[0] << 24) + | ((uint32)bp[1] << 16) + | ((uint32)bp[2] << 8) + | bp[3]; +} + +#endif /* _FDT_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/cpiofs.h b/lab8/include/kernel/fs/cpiofs.h new file mode 100644 index 000000000..9a7fa0841 --- /dev/null +++ b/lab8/include/kernel/fs/cpiofs.h @@ -0,0 +1,8 @@ +#ifndef _CPIOFS_H +#define _CPIOFS_H + +#include + +struct filesystem *cpiofs_init(void); + +#endif /* _CPIOFS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/fat32fs.h b/lab8/include/kernel/fs/fat32fs.h new file mode 100644 index 000000000..c5872a8e9 --- /dev/null +++ b/lab8/include/kernel/fs/fat32fs.h @@ -0,0 +1,8 @@ +#ifndef _FAT32FS_H +#define _FAT32FS_H + +#include + +struct filesystem *fat32fs_init(void); + +#endif /* _FAT32FS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/framebufferfs.h b/lab8/include/kernel/fs/framebufferfs.h new file mode 100644 index 000000000..3e0310785 --- /dev/null +++ b/lab8/include/kernel/fs/framebufferfs.h @@ -0,0 +1,8 @@ +#ifndef _FRAMEBUFFERFS_H +#define _FRAMEBUFFERFS_H + +#include + +struct filesystem *framebufferfs_init(void); + +#endif /* _FRAMEBUFFERFS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/fsinit.h b/lab8/include/kernel/fs/fsinit.h new file mode 100644 index 000000000..1397a7b31 --- /dev/null +++ b/lab8/include/kernel/fs/fsinit.h @@ -0,0 +1,13 @@ +#ifndef _FSINIT_H +#define _FSINIT_H + +#include +#include +#include +#include +#include +#include + +void fs_init(void); + +#endif /* _FSINIT_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/tmpfs.h b/lab8/include/kernel/fs/tmpfs.h new file mode 100644 index 000000000..348b09d8d --- /dev/null +++ b/lab8/include/kernel/fs/tmpfs.h @@ -0,0 +1,8 @@ +#ifndef _TMPFS_H +#define _TMPFS_H + +#include + +struct filesystem *tmpfs_init(void); + +#endif /* _TMPFS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/uartfs.h b/lab8/include/kernel/fs/uartfs.h new file mode 100644 index 000000000..0fd27263f --- /dev/null +++ b/lab8/include/kernel/fs/uartfs.h @@ -0,0 +1,8 @@ +#ifndef _UARTFS_H +#define _UARTFS_H + +#include + +struct filesystem *uartfs_init(void); + +#endif /* _UARTFS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/fs/vfs.h b/lab8/include/kernel/fs/vfs.h new file mode 100644 index 000000000..11d6cfe71 --- /dev/null +++ b/lab8/include/kernel/fs/vfs.h @@ -0,0 +1,96 @@ +#ifndef _VFS_H +#define _VFS_H + +#include +#include +#include +#include + +#define O_CREAT 00000100 + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +/* File metadata */ +struct vnode { + struct mount *mount; + struct vnode_operations *v_ops; + struct file_operations *f_ops; + struct vnode *parent; + void *internal; +}; + +/* File handle */ +struct file { + struct vnode *vnode; + size_t f_pos; // RW position of this file handle + struct file_operations *f_ops; + int flags; +}; + +struct mount { + struct vnode *root; + struct filesystem *fs; +}; + +struct filesystem { + const char *name; + /* Link all filesystems */ + struct list_head fs_list; + int (*mount)(struct filesystem *fs, struct mount *mount); + int (*alloc_vnode)(struct filesystem *fs, struct vnode **target); + int (*sync)(struct filesystem *fs); +}; + +struct file_operations { + int (*write)(struct file *file, const void *buf, size_t len); + int (*read)(struct file *file, void *buf, size_t len); + int (*open)(struct vnode *file_node, struct file *target); + int (*close)(struct file *file); + long (*lseek64)(struct file *file, long offset, int whence); + int (*ioctl)(struct file *file, uint64 request, va_list args); +}; + +struct vnode_operations { + int (*lookup)(struct vnode *dir_node, struct vnode **target, + const char *component_name); + int (*create)(struct vnode *dir_node, struct vnode **target, + const char *component_name); + int (*mkdir)(struct vnode *dir_node, struct vnode **target, + const char *component_name); + int (*isdir)(struct vnode *dir_node); + int (*getname)(struct vnode *dir_node, const char **name); + int (*getsize)(struct vnode *dir_node); +}; + +extern struct mount *rootmount; + +void vfs_init(void); +void vfs_init_rootmount(struct filesystem *fs); + +int register_filesystem(struct filesystem *fs); +int vfs_open(const char *pathname, int flags, struct file *target); +int vfs_close(struct file *file); +int vfs_write(struct file *file, const void *buf, size_t len); +int vfs_read(struct file *file, void *buf, size_t len); +long vfs_lseek64(struct file *file, long offset, int whence); +int vfs_ioctl(struct file *file, uint64 request, va_list args); +int vfs_mkdir(const char *pathname); +int vfs_mount(const char *mountpath, const char *filesystem); +int vfs_lookup(const char *pathname, struct vnode **target); +int vfs_sync(struct filesystem *fs); + +void syscall_open(trapframe *frame, const char *pathname, int flags); +void syscall_close(trapframe *frame, int fd); +void syscall_write(trapframe *frame, int fd, const void *buf, uint64 count); +void syscall_read(trapframe *frame, int fd, void *buf, uint64 count); +void syscall_mkdir(trapframe *frame, const char *pathname, uint32 mode); +void syscall_mount(trapframe *frame, const char *src, const char *target, + const char *filesystem, uint64 flags, const void *data); +void syscall_chdir(trapframe *frame, const char *path); +void syscall_lseek64(trapframe *frame, int fd, int64 offset, int whence); +void syscall_ioctl(trapframe *frame, int fd, uint64 request, ...); +void syscall_sync(trapframe *frame); + +#endif /* _VFS_H */ \ No newline at end of file diff --git a/lab8/include/kernel/head.h b/lab8/include/kernel/head.h new file mode 100644 index 000000000..fc408f05e --- /dev/null +++ b/lab8/include/kernel/head.h @@ -0,0 +1,6 @@ +#ifndef _HEAD_H +#define _HEAD_H + +void _start(void); + +#endif /* _HEAD_H */ \ No newline at end of file diff --git a/lab8/include/kernel/irq.h b/lab8/include/kernel/irq.h new file mode 100644 index 000000000..3fd4b75e9 --- /dev/null +++ b/lab8/include/kernel/irq.h @@ -0,0 +1,20 @@ +#ifndef _IRQ_H +#define _IRQ_H + +#include + +void irq_init(); + +/* + * On success, 0 is returned + */ +int irq_run_task(void (*task)(void *), + void *args, + void (*fini)(void), + uint32 prio); + +void irq_handler(); +void exception_default_handler(uint32 n); +void irq1_enable(int bit); + +#endif /* _IRQ_H */ \ No newline at end of file diff --git a/lab8/include/kernel/kthread.h b/lab8/include/kernel/kthread.h new file mode 100644 index 000000000..ad0ae2e9b --- /dev/null +++ b/lab8/include/kernel/kthread.h @@ -0,0 +1,16 @@ +#ifndef _KTHREAD_H +#define _KTHREAD_H + +#include + +void kthread_early_init(void); +void kthread_init(void); + +void kthread_create(void (*start)(void)); +void kthread_fini(void); + +void kthread_add_wait_queue(task_struct *task); + +void kthread_kill_zombies(void); + +#endif /* _KTHREAD_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mini_uart.h b/lab8/include/kernel/mini_uart.h new file mode 100644 index 000000000..5de196e03 --- /dev/null +++ b/lab8/include/kernel/mini_uart.h @@ -0,0 +1,24 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + +#include +#include + +uint32 uart_recvline(char *buff, int maxlen); +void uart_init(void); +char uart_recv(void); +void uart_recvn(char *buff, int n); +uint32 uart_recv_uint(void); +void uart_send(char c); +void uart_sendn(const char *str, int n); +void uart_printf(const char *fmt, ...); + +void uart_sync_printf(const char *fmt, ...); +void uart_sync_vprintf(const char *fmt, va_list args); + +int uart_irq_check(void); + +/* Switch asynchronous/synchronous mode for uart RW */ +int uart_switch_mode(void); + +#endif /* _MINI_UART_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mm/early_alloc.h b/lab8/include/kernel/mm/early_alloc.h new file mode 100644 index 000000000..f214ad528 --- /dev/null +++ b/lab8/include/kernel/mm/early_alloc.h @@ -0,0 +1,15 @@ +#ifndef _MEM_H +#define _MEM_H + +#include + +/* From linker.ld */ +extern char _early_mem_base; +extern char _early_mem_end; + +#define EARLY_MEM_BASE (&_early_mem_base) +#define EARLY_MEM_END (&_early_mem_end) + +void* early_malloc(size_t size); + +#endif /* _MEM_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mm/mm.h b/lab8/include/kernel/mm/mm.h new file mode 100644 index 000000000..47511a0b7 --- /dev/null +++ b/lab8/include/kernel/mm/mm.h @@ -0,0 +1,14 @@ +#ifndef _MM_H +#define _MM_H + +#include +#include +#include + +void mm_init(void); + +void *kmalloc(int size); + +void kfree(void *ptr); + +#endif /* _MM_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mm/page_alloc.h b/lab8/include/kernel/mm/page_alloc.h new file mode 100644 index 000000000..c4b6ee05c --- /dev/null +++ b/lab8/include/kernel/mm/page_alloc.h @@ -0,0 +1,59 @@ +#ifndef _PAGE_ALLOC_H +#define _PAGE_ALLOC_H + +#include + +/* Initialize by page_allocator_early_init() */ +extern uint32 frame_ents_size; +extern uint64 buddy_base; +extern uint64 buddy_end; + +/* + * Convert frame idx to the frame address + */ +static inline void *idx2addr(int idx) +{ + return (void *)(buddy_base + idx * PAGE_SIZE); +} + +/* + * Convert frame address to the frame idx + */ +static inline int addr2idx(void *hdr) +{ + return ((uint64)hdr - buddy_base) / PAGE_SIZE; +} + +/* + * Initialize @start ~ @end memory for buddy system + * page_allocator_early_init() must be called before calling mem_reserve(). + */ +void page_allocator_early_init(void *start, void *end); + +/* + * Reserve @start ~ @end memory. + * mem_reserve() must be called before calling page_allocator_init(). + */ +void mem_reserve(void *start, void *end); + +void page_allocator_init(void); + +/* + * Allocate @num contiguous pages. + * Return NULL if failed. + */ +void *alloc_pages(int num); + +/* + * Allocate 1 page. + * Return NULL if failed. + */ +void *alloc_page(void); + +void free_page(void *page); + +#ifdef MM_DEBUG +void page_allocator_test(void); +#endif + +#endif /* _PAGE_ALLOC_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mm/sc_alloc.h b/lab8/include/kernel/mm/sc_alloc.h new file mode 100644 index 000000000..991a98ca7 --- /dev/null +++ b/lab8/include/kernel/mm/sc_alloc.h @@ -0,0 +1,21 @@ +#ifndef _SC_ALLOC_H +#define _SC_ALLOC_H + +#include + +void sc_early_init(void); + +void sc_init(void); + +void *sc_alloc(int size); + +/* + * Return 0 if successful. + */ +int sc_free(void *sc); + +#ifdef MM_DEBUG +void sc_test(void); +#endif + +#endif /* _SC_ALLOC_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mmu.h b/lab8/include/kernel/mmu.h new file mode 100644 index 000000000..90ef6bd08 --- /dev/null +++ b/lab8/include/kernel/mmu.h @@ -0,0 +1,81 @@ +#ifndef _MMU_H +#define _MMU_H + +#include +#include +#include +#include + +#define PAGE_TABLE_SIZE 0x1000 + +#define PT_R 0x0001 +#define PT_W 0x0002 +#define PT_X 0x0004 + +#define VMA_R PT_R +#define VMA_W PT_W +#define VMA_X PT_X +// PA +#define VMA_PA 0x0008 +// Kernel VA +#define VMA_KVA 0x0010 +// Anonymous +#define VMA_ANON 0x0020 + +typedef uint64 pd_t; + +/* TODO: The vm_area_t linked list is not sorted, making it an ordered list. */ +typedef struct _vm_area_t { + /* @list links to next vm_area_t */ + struct list_head list; + uint64 va_begin; + uint64 va_end; + uint64 flag; + /* @kva: Mapped kernel virtual address */ + uint64 kva; +} vm_area_t; + +typedef struct { + /* @vma links all vm_area_t */ + struct list_head vma; +} vm_area_meta_t; + +/* + * Set identity paging, enable MMU + */ +void mmu_init(void); + +pd_t *pt_create(void); +void pt_free(pd_t *pt); + +/* + * Create a @size mapping of @va -> @pa. + * @pt is PGD. + */ +void pt_map(pd_t *pt, void *va, uint64 size, void *pa, uint64 flag); + +vm_area_meta_t *vma_meta_create(void); +void vma_meta_free(vm_area_meta_t *vma_meta, pd_t *page_table); +void vma_meta_copy(vm_area_meta_t *to, vm_area_meta_t *from, pd_t *page_table); + +void vma_map(vm_area_meta_t *vma_meta, void *va, uint64 size, + uint64 flag, void *addr); + +void mem_abort(esr_el1_t *esr); + +/* syscalls */ +#define PROT_NONE 0 +#define PROT_READ 1 +#define PROT_WRITE 2 +#define PROT_EXEC 4 + +#define MAP_ANONYMOUS 0x0020 +#define MAP_POPULATE 0x8000 + +/* + * TODO: @fd, @file_offset are ignored currently. + */ +void syscall_mmap(trapframe *frame, void *addr, size_t len, int prot, + int flags, int fd, int file_offset); + +#endif /* _MMU_H */ \ No newline at end of file diff --git a/lab8/include/kernel/mode_switch.h b/lab8/include/kernel/mode_switch.h new file mode 100644 index 000000000..54edbf70c --- /dev/null +++ b/lab8/include/kernel/mode_switch.h @@ -0,0 +1,8 @@ +#ifndef _MODE_SWITCH_H +#define _MODE_SWITCH_H + +#include + +void exit_to_user_mode(trapframe regs); + +#endif /* _MODE_SWITCH_H */ \ No newline at end of file diff --git a/lab8/include/kernel/panic.h b/lab8/include/kernel/panic.h new file mode 100644 index 000000000..1c1978411 --- /dev/null +++ b/lab8/include/kernel/panic.h @@ -0,0 +1,6 @@ +#ifndef _PANIC_H +#define _PANIC_H + +void panic(const char *fmt, ...); + +#endif /* _PANIC_H */ \ No newline at end of file diff --git a/lab8/include/kernel/preempt.h b/lab8/include/kernel/preempt.h new file mode 100644 index 000000000..51f3d1920 --- /dev/null +++ b/lab8/include/kernel/preempt.h @@ -0,0 +1,7 @@ +#ifndef _PREEMPT_H +#define _PREEMPT_H + +void preempt_disable(void); +void preempt_enable(void); + +#endif /* _PREEMPT_H */ \ No newline at end of file diff --git a/lab8/include/kernel/rpi3.h b/lab8/include/kernel/rpi3.h new file mode 100644 index 000000000..b2888dd7a --- /dev/null +++ b/lab8/include/kernel/rpi3.h @@ -0,0 +1,29 @@ +#ifndef _RPI3_H +#define _RPI3_H + +/* Channels */ +#define MAILBOX_CH_POWER 0 +#define MAILBOX_CH_FB 1 +#define MAILBOX_CH_VUART 2 +#define MAILBOX_CH_VCHIQ 3 +#define MAILBOX_CH_LEDS 4 +#define MAILBOX_CH_BTNS 5 +#define MAILBOX_CH_TOUCH 6 +#define MAILBOX_CH_COUNT 7 +#define MAILBOX_CH_PROP 8 + +/* Others */ +#define MBOX_REQUEST_CODE 0x00000000 +#define MBOX_TAG_REQUEST 0x00000000 +#define MBOX_END_TAG 0x00000000 + +struct arm_memory_info { + unsigned int baseaddr; + unsigned int size; +}; + +void mailbox_call(unsigned char channel, unsigned int *mb); +unsigned int get_board_revision(void); +void get_arm_memory(struct arm_memory_info *); + +#endif \ No newline at end of file diff --git a/lab8/include/kernel/sched.h b/lab8/include/kernel/sched.h new file mode 100644 index 000000000..2cce0fb5d --- /dev/null +++ b/lab8/include/kernel/sched.h @@ -0,0 +1,18 @@ +#ifndef _SCHED_H +#define _SCHED_H + +#include + +void switch_to(task_struct *from, task_struct *to); + +void scheduler_init(void); + +void schedule(void); + +void schedule_tick(void); + +void sched_add_task(task_struct *task); + +void sched_del_task(task_struct *task); + +#endif /* _SCHED_H */ \ No newline at end of file diff --git a/lab8/include/kernel/sdhost.h b/lab8/include/kernel/sdhost.h new file mode 100644 index 000000000..afc7658f7 --- /dev/null +++ b/lab8/include/kernel/sdhost.h @@ -0,0 +1,11 @@ +#ifndef _SDHOST_H +#define _SDHOST_H + +#define BLOCK_SIZE 512 + +void sd_init(void); + +void sd_readblock(int block_idx, void *buf); +void sd_writeblock(int block_idx, const void *buf); + +#endif /* _SDHOST_H */ \ No newline at end of file diff --git a/lab8/include/kernel/signal.h b/lab8/include/kernel/signal.h new file mode 100644 index 000000000..69cf991f1 --- /dev/null +++ b/lab8/include/kernel/signal.h @@ -0,0 +1,89 @@ +#ifndef _SIGNAL_H +#define _SIGNAL_H + +#include +#include +#include + +// https://man7.org/linux/man-pages/man7/signal.7.html +// 0 means no signal +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL 29 +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +#define NSIG 32 + +struct signal_head_t { + /* Link signal_t */ + struct list_head list; +}; + +struct signal_t { + struct list_head list; + uint32 signum; +}; + +typedef void (*sighandler_t)(int); + +struct sigaction_t { + sighandler_t sighand; + + /* flags */ + uint32 kernel_hand; +}; + +struct sighand_t { + // 0-th sigaction_t is not used + struct sigaction_t sigactions[NSIG]; +}; + +struct signal_head_t *signal_head_create(void); +void signal_head_free(struct signal_head_t *head); +void signal_head_reset(struct signal_head_t *head); + +void handle_signal(trapframe *_); + +struct sighand_t *sighand_create(void); +void sighand_free(struct sighand_t *sighand); +void sighand_reset(struct sighand_t *sighand); + +/* Copy current signal handler to @sighand */ +void sighand_copy(struct sighand_t *sighand); + +/* syscalls */ +void syscall_signal(trapframe *_, uint32 signal, void (*handler)(int)); +void syscall_kill(trapframe *_, int pid, int signal); +void syscall_sigreturn(trapframe *_); + +#endif /* _SIGNAL_H */ \ No newline at end of file diff --git a/lab8/include/kernel/syscall.h b/lab8/include/kernel/syscall.h new file mode 100644 index 000000000..d7bc0f612 --- /dev/null +++ b/lab8/include/kernel/syscall.h @@ -0,0 +1,32 @@ +#ifndef _SYSCALL_H +#define _SYSCALL_H + +#include + +#define SCNUM_GETPID 0 +#define SCNUM_UART_READ 1 +#define SCNUM_UART_WRITE 2 +#define SCNUM_EXEC 3 +#define SCNUM_FORK 4 +#define SCNUM_EXIT 5 +#define SCNUM_MBOX_CALL 6 +#define SCNUM_KILL_PID 7 +#define SCNUM_SIGNAL 8 +#define SCNUM_KILL 9 +#define SCNUM_MMAP 10 +#define SCNUM_OPEN 11 +#define SCNUM_CLOSE 12 +#define SCNUM_WRITE 13 +#define SCNUM_READ 14 +#define SCNUM_MKDIR 15 +#define SCNUM_MOUNT 16 +#define SCNUM_CHDIR 17 +#define SCNUM_LSEEK64 18 +#define SCNUM_IOCTL 19 +#define SCNUM_SYNC 20 +#define SCNUM_SIGRETURN 21 +#define SCNUM_SHOW_INFO 22 + +void syscall_handler(trapframe *regs); + +#endif /* _SYSCALL_H */ \ No newline at end of file diff --git a/lab8/include/kernel/task.h b/lab8/include/kernel/task.h new file mode 100644 index 000000000..0b2cb3a1d --- /dev/null +++ b/lab8/include/kernel/task.h @@ -0,0 +1,92 @@ +#ifndef _TASK_H +#define _TASK_H + +#include +#include +#include +#include + +#define STACK_SIZE (4 * PAGE_SIZE) + +#define TASK_MAX_FD 0x10 + +/* Task status */ +#define TASK_NEW 0 +#define TASK_RUNNING 1 +#define TASK_DEAD 2 + +/* Define in include/kernel/signal.h */ +struct signal_head_t; +struct sighand_t; + +struct pt_regs { + void *x19; + void *x20; + void *x21; + void *x22; + void *x23; + void *x24; + void *x25; + void *x26; + void *x27; + void *x28; + void *fp; + void *lr; + void *sp; +}; + +typedef struct _task_struct { + struct pt_regs regs; + pd_t *page_table; + /* The order of the above elements cannot be changed */ + vm_area_meta_t *address_space; + void *kernel_stack; + /* @list is used by run_queue / wait_queue */ + struct list_head list; + /* @task_list links all tasks */ + struct list_head task_list; + uint16 status; + uint16 need_resched:1; + uint32 tid; + uint32 preempt; + /* Signal */ + struct signal_head_t *signal; + struct sighand_t *sighand; + /* Files */ + int maxfd; + struct file fds[TASK_MAX_FD]; + struct vnode *work_dir; +} task_struct; + +#define SAVE_REGS(task) \ + asm volatile ( \ + "stp x19, x20, [%x0, 16 * 0]\n" \ + "stp x21, x22, [%x0, 16 * 1]\n" \ + "stp x23, x24, [%x0, 16 * 2]\n" \ + "stp x25, x26, [%x0, 16 * 3]\n" \ + "stp x27, x28, [%x0, 16 * 4]\n" \ + "stp fp, lr, [%x0, 16 * 5]\n" \ + "mov x9, sp\n" \ + "str x9, [%x0, 16 * 6]\n" \ + : : "r" (&task->regs) \ + ); + +void task_init(void); + +task_struct *task_create(void); +void task_free(task_struct *task); + +task_struct *task_get_by_tid(uint32 tid); + +/* + * Create initial mapping for user program + * + * 0x00003c000000 ~ 0x00003f000000: rw-: Mailbox address + * 0x7f0000000000 ~ : r-x: Kernel functions exposed to users + * 0xffffffffb000 ~ : rw-: Stack + */ +void task_init_map(task_struct *task); + +void task_reset_mm(task_struct *task); + +#endif /* _TASK_H */ \ No newline at end of file diff --git a/lab8/include/kernel/text_user_shared.h b/lab8/include/kernel/text_user_shared.h new file mode 100644 index 000000000..3be42d0ed --- /dev/null +++ b/lab8/include/kernel/text_user_shared.h @@ -0,0 +1,25 @@ +#ifndef _TEXT_USER_SHARED_H +#define _TEXT_USER_SHARED_H + +/* + * See the comment of task_init_map in task.h: + * + * 0x7f0000000000 ~ : r-x: Kernel functions exposed to users + * + * The kernel functions with the SECTION_TUS attribute will be mapped into + * this user address space. + */ + +#define SECTION_TUS __attribute__ ((section (".text.user.shared"))) + +#define TUS2VA(x) ((((uint64)x) - TEXT_USER_SHARED_BASE) + 0x7f0000000000) + +/* From linker.ld */ +extern char _stext_user_shared; +extern char _etext_user_shared; + +#define TEXT_USER_SHARED_BASE (uint64)(&_stext_user_shared) +#define TEXT_USER_SHARED_END (uint64)(&_etext_user_shared) +#define TEXT_USER_SHARED_LEN (TEXT_USER_SHARED_END - TEXT_USER_SHARED_BASE) + +#endif /* _TEXT_USER_SHARED_H */ \ No newline at end of file diff --git a/lab8/include/kernel/timer.h b/lab8/include/kernel/timer.h new file mode 100644 index 000000000..8253f6ad0 --- /dev/null +++ b/lab8/include/kernel/timer.h @@ -0,0 +1,16 @@ +#ifndef _TIMER_H +#define _TIMER_H + +#include + +void timer_init(); +int timer_irq_check(); +void timer_switch_info(); + +/* Call @proc(@args) after @after seconds. */ +void timer_add_proc_after(void (*proc)(void *), void *args, uint32 after); + +/* Call @proc(@args) after 1/@freq second. */ +void timer_add_proc_freq(void (*proc)(void *), void *args, uint32 freq); + +#endif /* _TIMER_H */ \ No newline at end of file diff --git a/lab8/include/kernel/trapframe.h b/lab8/include/kernel/trapframe.h new file mode 100644 index 000000000..530467f54 --- /dev/null +++ b/lab8/include/kernel/trapframe.h @@ -0,0 +1,83 @@ +#ifndef _TRAPFRAME_H +#define _TRAPFRAME_H + +#include +#include + +typedef struct { + uint64 x0; + uint64 x1; + uint64 x2; + uint64 x3; + uint64 x4; + uint64 x5; + uint64 x6; + uint64 x7; + uint64 x8; + uint64 x9; + uint64 x10; + uint64 x11; + uint64 x12; + uint64 x13; + uint64 x14; + uint64 x15; + uint64 x16; + uint64 x17; + uint64 x18; + uint64 x19; + uint64 x20; + uint64 x21; + uint64 x22; + uint64 x23; + uint64 x24; + uint64 x25; + uint64 x26; + uint64 x27; + uint64 x28; + uint64 x29; + uint64 x30; + void *sp_el0; + void *elr_el1; + void *spsr_el1; +} trapframe; + +static inline void show_trapframe(trapframe *regs) +{ + uart_sync_printf("\r\n[*] Trapframe:\r\n"); + uart_sync_printf("\tx0: %llx\r\n", regs->x0); + uart_sync_printf("\tx1: %llx\r\n", regs->x1); + uart_sync_printf("\tx2: %llx\r\n", regs->x2); + uart_sync_printf("\tx3: %llx\r\n", regs->x3); + uart_sync_printf("\tx4: %llx\r\n", regs->x4); + uart_sync_printf("\tx5: %llx\r\n", regs->x5); + uart_sync_printf("\tx6: %llx\r\n", regs->x6); + uart_sync_printf("\tx7: %llx\r\n", regs->x7); + uart_sync_printf("\tx8: %llx\r\n", regs->x8); + uart_sync_printf("\tx9: %llx\r\n", regs->x9); + uart_sync_printf("\tx10: %llx\r\n", regs->x10); + uart_sync_printf("\tx11: %llx\r\n", regs->x11); + uart_sync_printf("\tx12: %llx\r\n", regs->x12); + uart_sync_printf("\tx13: %llx\r\n", regs->x13); + uart_sync_printf("\tx14: %llx\r\n", regs->x14); + uart_sync_printf("\tx15: %llx\r\n", regs->x15); + uart_sync_printf("\tx16: %llx\r\n", regs->x16); + uart_sync_printf("\tx17: %llx\r\n", regs->x17); + uart_sync_printf("\tx18: %llx\r\n", regs->x18); + uart_sync_printf("\tx19: %llx\r\n", regs->x19); + uart_sync_printf("\tx20: %llx\r\n", regs->x20); + uart_sync_printf("\tx21: %llx\r\n", regs->x21); + uart_sync_printf("\tx22: %llx\r\n", regs->x22); + uart_sync_printf("\tx23: %llx\r\n", regs->x23); + uart_sync_printf("\tx24: %llx\r\n", regs->x24); + uart_sync_printf("\tx25: %llx\r\n", regs->x25); + uart_sync_printf("\tx26: %llx\r\n", regs->x26); + uart_sync_printf("\tx27: %llx\r\n", regs->x27); + uart_sync_printf("\tx28: %llx\r\n", regs->x28); + uart_sync_printf("\tx29: %llx\r\n", regs->x29); + uart_sync_printf("\tx30: %llx\r\n", regs->x30); + uart_sync_printf("\tsp_el0 : %llx\r\n", regs->sp_el0); + uart_sync_printf("\telr_el1 : %llx\r\n", regs->elr_el1); + uart_sync_printf("\tspsr_el1: %llx\r\n", regs->spsr_el1); +} + +#endif /* _TRAPFRAME_H */ \ No newline at end of file diff --git a/lab8/include/kernel/waitqueue.h b/lab8/include/kernel/waitqueue.h new file mode 100644 index 000000000..8c31735b3 --- /dev/null +++ b/lab8/include/kernel/waitqueue.h @@ -0,0 +1,19 @@ +#ifndef _WAITQUEUE_H +#define _WAITQUEUE_H + +#include + +typedef struct { + struct list_head list; +} wait_queue_head; + +wait_queue_head *wq_create(void); + +int wq_empty(wait_queue_head *head); + +void wq_add_task(task_struct *task, wait_queue_head *head); +void wq_del_task(task_struct *task); + +task_struct *wq_get_first_task(wait_queue_head *head); + +#endif /* _WAITQUEUE_H */ \ No newline at end of file diff --git a/lab8/include/lib/bitops.h b/lab8/include/lib/bitops.h new file mode 100644 index 000000000..53ee638d9 --- /dev/null +++ b/lab8/include/lib/bitops.h @@ -0,0 +1,12 @@ +#ifndef _BITOPS_H +#define _BITOPS_H + +// Find First bit Set +#define ffs(x) __builtin_ffs(x) + +static inline int fls(unsigned int x) +{ + return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; +} + +#endif \ No newline at end of file diff --git a/lab8/include/lib/list.h b/lab8/include/lib/list.h new file mode 100644 index 000000000..671158b9b --- /dev/null +++ b/lab8/include/lib/list.h @@ -0,0 +1,459 @@ +/* Linux-like doubly-linked list implementation */ +#ifndef _LIST_H +#define _LIST_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include + +/* "typeof" is a GNU extension. + * Reference: https://gcc.gnu.org/onlinedocs/gcc/Typeof.html + */ +#if defined(__GNUC__) +#define __LIST_HAVE_TYPEOF 1 +#endif /* defined(__GNUC__) */ + +/** + * struct list_head - Head and node of a doubly-linked list + * @prev: pointer to the previous node in the list + * @next: pointer to the next node in the list + * + * The simple doubly-linked list consists of a head and nodes attached to + * this head. Both node and head share the same struct type. The list_* + * functions and macros can be used to access and modify this data structure. + * + * The @prev pointer of the list head points to the last list node of the + * list and @next points to the first list node of the list. For an empty list, + * both member variables point to the head. + * + * The list nodes are usually embedded in a container structure which holds the + * actual data. Such an container object is called entry. The helper list_entry + * can be used to calculate the object address from the address of the node. + */ +struct list_head { + struct list_head *prev; + struct list_head *next; +}; + +/** + * container_of() - Calculate address of object that contains address ptr + * @ptr: pointer to member variable + * @type: type of the structure containing ptr + * @member: name of the member variable in struct @type + * + * Return: @type pointer of object containing ptr + */ +#ifndef container_of +#ifdef __LIST_HAVE_TYPEOF +#define container_of(ptr, type, member) \ + __extension__({ \ + const __typeof__(((type *) 0)->member) *__pmember = (ptr); \ + (type *) ((char *) __pmember - offsetof(type, member)); \ + }) +#else /* __LIST_HAVE_TYPEOF */ +#define container_of(ptr, type, member) \ + ((type *) ((char *) (ptr) -offsetof(type, member))) +#endif /* __LIST_HAVE_TYPEOF */ +#endif /* container_of */ + +/** + * LIST_HEAD - Declare list head and initialize it + * @head: name of the new object + */ +#define LIST_HEAD(head) struct list_head head = {&(head), &(head)} + +/** + * INIT_LIST_HEAD() - Initialize empty list head + * @head: pointer to list head + * + * This can also be used to initialize a unlinked list node. + * + * A node is usually linked inside a list, will be added to a list in + * the near future or the entry containing the node will be free'd soon. + * + * But an unlinked node may be given to a function which uses list_del(_init) + * before it ends up in a previously mentioned state. The list_del(_init) on an + * initialized node is well defined and safe. But the result of a + * list_del(_init) on an uninitialized node is undefined (unrelated memory is + * modified, crashes, ...). + */ +static inline void INIT_LIST_HEAD(struct list_head *head) +{ + head->next = head; + head->prev = head; +} + +/** + * list_add() - Add a list node to the beginning of the list + * @node: pointer to the new node + * @head: pointer to the head of the list + */ +static inline void list_add(struct list_head *node, struct list_head *head) +{ + struct list_head *next = head->next; + + next->prev = node; + node->next = next; + node->prev = head; + head->next = node; +} + +/** + * list_add_tail() - Add a list node to the end of the list + * @node: pointer to the new node + * @head: pointer to the head of the list + */ +static inline void list_add_tail(struct list_head *node, struct list_head *head) +{ + struct list_head *prev = head->prev; + + prev->next = node; + node->next = head; + node->prev = prev; + head->prev = node; +} + +/** + * list_del() - Remove a list node from the list + * @node: pointer to the node + * + * The node is only removed from the list. Neither the memory of the removed + * node nor the memory of the entry containing the node is free'd. The node + * has to be handled like an uninitialized node. Accessing the next or prev + * pointer of the node is not safe. + * + * Unlinked, initialized nodes are also uninitialized after list_del. + * + * LIST_POISONING can be enabled during build-time to provoke an invalid memory + * access when the memory behind the next/prev pointer is used after a list_del. + * This only works on systems which prohibit access to the predefined memory + * addresses. + */ +static inline void list_del(struct list_head *node) +{ + struct list_head *next = node->next; + struct list_head *prev = node->prev; + + next->prev = prev; + prev->next = next; + +#ifdef LIST_POISONING + node->prev = (struct list_head *) (0x00100100); + node->next = (struct list_head *) (0x00200200); +#endif /* LIST_POISONING */ +} + +/** + * list_del_init() - Remove a list node from the list and reinitialize it + * @node: pointer to the node + * + * The removed node will not end up in an uninitialized state like when using + * list_del. Instead the node is initialized again to the unlinked state. + */ +static inline void list_del_init(struct list_head *node) +{ + list_del(node); + INIT_LIST_HEAD(node); +} + +/** + * list_empty() - Check if list head has no nodes attached + * @head: pointer to the head of the list + * + * Return: 0 - list is not empty !0 - list is empty + */ +static inline int list_empty(const struct list_head *head) +{ + return (head->next == head); +} + +/** + * list_is_singular() - Check if list head has exactly one node attached + * @head: pointer to the head of the list + * + * Return: 0 - list is not singular !0 -list has exactly one entry + */ +static inline int list_is_singular(const struct list_head *head) +{ + return (!list_empty(head) && head->prev == head->next); +} + +/** + * list_splice() - Add list nodes from a list to beginning of another list + * @list: pointer to the head of the list with the node entries + * @head: pointer to the head of the list + * + * All nodes from @list are added to the beginning of the list of @head. + * It is similar to list_add but for multiple nodes. The @list head is not + * modified and has to be initialized to be used as a valid list head/node + * again. + */ +static inline void list_splice(struct list_head *list, struct list_head *head) +{ + struct list_head *head_first = head->next; + struct list_head *list_first = list->next; + struct list_head *list_last = list->prev; + + if (list_empty(list)) + return; + + head->next = list_first; + list_first->prev = head; + + list_last->next = head_first; + head_first->prev = list_last; +} + +/** + * list_splice_tail() - Add list nodes from a list to end of another list + * @list: pointer to the head of the list with the node entries + * @head: pointer to the head of the list + * + * All nodes from @list are added to to the end of the list of @head. + * It is similar to list_add_tail but for multiple nodes. The @list head is not + * modified and has to be initialized to be used as a valid list head/node + * again. + */ +static inline void list_splice_tail(struct list_head *list, + struct list_head *head) +{ + struct list_head *head_last = head->prev; + struct list_head *list_first = list->next; + struct list_head *list_last = list->prev; + + if (list_empty(list)) + return; + + head->prev = list_last; + list_last->next = head; + + list_first->prev = head_last; + head_last->next = list_first; +} + +/** + * list_splice_init() - Move list nodes from a list to beginning of another list + * @list: pointer to the head of the list with the node entries + * @head: pointer to the head of the list + * + * All nodes from @list are added to to the beginning of the list of @head. + * It is similar to list_add but for multiple nodes. + * + * The @list head will not end up in an uninitialized state like when using + * list_splice. Instead the @list is initialized again to the an empty + * list/unlinked state. + */ +static inline void list_splice_init(struct list_head *list, + struct list_head *head) +{ + list_splice(list, head); + INIT_LIST_HEAD(list); +} + +/** + * list_splice_tail_init() - Move list nodes from a list to end of another list + * @list: pointer to the head of the list with the node entries + * @head: pointer to the head of the list + * + * All nodes from @list are added to to the end of the list of @head. + * It is similar to list_add_tail but for multiple nodes. + * + * The @list head will not end up in an uninitialized state like when using + * list_splice. Instead the @list is initialized again to the an empty + * list/unlinked state. + */ +static inline void list_splice_tail_init(struct list_head *list, + struct list_head *head) +{ + list_splice_tail(list, head); + INIT_LIST_HEAD(list); +} + +/** + * list_cut_position() - Move beginning of a list to another list + * @head_to: pointer to the head of the list which receives nodes + * @head_from: pointer to the head of the list + * @node: pointer to the node in which defines the cutting point + * + * All entries from the beginning of the list @head_from to (including) the + * @node is moved to @head_to. + * + * @head_to is replaced when @head_from is not empty. @node must be a real + * list node from @head_from or the behavior is undefined. + */ +static inline void list_cut_position(struct list_head *head_to, + struct list_head *head_from, + struct list_head *node) +{ + struct list_head *head_from_first = head_from->next; + + if (list_empty(head_from)) + return; + + if (head_from == node) { + INIT_LIST_HEAD(head_to); + return; + } + + head_from->next = node->next; + head_from->next->prev = head_from; + + head_to->prev = node; + node->next = head_to; + head_to->next = head_from_first; + head_to->next->prev = head_to; +} + +/** + * list_move() - Move a list node to the beginning of the list + * @node: pointer to the node + * @head: pointer to the head of the list + * + * The @node is removed from its old position/node and add to the beginning of + * @head + */ +static inline void list_move(struct list_head *node, struct list_head *head) +{ + list_del(node); + list_add(node, head); +} + +/** + * list_move_tail() - Move a list node to the end of the list + * @node: pointer to the node + * @head: pointer to the head of the list + * + * The @node is removed from its old position/node and add to the end of @head + */ +static inline void list_move_tail(struct list_head *node, + struct list_head *head) +{ + list_del(node); + list_add_tail(node, head); +} + +/** + * list_entry() - Calculate address of entry that contains list node + * @node: pointer to list node + * @type: type of the entry containing the list node + * @member: name of the list_head member variable in struct @type + * + * Return: @type pointer of entry containing node + */ +#define list_entry(node, type, member) container_of(node, type, member) + +/** + * list_first_entry() - get first entry of the list + * @head: pointer to the head of the list + * @type: type of the entry containing the list node + * @member: name of the list_head member variable in struct @type + * + * Return: @type pointer of first entry in list + */ +#define list_first_entry(head, type, member) \ + list_entry((head)->next, type, member) + +/** + * list_last_entry() - get last entry of the list + * @head: pointer to the head of the list + * @type: type of the entry containing the list node + * @member: name of the list_head member variable in struct @type + * + * Return: @type pointer of last entry in list + */ +#define list_last_entry(head, type, member) \ + list_entry((head)->prev, type, member) + +/** + * list_for_each - iterate over list nodes + * @node: list_head pointer used as iterator + * @head: pointer to the head of the list + * + * The nodes and the head of the list must be kept unmodified while + * iterating through it. Any modifications to the the list will cause undefined + * behavior. + */ +#define list_for_each(node, head) \ + for (node = (head)->next; node != (head); node = node->next) + +/** + * list_for_each_entry - iterate over list entries + * @entry: pointer used as iterator + * @head: pointer to the head of the list + * @member: name of the list_head member variable in struct type of @entry + * + * The nodes and the head of the list must be kept unmodified while + * iterating through it. Any modifications to the the list will cause undefined + * behavior. + * + * FIXME: remove dependency of __typeof__ extension + */ +#ifdef __LIST_HAVE_TYPEOF +#define list_for_each_entry(entry, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) +#endif /* __LIST_HAVE_TYPEOF */ + +/** + * iter_for_each_entry - iterate over list entries from @iter + * @entry: pointer used as iterator + * @iter: pointer to the start of this iteration + * @head: pointer to the head of the list + * @member: name of the list_head member variable in struct type of @entry + * + * FIXME: remove dependency of __typeof__ extension + */ +#ifdef __LIST_HAVE_TYPEOF +#define iter_for_each_entry(entry, iter, head, member) \ + for (entry = list_entry(iter, __typeof__(*entry), member); \ + &entry->member != (head); \ + entry = list_entry(entry->member.next, __typeof__(*entry), member)) +#endif /* __LIST_HAVE_TYPEOF */ + +/** + * list_for_each_safe - iterate over list nodes and allow deletes + * @node: list_head pointer used as iterator + * @safe: list_head pointer used to store info for next entry in list + * @head: pointer to the head of the list + * + * The current node (iterator) is allowed to be removed from the list. Any + * other modifications to the the list will cause undefined behavior. + */ +#define list_for_each_safe(node, safe, head) \ + for (node = (head)->next, safe = node->next; node != (head); \ + node = safe, safe = node->next) + +/** + * list_for_each_entry_safe - iterate over list entries and allow deletes + * @entry: pointer used as iterator + * @safe: @type pointer used to store info for next entry in list + * @head: pointer to the head of the list + * @member: name of the list_head member variable in struct type of @entry + * + * The current node (iterator) is allowed to be removed from the list. Any + * other modifications to the the list will cause undefined behavior. + * + * FIXME: remove dependency of __typeof__ extension + */ +#define list_for_each_entry_safe(entry, safe, head, member) \ + for (entry = list_entry((head)->next, __typeof__(*entry), member), \ + safe = list_entry(entry->member.next, __typeof__(*entry), member); \ + &entry->member != (head); entry = safe, \ + safe = list_entry(safe->member.next, __typeof__(*entry), member)) + +#define list_for_each_entry_safe_rev(entry, safe, head, member) \ + for (entry = list_entry((head)->prev, __typeof__(*entry), member), \ + safe = list_entry(entry->member.prev, __typeof__(*entry), member); \ + &entry->member != (head); entry = safe, \ + safe = list_entry(safe->member.prev, __typeof__(*entry), member)) + +#undef __LIST_HAVE_TYPEOF + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _LIST_H */ \ No newline at end of file diff --git a/lab8/include/lib/string.h b/lab8/include/lib/string.h new file mode 100644 index 000000000..3bcd75df4 --- /dev/null +++ b/lab8/include/lib/string.h @@ -0,0 +1,14 @@ +#ifndef _STRING_H +#define _STRING_H + +int strcmp(const char *str1, const char *str2); +int strncmp(const char *str1, const char *str2, int n); +int strcasecmp(const char *s1, const char *s2); +int strlen(const char *str); +int strcpy(char *dst, const char *src); +char *strcat(char *dest, const char *src); +char *strncat(char *dest, const char *src, int n); + +int atoi(const char *str); + +#endif /* _STRING_H */ \ No newline at end of file diff --git a/lab8/include/lib/types.h b/lab8/include/lib/types.h new file mode 100644 index 000000000..518cb85aa --- /dev/null +++ b/lab8/include/lib/types.h @@ -0,0 +1,18 @@ +#ifndef _TYPES_H +#define _TYPES_H + +#include + +typedef unsigned long long int uint64; +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; + +typedef long long int int64; +typedef int int32; +typedef short int16; +typedef char int8; + +#define PAGE_SIZE 0x1000 + +#endif /* _TYPES_H */ \ No newline at end of file diff --git a/lab8/include/lib/utils.h b/lab8/include/lib/utils.h new file mode 100644 index 000000000..2ebd1fbce --- /dev/null +++ b/lab8/include/lib/utils.h @@ -0,0 +1,89 @@ +#ifndef _UTILS_H +#define _UTILS_H + +#include + +#ifndef __ASSEMBLER__ + +void delay(uint64 cnt); +void put32(uint64 addr, const uint32 val); +uint32 get32(uint64 addr); + +void memzero(char *src, uint64 n); +void memncpy(char *dst, const char *src, uint64 n); +void memset(void *ptr, uint8 value, uint64 num); + +#endif /* __ASSEMBLER__ */ + +// Reference from https://elixir.bootlin.com/linux/latest/source/tools/lib/perf/mmap.c#L299 +#define read_sysreg(r) ({ \ + uint64 __val; \ + asm volatile("mrs %0, " #r : "=r" (__val)); \ + __val; \ +}) + +// Reference from https://elixir.bootlin.com/linux/latest/source/arch/arm64/include/asm/sysreg.h#L1281 +#define write_sysreg(r, v) do { \ + uint64 __val = (uint64)(v); \ + asm volatile("msr " #r ", %x0" \ + : : "rZ" (__val)); \ +} while (0) + +#define enable_interrupt() do { \ + asm volatile("msr DAIFClr, 0xf"); \ +} while (0) + +#define disable_interrupt() do { \ + asm volatile("msr DAIFSet, 0xf"); \ +} while (0) + +#define set_page_table(page_table) do { \ + asm volatile( \ + "mov x9, %0\n" \ + "and x9, x9, #0x0000ffffffffffff\n" \ + "dsb ish\n" \ + "msr ttbr0_el1, x9\n" \ + "tlbi vmalle1is\n" \ + "dsb ish\n" \ + "isb\n" \ + :: "r" (page_table) \ + ); \ +} while (0) + +#define get_page_table() ({ \ + uint64 __val; \ + __val = PA2VA(read_sysreg(TTBR0_EL1)); \ + __val; \ +}) + +static inline uint32 save_and_disable_interrupt(void) +{ + uint32 daif; + + daif = read_sysreg(DAIF); + disable_interrupt(); + + return daif; +} + +static inline void restore_interrupt(uint32 daif) +{ + write_sysreg(DAIF, daif); +} + +#define get_elem_idx(elem, array) \ + (((char *)elem - (char *)array) / sizeof(array[0])) + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) + +#define ALIGN(num, base) ((num + base - 1) & ~(base - 1)) + +#define TO_CHAR_PTR(a) ((char *)(uint64)(a)) + +#define PA2VA(x) (((uint64)(x)) | 0xffff000000000000) +#define VA2PA(x) (((uint64)(x)) & 0x0000ffffffffffff) + +#define M2STR(macro) #macro +#define MC2STR(macro) M2STR(macro) + +#endif /* _UTILS_H */ \ No newline at end of file diff --git a/lab8/initramfs/Makefile b/lab8/initramfs/Makefile new file mode 100644 index 000000000..43e87bd49 --- /dev/null +++ b/lab8/initramfs/Makefile @@ -0,0 +1,33 @@ +CROSS_COMPILE ?= aarch64-linux-gnu- +CC := $(CROSS_COMPILE)gcc +LD := $(CROSS_COMPILE)ld + +CFLAGS := -Wall -nostdlib -nostartfiles -ffreestanding -mgeneral-regs-only + +all: userprog1 userprog2 + +userprog1: userprog1.elf + $(CROSS_COMPILE)objcopy -O binary $^ $@ + +userprog1.elf: linker.ld userprog1.o + $(LD) $(LDFLAGS) -T $< -o $@ userprog1.o + +userprog1.o: userprog1.s + $(CC) $(CFLAGS) -c $< -o $@ + +userprog2: userprog2.elf + $(CROSS_COMPILE)objcopy -O binary $^ $@ + +userprog2.elf: linker.ld userprog2.o + $(LD) $(LDFLAGS) -T $< -o $@ userprog2.o + +userprog2.o: userprog2.c + $(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + rm -f *.o *.elf + +.PHONY: clean-all +clean-all: clean + rm -f userprog1 userprog2 \ No newline at end of file diff --git a/lab8/initramfs/linker.ld b/lab8/initramfs/linker.ld new file mode 100644 index 000000000..ab050c29d --- /dev/null +++ b/lab8/initramfs/linker.ld @@ -0,0 +1,26 @@ +SECTIONS +{ + .start : { + *(.start) + } + + .text : { + *(.text) + } + + .rodata : { + *(.rodata) + } + + .data : { + *(.got) + *(.got.plt) + *(.data*) + } + + _sbss = .; + .bss : { + *(.bss*) + } + _ebss = .; +} \ No newline at end of file diff --git a/lab8/initramfs/syscall.img b/lab8/initramfs/syscall.img new file mode 100644 index 0000000000000000000000000000000000000000..70d4a55393c7a3799b5a86db1305d374b6479580 GIT binary patch literal 246920 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 literal 0 HcmV?d00001 diff --git a/lab8/initramfs/userprog1.s b/lab8/initramfs/userprog1.s new file mode 100644 index 000000000..1e0ab6b7e --- /dev/null +++ b/lab8/initramfs/userprog1.s @@ -0,0 +1,19 @@ +.section ".text" +.global _start +_start: + mov x0, 0 +1: + add x0, x0, 1 + + // syscall_show_info + mov x8, 10 + svc 0 + + cmp x0, 5 + blt 1b +1: + // syscall_exit + mov x8, 5 + svc 0 + + b 1b diff --git a/lab8/initramfs/userprog2 b/lab8/initramfs/userprog2 new file mode 100644 index 0000000000000000000000000000000000000000..6f524be75c1132650afeed068840f041bb7513ef GIT binary patch literal 3152 zcmdT`TWnNC82)E>TMCp?>}m-$p3_PxiV5YSbdiKv$|ZtIU6&U@yW7&(N~ITyHZHbt-i!o6ju!24Tvn`;gF&IQWk>&W!nX|ixUWh*U;3kuq z`M>}E|L31gCq5ob`^mIzHn^UsS1hDtY9UV&Q4bBwH4icBbuMhME(7V9ZOY_WL(2q-5*b}g)5p{$aMIE`=Jaa#= zJ0Qo%7VtP3;Ax;UMzOH;`DLF1Mv<5sGaTO%dh8lB0l3)8uEaSFE>(P>ddmZ;(u^q5j# zI`OHKvwZlLhZVr`WBIU@zsB&WZ68c0jyd+ziBBAU0h=k<6wp0Zb_6*~!LAM+ry;B9 z{xj*s@qaCk`V60(OnwiA#2zxs!SmBN9@PiZM;kSniad*jMpF4iuM+XlFOZS7q5#cO zb-NjtHH_b|qtbWfzsi3)k<7(kO39HD)Eu#b|JP@Tq62wG6fiT|psJ^JsepB?&A>O;TDylTDFF@QW|?!C}Gl)(dJN*P;2Od0;8tRs$Z#km7_ zbbxjYI?z86k>M>+vROI7I*cNUYS;^J$Nm-T5YyDYKZt!laOlu_SVzoH(Kp~jd=5{> zeB4@z*bW0@_o08Ty!cw&N7fAB6*|pom_x}1@YRFo-7!1?@HFJ3uaRF)P9G)3dGz6V z9(n?CzAWR^!XcSEg3WRER{R5d9-ay8;oBu^_J0(M?3c`Zs6g(+%!sT;Ty+!K^Y}Sw z?mRpb#)3H}Ft38JvFv}IJLj8pXDeoBg!zofwHs>oWqMooezt$nBk@bQ`EnI=G@ba& z{l?x`Ge*w&Wtj61;#*&dIbVx8zYcSL16kj1gsy!)Q{3(D()K=P;%%}-zHyt_Oi8;Q z^Qo51Q9mdat+@Ex8& zjWRYU$dkGJsrUG@pUlg66Wq5#{bvzX=Cj$_s@S1}HgDR|)cK^|-m-PMUb%I~G)a>` zm%go~wY47L{KfYu%%wlHy?tlba**8n#+_Y~pjYm2Rk-v>({n95TH3Y)>2?s8UfbN# z3X4tMO^y0ac+lS2_Vgmjki953GWzS{olV=JzfsD0y><1i>2B%r>VLc|-nb1$TU(V` zs$R5s$dC#9a zTO_YRtQxFWez$GRL5bHzfJixc9|FBv(Tn?h{cOD}C-HWyQ^2{x^}ayA|4|R#1NxO) z;75TM|6$v6J@V^3@~1!#0^g!=$L~!Z{0iuGzzGcszuWtY`e*ERaUG;$(5wHn?X7+X zuj`xEKXuiC0^gZ)XTOob%NUk|r~NP6HgJZH0oE7nFL_ESk$4pNDc~yQ9 zKLf8;__!S5PcdBwzSM(n@W{Uhy!iU$IXn%#8u(=Pe*^w7@E(u;29N%rkLV-du78gI HnHv5L?A +#include + +#define SIGN 1 + +typedef unsigned long long int uint64; +typedef unsigned int uint32; +typedef unsigned short uint16; +typedef unsigned char uint8; + +typedef long long int int64; +typedef int int32; +typedef short int16; +typedef char int8; + +#define SYS_GETPID 0 +#define SYS_UART_RECV 1 +#define SYS_UART_WRITE 2 +#define SYS_EXEC 3 +#define SYS_FORK 4 +#define SYS_EXIT 5 +#define SYS_MBOX_CALL 6 +#define SYS_KILL_PID 7 + +int start(void) __attribute__((section(".start"))); + +uint64 syscall(uint64 syscall_num, + void *x0, + void *x1, + void *x2, + void *x3, + void *x4, + void *x5) +{ + uint64 result; + + asm volatile ( + "ldr x8, %0\n" + "ldr x0, %1\n" + "ldr x1, %2\n" + "ldr x2, %3\n" + "ldr x3, %4\n" + "ldr x4, %5\n" + "ldr x5, %6\n" + "svc 0\n" + :: "m" (syscall_num), "m" (x0), "m" (x1), + "m" (x2), "m" (x3), "m" (x4), "m" (x5) + ); + + asm volatile ( + "str x0, %0\n" + : "=m" (result) + ); + + return result; +} + +int getpid() +{ + return (int)syscall(SYS_GETPID, 0, 0, 0, 0, 0, 0); +} + +void uart_recv(const char buf[], size_t size) +{ + syscall(SYS_UART_RECV, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +void uart_write(const char buf[], size_t size) +{ + syscall(SYS_UART_WRITE, (void *)buf, (void *)size, 0, 0, 0, 0); +} + +static void uart_send_char(char c) +{ + uart_write(&c, 1); +} + +static void uart_send_string(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + uart_send_char(str[i]); + } +} + +static void uart_send_num(int64 num, int base, int type) +{ + static const char digits[16] = "0123456789ABCDEF"; + char tmp[66]; + int i; + + if (type | SIGN) { + if (num < 0) { + uart_send_char('-'); + } + } + + i = 0; + + if (num == 0) { + tmp[i++] = '0'; + } else { + while (num != 0) { + uint8 r = (uint32)num % base; + num = (uint32)num / base; + tmp[i++] = digits[r]; + } + } + + while (--i >= 0) { + uart_send_char(tmp[i]); + } +} + +static void _uart_printf(const char *fmt, va_list args) +{ + const char *s; + char c; + uint64 num; + char width; + + for (; *fmt; ++fmt) { + if (*fmt != '%') { + uart_send_char(*fmt); + continue; + } + + ++fmt; + + // Get width + width = 0; + if (fmt[0] == 'l' && fmt[1] == 'l') { + width = 1; + fmt += 2; + } + + switch (*fmt) { + case 'c': + c = va_arg(args, uint32) & 0xff; + uart_send_char(c); + continue; + case 'd': + if (width) { + num = va_arg(args, int64); + } else { + num = va_arg(args, int32); + } + uart_send_num(num, 10, SIGN); + continue; + case 's': + s = va_arg(args, char *); + uart_send_string(s); + continue; + case 'x': + if (width) { + num = va_arg(args, uint64); + } else { + num = va_arg(args, uint32); + } + uart_send_num(num, 16, 0); + continue; + } + } +} + +void uart_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + _uart_printf(fmt, args); + + va_end(args); +} + +void exec(const char *name, char *const argv[]) +{ + syscall(SYS_EXEC, (void *)name, (void *)argv, 0, 0, 0, 0); +} + +int fork(void) +{ + return (int)syscall(SYS_FORK, 0, 0, 0, 0, 0, 0); +} + +void exit(void) +{ + syscall(SYS_EXIT, 0, 0, 0, 0, 0, 0); +} + +void mbox_call(unsigned char ch, unsigned int *mbox) +{ + syscall(SYS_MBOX_CALL, (void *)(uint64)ch, mbox, 0, 0, 0, 0); +} + +void kill_pid(int pid) +{ + syscall(SYS_KILL_PID, (void *)(uint64)pid, 0, 0, 0, 0, 0); +} + +/* Channels */ +#define MAILBOX_CH_PROP 8 + +/* Tags */ +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +/* Tag identifier */ +#define GET_BOARD_REVISION 0x00010002 + +/* Others */ +#define REQUEST_CODE 0x00000000 + +static unsigned int __attribute__((aligned(0x10))) mailbox[16]; + +// It should be 0xa020d3 for rpi3 b+ +unsigned int get_board_revision(void) +{ + mailbox[0] = 7 * 4; // Buffer size in bytes + mailbox[1] = REQUEST_CODE; + // Tags begin + mailbox[2] = GET_BOARD_REVISION; // Tag identifier + mailbox[3] = 4; // Value buffer size in bytes + mailbox[4] = TAG_REQUEST_CODE; // Request/response codes + mailbox[5] = 0; // Optional value buffer + // Tags end + mailbox[6] = END_TAG; + + mbox_call(MAILBOX_CH_PROP, mailbox); // Message passing procedure call + + return mailbox[5]; +} + +void show_stack(void) +{ + uint64 sp; + + asm volatile ( + "mov x9, sp\n" + "str x9, %0\n" + : "=m" (sp) + ); + + uart_printf("[User] Stack: %llx\r\n", sp); +} + +int start(void) +{ + char buf1[0x10] = { 0 }; + int pid, revision; + + pid = getpid(); + uart_printf("[User] pid: %d\r\n", pid); + + uart_printf("[User] kill_pid(2)\r\n"); + kill_pid(2); + + uart_printf("[User] Input:\r\n"); + uart_recv(buf1, 8); + uart_printf("[User] Output: %s\r\n", buf1); + + revision = get_board_revision(); + uart_printf("[User] Revision: %x\r\n", revision); + + pid = fork(); + + if (pid == 0) { + uart_printf("[User] Child: exec userprog1\r\n"); + show_stack(); + exec("userprog1", NULL); + } else { + uart_printf("[User] Parent: child pid: %d\r\n", pid); + show_stack(); + } + + uart_printf("[User] Exit\r\n"); + exit(); + return 0; +} \ No newline at end of file diff --git a/lab8/initramfs/vfs1.img b/lab8/initramfs/vfs1.img new file mode 100644 index 0000000000000000000000000000000000000000..2c41bd71abb5faca75b99d85fac8cb66d8abc187 GIT binary patch literal 404216 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�$5T3bfUfi!~)t8f40G1mc=YEL3e#o195=B+7?@H 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

    9zL@=m*GkFg> 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

    sAsSy>wpQsKfiH#t&|}wslIi!%N7MJ|6Wb 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 Y@}IBef4!gR{Wn|tpKi7M-`Dd00N}u82><{9 literal 0 HcmV?d00001 diff --git a/lab8/initramfs/vfs2.img b/lab8/initramfs/vfs2.img new file mode 100644 index 0000000000000000000000000000000000000000..f7baf46075281bca55f5448fbcc9789e842effbb GIT binary patch literal 404984 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
    LaIRxxGkGu2Nc^r*p2nQQ3R%~CR5{JU3A)Ai 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
    SF)2$rkIVdBRwZU;YFI)_}YEc(*mgDU?` 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 Y|NVQD{zsGk@BjU0zWVPb{hucNe;je&3jhEB literal 0 HcmV?d00001 From ee414ae95158db7db3b7f44b005e37d90413f446 Mon Sep 17 00:00:00 2001 From: xlt200 <63595977+xlt200@users.noreply.github.com> Date: Thu, 27 Jun 2024 09:41:03 +0800 Subject: [PATCH 24/24] Add files via upload --- lab8/src/bootloader/BCM2837.c | 18 + lab8/src/bootloader/head.S | 71 ++ lab8/src/bootloader/linker.ld | 36 + lab8/src/bootloader/main.c | 118 ++ lab8/src/bootloader/mini_uart.c | 191 ++++ lab8/src/bootloader/rpi3.c | 101 ++ lab8/src/kernel/BCM2837.c | 18 + lab8/src/kernel/cpio.c | 51 + lab8/src/kernel/entry.c | 25 + lab8/src/kernel/exec.S | 40 + lab8/src/kernel/exec.c | 94 ++ lab8/src/kernel/fdt.c | 135 +++ lab8/src/kernel/fs/cpiofs.c | 573 ++++++++++ lab8/src/kernel/fs/fat32fs.c | 1673 ++++++++++++++++++++++++++++ lab8/src/kernel/fs/framebufferfs.c | 337 ++++++ lab8/src/kernel/fs/fsinit.c | 39 + lab8/src/kernel/fs/tmpfs.c | 477 ++++++++ lab8/src/kernel/fs/uartfs.c | 178 +++ lab8/src/kernel/fs/vfs.c | 585 ++++++++++ lab8/src/kernel/head.S | 316 ++++++ lab8/src/kernel/irq.c | 255 +++++ lab8/src/kernel/kthread.c | 117 ++ lab8/src/kernel/linker.ld | 46 + lab8/src/kernel/main.c | 306 +++++ lab8/src/kernel/mini_uart.c | 373 +++++++ lab8/src/kernel/mm/early_alloc.c | 26 + lab8/src/kernel/mm/mm.c | 138 +++ lab8/src/kernel/mm/page_alloc.c | 291 +++++ lab8/src/kernel/mm/sc_alloc.c | 192 ++++ lab8/src/kernel/mmu.c | 546 +++++++++ lab8/src/kernel/mode_switch.c | 12 + lab8/src/kernel/panic.c | 20 + lab8/src/kernel/preempt.c | 25 + lab8/src/kernel/rpi3.c | 87 ++ lab8/src/kernel/sched.S | 33 + lab8/src/kernel/sched.c | 78 ++ lab8/src/kernel/sdhost.c | 234 ++++ lab8/src/kernel/signal.c | 253 +++++ lab8/src/kernel/syscall.c | 292 +++++ lab8/src/kernel/task.c | 123 ++ lab8/src/kernel/timer.S | 18 + lab8/src/kernel/timer.c | 314 ++++++ lab8/src/kernel/waitqueue.c | 50 + lab8/src/lib/string.c | 146 +++ lab8/src/lib/utils.S | 47 + lab8/tools/buildimg.sh | 51 + lab8/tools/createimg.sh | 34 + lab8/tools/loadkernel.py | 39 + 48 files changed, 9222 insertions(+) create mode 100644 lab8/src/bootloader/BCM2837.c create mode 100644 lab8/src/bootloader/head.S create mode 100644 lab8/src/bootloader/linker.ld create mode 100644 lab8/src/bootloader/main.c create mode 100644 lab8/src/bootloader/mini_uart.c create mode 100644 lab8/src/bootloader/rpi3.c create mode 100644 lab8/src/kernel/BCM2837.c create mode 100644 lab8/src/kernel/cpio.c create mode 100644 lab8/src/kernel/entry.c create mode 100644 lab8/src/kernel/exec.S create mode 100644 lab8/src/kernel/exec.c create mode 100644 lab8/src/kernel/fdt.c create mode 100644 lab8/src/kernel/fs/cpiofs.c create mode 100644 lab8/src/kernel/fs/fat32fs.c create mode 100644 lab8/src/kernel/fs/framebufferfs.c create mode 100644 lab8/src/kernel/fs/fsinit.c create mode 100644 lab8/src/kernel/fs/tmpfs.c create mode 100644 lab8/src/kernel/fs/uartfs.c create mode 100644 lab8/src/kernel/fs/vfs.c create mode 100644 lab8/src/kernel/head.S create mode 100644 lab8/src/kernel/irq.c create mode 100644 lab8/src/kernel/kthread.c create mode 100644 lab8/src/kernel/linker.ld create mode 100644 lab8/src/kernel/main.c create mode 100644 lab8/src/kernel/mini_uart.c create mode 100644 lab8/src/kernel/mm/early_alloc.c create mode 100644 lab8/src/kernel/mm/mm.c create mode 100644 lab8/src/kernel/mm/page_alloc.c create mode 100644 lab8/src/kernel/mm/sc_alloc.c create mode 100644 lab8/src/kernel/mmu.c create mode 100644 lab8/src/kernel/mode_switch.c create mode 100644 lab8/src/kernel/panic.c create mode 100644 lab8/src/kernel/preempt.c create mode 100644 lab8/src/kernel/rpi3.c create mode 100644 lab8/src/kernel/sched.S create mode 100644 lab8/src/kernel/sched.c create mode 100644 lab8/src/kernel/sdhost.c create mode 100644 lab8/src/kernel/signal.c create mode 100644 lab8/src/kernel/syscall.c create mode 100644 lab8/src/kernel/task.c create mode 100644 lab8/src/kernel/timer.S create mode 100644 lab8/src/kernel/timer.c create mode 100644 lab8/src/kernel/waitqueue.c create mode 100644 lab8/src/lib/string.c create mode 100644 lab8/src/lib/utils.S create mode 100644 lab8/tools/buildimg.sh create mode 100644 lab8/tools/createimg.sh create mode 100644 lab8/tools/loadkernel.py diff --git a/lab8/src/bootloader/BCM2837.c b/lab8/src/bootloader/BCM2837.c new file mode 100644 index 000000000..dabb7940c --- /dev/null +++ b/lab8/src/bootloader/BCM2837.c @@ -0,0 +1,18 @@ +#include + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +void BCM2837_reset(int tick) { // reboot after watchdog timer expire + put32(PM_RSTC, PM_PASSWORD | 0x20); // full reset + put32(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick + + // Never return + while (1) {} +} + +void BCM2837_cancel_reset() { + put32(PM_RSTC, PM_PASSWORD | 0); // full reset + put32(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab8/src/bootloader/head.S b/lab8/src/bootloader/head.S new file mode 100644 index 000000000..655e021cf --- /dev/null +++ b/lab8/src/bootloader/head.S @@ -0,0 +1,71 @@ +// Reference: https://github.com/s-matyukevich/raspberry-pi-os +.section ".text.boot" + +.globl _start +_start: + // Preserve flattened devicetree pointer + mov x19, x0 + + // Check CPU id + mrs x0, mpidr_el1 + and x0, x0, #0xff + + // Hang other CPUs + cbnz x0, proc_hang + + // Get offset + bl get_offset +_get_offset_ret: + + // Relocate bootloader + b.ne relocate + + // Initialize bss + adr x0, _sbss + adr x1, _ebss + sub x1, x1, x0 + bl memzero + + // Initialize stack + ldr x0, =_stack_top + mov sp, x0 + // Pass flattened devicetree pointer + mov x0, x19 + bl start_bootloader + + // Should never return +proc_hang: + b proc_hang + +get_offset: + adr x0, _get_offset_ret + adr x1, _start + sub x0, x0, x1 + sub x0, lr, x0 + ldr x1, =_bootloader + subs x0, x0, x1 + ret + +relocate: + mov x2, x0 + + // Get Dest + ldr x0, =_bootloader + + // Get source + adr x3, _get_offset_ret + adr x1, _start + sub x1, x3, x1 + sub x1, lr, x1 + + // Get length + ldr x2, =_bootloader + ldr x3, =_edata + sub x2, x3, x2 + bl memncpy + + // Pass flattened devicetree pointer + mov x0, x19 + ldr x1, =_bootloader + br x1 + // No return \ No newline at end of file diff --git a/lab8/src/bootloader/linker.ld b/lab8/src/bootloader/linker.ld new file mode 100644 index 000000000..5bc75a912 --- /dev/null +++ b/lab8/src/bootloader/linker.ld @@ -0,0 +1,36 @@ +_bootloader = 0x60000; +_kernel = 0x80000; +_stack_top = 0x400000; + +SECTIONS +{ + . = _bootloader; + + .text.boot : { + *(.text.boot) + } + + .text : { + *(.text) + } + + .rodata : { + *(.rodata) + } + + .data : { + *(.got) + *(.got.plt) + *(.data) + } + _edata = .; + + _sbss = .; + .bss : { + *(.bss*) + } + _ebss = .; + + . = _stack_top; + _sstack = .; +} \ No newline at end of file diff --git a/lab8/src/bootloader/main.c b/lab8/src/bootloader/main.c new file mode 100644 index 000000000..65973ab7b --- /dev/null +++ b/lab8/src/bootloader/main.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include + +#define BUFSIZE 0x100 + +extern char _kernel[]; +char shell_buf[BUFSIZE]; +char *fdt_base; + +typedef void (*kernel_funcp)(char *fdt); + +static void load_kernel(void) +{ + // Loading kernel Protocol: + // 4 bytes: The kernel image length n + // n bytes: The kernel image + // Bootloader will store kernel to 0x80000 and then jump to it + unsigned int len; + char *p = _kernel; + + uart_printf("[*] Kernel base address: %x\r\n", _kernel); + + len = uart_recv_uint(); + + uart_printf("[*] Kernel image length: %d\r\n", len); + + while (len--) { + *p++ = uart_recv(); + } + + // Execute kernel + ((kernel_funcp)_kernel)(fdt_base); +} + +static void cmd_help(void) +{ + uart_printf( + "help\t: " "print this help menu" "\r\n" + "hello\t: " "print Hello World!" "\r\n" + "hwinfo\t: " "print hardware info" "\r\n" + "load\t: " "load kernel" "\r\n" + "reboot\t: " "reboot the device" "\r\n" + ); +} + +static void cmd_hello(void) +{ + uart_printf("Hello World!\r\n"); +} + +static void cmd_hwinfo(void) +{ + unsigned int rev; + struct arm_memory_info ami; + + // Board revision + rev = get_board_revision(); + uart_printf("[*] Revision: %x\r\n", rev); + + // ARM memory base address and size + get_arm_memory(&ami); + uart_printf("[*] ARM memory base address: %x\r\n", ami.baseaddr); + uart_printf("[*] ARM memory size: %d\r\n", ami.size); +} + +static void cmd_loadkernel(void) +{ + uart_printf("[*] Loading kernel ...\r\n"); + load_kernel(); +} + +static void cmd_reboot(void) +{ + BCM2837_reset(10); +} + +static int shell_read_cmd(void) +{ + return uart_recvline(shell_buf, BUFSIZE); +} + +static void shell(void) +{ + // One char maybe be received + uart_recv(); + + while (1) { + uart_printf("# "); + shell_read_cmd(); + uart_printf("\r\n"); + if (!strcmp("help", shell_buf)) { + cmd_help(); + } else if (!strcmp("hello", shell_buf)) { + cmd_hello(); + } else if (!strcmp("hwinfo", shell_buf)) { + cmd_hwinfo(); + } else if (!strcmp("load", shell_buf)) { + cmd_loadkernel(); + } else if (!strcmp("reboot", shell_buf)) { + cmd_reboot(); + } else { + // Just echo back + uart_printf("%s\r\n", shell_buf); + } + } +} + +void start_bootloader(char *fdt) +{ + fdt_base = fdt; + + uart_init(); + uart_printf("[*] Bootloader\r\n"); + + shell(); +} \ No newline at end of file diff --git a/lab8/src/bootloader/mini_uart.c b/lab8/src/bootloader/mini_uart.c new file mode 100644 index 000000000..217f65d37 --- /dev/null +++ b/lab8/src/bootloader/mini_uart.c @@ -0,0 +1,191 @@ +// Ref: https://github.com/s-matyukevich/raspberry-pi-os/blob/master/src/lesson01/src/mini_uart.c +#include +#include +#include +#include + +#define SIGN 1 + +#define BUFSIZE 0x100 + +char uart_recv(void) +{ + while (!(get32(AUX_MU_LSR_REG) & 0x01)) {}; + + return (get32(AUX_MU_IO_REG) & 0xFF); +} + +void uart_send(char c) +{ + while (!(get32(AUX_MU_LSR_REG) & 0x20)) {}; + + put32(AUX_MU_IO_REG, c); +} + +uint32 uart_recv_uint(void) +{ + char buf[4]; + + for (int i = 0; i < 4; ++i) { + buf[i] = uart_recv(); + } + + return *((uint32*)buf); +} + +uint32 uart_recvline(char *buff, int maxlen) +{ + uint32 cnt = 0; + + // Reserve space for NULL byte + maxlen--; + + while (maxlen) { + char c = uart_recv(); + + if (c == '\r') { + // TODO: what if c == '\0'? + break; + } + + uart_send(c); + *buff = c; + buff++; + cnt += 1; + maxlen -= 1; + } + + *buff = 0; + + return cnt; +} + +void uart_sendn(char *str, int n) +{ + while (n--) { + uart_send(*str++); + } +} + +static void uart_send_string(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + uart_send(str[i]); + } +} + +// Ref: https://elixir.bootlin.com/linux/v3.5/source/arch/x86/boot/printf.c#L43 +/* + * @num: output number + * @base: 10 or 16 + */ +static void uart_send_num(int64 num, int base, int type) +{ + static const char digits[16] = "0123456789ABCDEF"; + char tmp[66]; + int i; + + if (type & SIGN) { + if (num < 0) { + uart_send('-'); + } + } + + i = 0; + + if (num == 0) { + tmp[i++] = '0'; + } else { + while (num != 0) { + uint8 r = ((uint64)num) % base; + num = ((uint64)num) / base; + tmp[i++] = digits[r]; + } + } + + while (--i >= 0) { + uart_send(tmp[i]); + } +} + +// Ref: https://elixir.bootlin.com/linux/v3.5/source/arch/x86/boot/printf.c#L115 +void uart_printf(char *fmt, ...) +{ + const char *s; + char c; + uint64 num; + char width; + + va_list args; + va_start(args, fmt); + + for (; *fmt; ++fmt) { + if (*fmt != '%') { + uart_send(*fmt); + continue; + } + + ++fmt; + + // Get width + width = 0; + if (fmt[0] == 'l' && fmt[1] == 'l') { + width = 1; + fmt += 2; + } + + switch (*fmt) { + case 'c': + c = va_arg(args, uint32) & 0xff; + uart_send(c); + continue; + case 'd': + if (width) { + num = va_arg(args, int64); + } else { + num = va_arg(args, int32); + } + uart_send_num(num, 10, SIGN); + continue; + case 's': + s = va_arg(args, char *); + uart_send_string(s); + continue; + case 'x': + if (width) { + num = va_arg(args, uint64); + } else { + num = va_arg(args, uint32); + } + uart_send_num(num, 16, 0); + continue; + } + } +} + +void uart_init(void) +{ + unsigned int selector; + + selector = get32(GPFSEL1); + selector &= ~(7 << 12); // Clean gpio14 + selector |= 2 << 12; // Set alt5 for gpio14 + selector &= ~(7 << 15); // Clean gpio15 + selector |= 2 << 15; // Set alt5 for gpio15 + put32(GPFSEL1, selector); + + put32(GPPUD, 0); + delay(150); + put32(GPPUDCLK0, (1 << 14) | (1 << 15)); + delay(150); + put32(GPPUDCLK0, 0); + + put32(AUX_ENABLES, 1); // Enable mini uart (this also enables access to its registers) + put32(AUX_MU_CNTL_REG, 0); // Disable auto flow control and disable receiver and transmitter (for now) + put32(AUX_MU_IER_REG, 0); // Disable receive and transmit interrupts + put32(AUX_MU_LCR_REG, 3); // Enable 8 bit mode + put32(AUX_MU_MCR_REG, 0); // Set RTS line to be always high + put32(AUX_MU_BAUD_REG, 270); // Set baud rate to 115200 + put32(AUX_MU_IIR_REG, 6); // Clear the Rx/Tx FIFO + put32(AUX_MU_CNTL_REG, 3); // Finally, enable transmitter and receiver +} \ No newline at end of file diff --git a/lab8/src/bootloader/rpi3.c b/lab8/src/bootloader/rpi3.c new file mode 100644 index 000000000..471e2a308 --- /dev/null +++ b/lab8/src/bootloader/rpi3.c @@ -0,0 +1,101 @@ +// Ref: +// https://github.com/bztsrc/raspi3-tutorial/blob/master/04_mailboxes/mbox.h +// https://github.com/raspberrypi/firmware/wiki/Mailboxes +// https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes +#include +#include +#include + +/* Mailbox registers */ +#define MAILBOX_BASE PERIPHERALS_BASE + 0xb880 +#define MAILBOX_READ MAILBOX_BASE +#define MAILBOX_STATUS MAILBOX_BASE + 0x18 +#define MAILBOX_WRITE MAILBOX_BASE + 0x20 + +/* Tags */ +#define GET_BOARD_REVISION 0x00010002 +#define GET_ARM_MEMORY 0x00010005 + +/* Channels */ +#define MAILBOX_CH_POWER 0 +#define MAILBOX_CH_FB 1 +#define MAILBOX_CH_VUART 2 +#define MAILBOX_CH_VCHIQ 3 +#define MAILBOX_CH_LEDS 4 +#define MAILBOX_CH_BTNS 5 +#define MAILBOX_CH_TOUCH 6 +#define MAILBOX_CH_COUNT 7 +#define MAILBOX_CH_PROP 8 + +/* Others */ +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 + +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +// Aligned buffer +static unsigned int __attribute__((aligned(0x10))) mailbox[16]; + +void mailbox_call(unsigned char channel, unsigned int *mb) +{ + // Write the data (shifted into the upper 28 bits) combined with + // the channel (in the lower four bits) to the write register. + unsigned int r = (((unsigned long)mb) & ~0xf) | channel; + + // Check if Mailbox 0 status register’s full flag is set. + while ((get32(MAILBOX_STATUS) & MAILBOX_FULL)) {}; + + // If not, then you can write to Mailbox 1 Read/Write register. + put32(MAILBOX_WRITE, r); + + while (1) { + // Check if Mailbox 0 status register’s empty flag is set. + while ((get32(MAILBOX_STATUS) & MAILBOX_EMPTY)) {}; + + // If not, then you can read from Mailbox 0 Read/Write register. + // Check if the value is the same as you wrote in step 1. + if (r == get32(MAILBOX_READ)) + return; + } +} + +// It should be 0xa020d3 for rpi3 b+ +unsigned int get_board_revision(void) +{ + mailbox[0] = 7 * 4; // Buffer size in bytes + mailbox[1] = REQUEST_CODE; + // Tags begin + mailbox[2] = GET_BOARD_REVISION; // Tag identifier + mailbox[3] = 4; // Value buffer size in bytes + mailbox[4] = TAG_REQUEST_CODE; // Request/response codes + mailbox[5] = 0; // Optional value buffer + // Tags end + mailbox[6] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // Message passing procedure call + + return mailbox[5]; +} + +void get_arm_memory(struct arm_memory_info *info) +{ + mailbox[0] = 8 * 4; // Buffer size in bytes + mailbox[1] = REQUEST_CODE; + // Tags begin + mailbox[2] = GET_ARM_MEMORY; // Tag identifier + mailbox[3] = 8; // Value buffer size in bytes + mailbox[4] = TAG_REQUEST_CODE; // Request/response codes + mailbox[5] = 0; // Optional value buffer + mailbox[6] = 0; // Optional value buffer + // Tags end + mailbox[7] = END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // Message passing procedure call + + info->baseaddr = mailbox[5]; + info->size = mailbox[6]; +} diff --git a/lab8/src/kernel/BCM2837.c b/lab8/src/kernel/BCM2837.c new file mode 100644 index 000000000..64d2ebdc3 --- /dev/null +++ b/lab8/src/kernel/BCM2837.c @@ -0,0 +1,18 @@ +#include + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +void BCM2837_reset(int tick) { // reboot after watchdog timer expire + put32(PA2VA(PM_RSTC), PM_PASSWORD | 0x20); // full reset + put32(PA2VA(PM_WDOG), PM_PASSWORD | tick); // number of watchdog tick + + // Never return + while (1) {} +} + +void BCM2837_cancel_reset() { + put32(PA2VA(PM_RSTC), PM_PASSWORD | 0); // full reset + put32(PA2VA(PM_WDOG), PM_PASSWORD | 0); // number of watchdog tick +} diff --git a/lab8/src/kernel/cpio.c b/lab8/src/kernel/cpio.c new file mode 100644 index 000000000..20716e9cb --- /dev/null +++ b/lab8/src/kernel/cpio.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +void *initramfs_base; +void *initramfs_end; + +static int initramfs_fdt_parser(int level, char *cur, char *dt_strings) +{ + struct fdt_node_header *nodehdr = (struct fdt_node_header *)cur; + struct fdt_property *prop; + + uint32 ok = 0; + uint32 tag = fdtn_tag(nodehdr); + + switch (tag) { + case FDT_PROP: + prop = (struct fdt_property *)nodehdr; + if (!strcmp("linux,initrd-start", dt_strings + fdtp_nameoff(prop))) { + initramfs_base = TO_CHAR_PTR(PA2VA(fdt32_ld((fdt32_t *)&prop->data))); + uart_printf("[*] initrd addr base: %x\r\n", initramfs_base); + ok += 1; + } else if (!strcmp("linux,initrd-end", dt_strings + fdtp_nameoff(prop))) { + initramfs_end = TO_CHAR_PTR(PA2VA(fdt32_ld((fdt32_t *)&prop->data))); + uart_printf("[*] initrd addr end : %x\r\n", initramfs_end); + ok += 1; + } + if (ok == 2) { + return 1; + } + break; + case FDT_BEGIN_NODE: + case FDT_END_NODE: + case FDT_NOP: + case FDT_END: + break; + } + + return 0; +} + +void initramfs_init(void) +{ + // Get initramfs address from devicetree + parse_dtb(fdt_base, initramfs_fdt_parser); + if (!initramfs_base) { + uart_printf("[x] Cannot find initrd address!!!\r\n"); + } +} \ No newline at end of file diff --git a/lab8/src/kernel/entry.c b/lab8/src/kernel/entry.c new file mode 100644 index 000000000..7e62b4681 --- /dev/null +++ b/lab8/src/kernel/entry.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include + +void el0_sync_handler(trapframe *regs, uint32 syn) +{ + esr_el1_t *esr; + + esr = (esr_el1_t *)&syn; + + switch (esr->ec) { + case EC_SVC_64: + syscall_handler(regs); + break; + case EC_IA_LE: + case EC_DA_LE: + mem_abort(esr); + break; + default: + show_trapframe(regs); + panic("esr->ec: %x", esr->ec); + } +} \ No newline at end of file diff --git a/lab8/src/kernel/exec.S b/lab8/src/kernel/exec.S new file mode 100644 index 000000000..64fb98abe --- /dev/null +++ b/lab8/src/kernel/exec.S @@ -0,0 +1,40 @@ +// See include/kernel/exec.h and src/kernel/exec.c for function declaration + +.globl enter_el0_run_user_prog +enter_el0_run_user_prog: + // Set exception return address + msr elr_el1, x0 + + // Set user stack + msr sp_el0, x1 + + // Enable interrupt ({D, A, I, F} = 0 (unmasked)) + // EL0 ({M[3:0]} = 0) + mov x0, 0 + msr spsr_el1, x0 + + // TODO: Clear all general registers + + // return to EL0 + eret + +.globl exec_user_prog +exec_user_prog: + // Set exception return address + msr elr_el1, x0 + + // Set user stack + msr sp_el0, x1 + + // Enable interrupt ({D, A, I, F} = 0 (unmasked)) + // EL0 ({M[3:0]} = 0) + mov x0, 0 + msr spsr_el1, x0 + + // Set kernel stack + mov sp, x2 + + // TODO: Clear all general registers + + // return to EL0 + eret \ No newline at end of file diff --git a/lab8/src/kernel/exec.c b/lab8/src/kernel/exec.c new file mode 100644 index 000000000..225192315 --- /dev/null +++ b/lab8/src/kernel/exec.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// Change current EL to EL0 and execute the user program at @entry +// Set user stack to @user_sp +void enter_el0_run_user_prog(void *entry, char *user_sp); + +static void user_prog_start(void) +{ + enter_el0_run_user_prog((void *)0, (char *)0xffffffffeff0); + + // User program should call exit() to terminate +} + +static inline void pt_regs_init(struct pt_regs *regs) +{ + regs->x19 = 0; + regs->x20 = 0; + regs->x21 = 0; + regs->x22 = 0; + regs->x23 = 0; + regs->x24 = 0; + regs->x25 = 0; + regs->x26 = 0; + regs->x27 = 0; + regs->x28 = 0; + regs->fp = 0; + regs->lr = user_prog_start; +} + +// TODO: Add argv & envp +void sched_new_user_prog(char *pathname) +{ + void *data; + int datalen, adj_datalen; + task_struct *task; + struct file f; + int ret; + + ret = vfs_open(pathname, 0, &f); + + if (ret < 0) { + return; + } + + datalen = f.vnode->v_ops->getsize(f.vnode); + + if (datalen < 0) { + return; + } + + adj_datalen = ALIGN(datalen, PAGE_SIZE); + + data = kmalloc(adj_datalen); + + memzero(data, adj_datalen); + + ret = vfs_read(&f, data, datalen); + + if (ret < 0) { + kfree(data); + return; + } + + vfs_close(&f); + + task = task_create(); + + task->kernel_stack = kmalloc(STACK_SIZE); + + task->regs.sp = (char *)task->kernel_stack + STACK_SIZE - 0x10; + pt_regs_init(&task->regs); + + task_init_map(task); + + // 0x000000000000 ~ : rwx: Code + vma_map(task->address_space, (void *)0, adj_datalen, + VMA_R | VMA_W | VMA_X | VMA_KVA, data); + + sched_add_task(task); +} + +void exit_user_prog(void) +{ + kthread_fini(); + + // Never reach +} \ No newline at end of file diff --git a/lab8/src/kernel/fdt.c b/lab8/src/kernel/fdt.c new file mode 100644 index 000000000..f3d433374 --- /dev/null +++ b/lab8/src/kernel/fdt.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include + +char *fdt_base; + +static void _print_tab(int level) +{ + while (level--) { + uart_printf("\t"); + } +} + +static void _dump(char *start, int len) +{ + while (len--) { + char c = *start++; + if ((0x20 <= c && c <= 0x7e)) { + uart_printf("%c", c); + } else { + uart_printf("%x", c); + } + } +} + +static int fdt_traversal_parser(int level, char *cur, char *dt_strings) +{ + struct fdt_node_header *nodehdr = (struct fdt_node_header *)cur; + struct fdt_property *prop; + + uint32 tag = fdtn_tag(nodehdr); + + switch (tag) { + case FDT_BEGIN_NODE: + _print_tab(level); + uart_printf("[*] Node: %s\n", nodehdr->name); + break; + case FDT_END_NODE: + _print_tab(level); + uart_printf("[*] Node end\r\n"); + break; + case FDT_PROP: + prop = (struct fdt_property *)nodehdr; + _print_tab(level); + uart_printf("[*] %s:", dt_strings + fdtp_nameoff(prop)); + _dump(prop->data, fdtp_len(prop)); + uart_printf("\r\n"); + break; + case FDT_NOP: + break; + case FDT_END: + uart_printf("[*] END!\r\n"); + } + + return 0; +} + +static void parse_dt_struct( + char *dt_struct, + char *dt_strings, + fdt_parser parser) +{ + char *cur = dt_struct; + int level = 0; + + while (1) { + cur = (char *)ALIGN((uint64)cur, 4); + struct fdt_node_header *nodehdr = (struct fdt_node_header *)cur; + struct fdt_property *prop; + + uint32 tag = fdtn_tag(nodehdr); + + switch (tag) { + case FDT_BEGIN_NODE: + if (parser(level, cur, dt_strings)) { + return; + } + level++; + cur += sizeof(struct fdt_node_header) + strlen(nodehdr->name) + 1; + while (*cur != 0) { + cur++; + } + break; + case FDT_END_NODE: + level--; + if (parser(level, cur, dt_strings)) { + return; + } + cur += sizeof(struct fdt_node_header); + break; + case FDT_PROP: + prop = (struct fdt_property *)nodehdr; + if (parser(level, cur, dt_strings)) { + return; + } + cur += sizeof(struct fdt_property); + cur += fdtp_len(prop); + break; + case FDT_NOP: + if (parser(level, cur, dt_strings)) { + return; + } + cur += sizeof(struct fdt_node_header); + break; + case FDT_END: + parser(level, cur, dt_strings); + return; + } + } +} + +void parse_dtb(char *dtb, fdt_parser parser) +{ + struct fdt_header *hdr = (struct fdt_header *)dtb; + + if (fdt_magic(hdr) != FDT_MAGIC) { + uart_printf("[x] Not valid fdt_header\r\n"); + } + + if (fdt_last_comp_version(hdr) > 17) { + uart_printf("[x] Only support v17 dtb\r\n"); + } + + char *dt_struct = dtb + fdt_off_dt_struct(hdr); + char *dt_strings = dtb + fdt_off_dt_strings(hdr); + // TODO: Parse memory reservation block + + parse_dt_struct(dt_struct, dt_strings, parser); +} + +void fdt_traversal(char *dtb) +{ + parse_dtb(dtb, fdt_traversal_parser); +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/cpiofs.c b/lab8/src/kernel/fs/cpiofs.c new file mode 100644 index 000000000..4aea5160b --- /dev/null +++ b/lab8/src/kernel/fs/cpiofs.c @@ -0,0 +1,573 @@ +#include +#include +#include +#include +#include +#include +#include + +#define CPIO_TYPE_MASK 0060000 +#define CPIO_TYPE_DIR 0040000 +#define CPIO_TYPE_FILE 0000000 + +struct cpio_newc_header { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; +}; + +struct cpiofs_file_t { + const char *data; + int size; +}; + +struct cpiofs_dir_t { + /* Link cpiofs_internal */ + struct list_head list; +}; + +#define CPIOFS_TYPE_UNDEFINE 0x0 +#define CPIOFS_TYPE_FILE 0x1 +#define CPIOFS_TYPE_DIR 0x2 + +struct cpiofs_internal { + const char *name; + int type; + union { + struct cpiofs_file_t file; + struct cpiofs_dir_t dir; + }; + struct vnode *node; + struct list_head list; +}; + +static struct vnode cpio_root_node; +static struct vnode mount_old_node; +static int cpio_mounted; + +static int cpiofs_mount(struct filesystem *fs, struct mount *mount); +static int cpiofs_sync(struct filesystem *fs); + +static struct filesystem cpiofs = { + .name = "cpiofs", + .mount = cpiofs_mount, + .sync = cpiofs_sync +}; + +static int cpiofs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int cpiofs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int cpiofs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int cpiofs_isdir(struct vnode *dir_node); +static int cpiofs_getname(struct vnode *dir_node, const char **name); +static int cpiofs_getsize(struct vnode *dir_node); + +static struct vnode_operations cpiofs_v_ops = { + .lookup = cpiofs_lookup, + .create = cpiofs_create, + .mkdir = cpiofs_mkdir, + .isdir = cpiofs_isdir, + .getname = cpiofs_getname, + .getsize = cpiofs_getsize +}; + +static int cpiofs_write(struct file *file, const void *buf, size_t len); +static int cpiofs_read(struct file *file, void *buf, size_t len); +static int cpiofs_open(struct vnode *file_node, struct file *target); +static int cpiofs_close(struct file *file); +static long cpiofs_lseek64(struct file *file, long offset, int whence); +static int cpiofs_ioctl(struct file *file, uint64 request, va_list args); + +static struct file_operations cpiofs_f_ops = { + .write = cpiofs_write, + .read = cpiofs_read, + .open = cpiofs_open, + .close = cpiofs_close, + .lseek64 = cpiofs_lseek64, + .ioctl = cpiofs_ioctl +}; + +/* filesystem methods */ +static int cpiofs_mount(struct filesystem *fs, struct mount *mount) +{ + struct vnode *oldnode; + struct cpiofs_internal *internal; + const char *name; + + preempt_disable(); + + if (cpio_mounted) { + preempt_enable(); + + return -1; + } + + cpio_mounted = 1; + + preempt_enable(); + + oldnode = mount->root; + + oldnode->v_ops->getname(oldnode, &name); + + internal = cpio_root_node.internal; + + internal->name = name; + + mount_old_node.mount = oldnode->mount; + mount_old_node.v_ops = oldnode->v_ops; + mount_old_node.f_ops = oldnode->f_ops; + mount_old_node.parent = oldnode->parent; + mount_old_node.internal = oldnode->internal; + + oldnode->mount = mount; + oldnode->v_ops = cpio_root_node.v_ops; + oldnode->f_ops = cpio_root_node.f_ops; + oldnode->internal = internal; + + return 0; +} + +static int cpiofs_sync(struct filesystem *fs) +{ + return 0; +} + +/* vnode_operations methods */ + +static int cpiofs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct cpiofs_internal *internal, *entry; + + internal = dir_node->internal; + + if (internal->type != CPIOFS_TYPE_DIR) { + return -1; + } + + list_for_each_entry(entry, &internal->dir.list, list) { + if (!strcmp(entry->name, component_name)) { + break; + } + } + + if (&entry->list == &internal->dir.list) { + return -1; + } + + *target = entry->node; + + return 0; +} + +static int cpiofs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int cpiofs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int cpiofs_isdir(struct vnode *dir_node) +{ + struct cpiofs_internal *internal; + + internal = dir_node->internal; + + if (internal->type != CPIOFS_TYPE_DIR) { + return 0; + } + + return 1; +} + +static int cpiofs_getname(struct vnode *dir_node, const char **name) +{ + struct cpiofs_internal *internal; + + internal = dir_node->internal; + + *name = internal->name; + + return 0; +} + +static int cpiofs_getsize(struct vnode *dir_node) +{ + struct cpiofs_internal *internal; + + internal = dir_node->internal; + + if (internal->type != CPIOFS_TYPE_FILE) { + return -1; + } + + return internal->file.size; +} + +/* file_operations methods */ + +static int cpiofs_write(struct file *file, const void *buf, size_t len) +{ + return -1; +} + +static int cpiofs_read(struct file *file, void *buf, size_t len) +{ + struct cpiofs_internal *internal; + + internal = file->vnode->internal; + + if (internal->type != CPIOFS_TYPE_FILE) { + return -1; + } + + if (len > internal->file.size - file->f_pos) { + len = internal->file.size - file->f_pos; + } + + if (!len) { + return 0; + } + + memncpy(buf, &internal->file.data[file->f_pos], len); + + file->f_pos += len; + + return len; +} + +static int cpiofs_open(struct vnode *file_node, struct file *target) +{ + target->vnode = file_node; + target->f_pos = 0; + target->f_ops = file_node->f_ops; + + return 0; +} + +static int cpiofs_close(struct file *file) +{ + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + + return 0; +} + +static long cpiofs_lseek64(struct file *file, long offset, int whence) +{ + int filesize; + int base; + + filesize = file->vnode->v_ops->getsize(file->vnode); + + if (filesize < 0) { + return -1; + } + + switch (whence) { + case SEEK_SET: + base = 0; + break; + case SEEK_CUR: + base = file->f_pos; + break; + case SEEK_END: + base = filesize; + break; + default: + return -1; + } + + if (base + offset > filesize) { + return -1; + } + + file->f_pos = base + offset; + + return 0; +} + +static int cpiofs_ioctl(struct file *file, uint64 request, va_list args) +{ + return -1; +} + +/* Others */ + +// Convert "0000000A" to 10 +static uint32 cpio_read_8hex(const char *p) +{ + uint32 result = 0; + + for (int i = 0; i < 8; ++i) { + char c = *p; + + result <<= 4; + + if ('0' <= c && c <= '9') { + result += c - '0'; + } + else if ('A' <= c && c <= 'F') { + result += c - 'A' + 10; + } + + p++; + } + + return result; +} + +/* + * Return directory vnode, and set @pathname to the last component name. + * If the @pathname is end with '/', set @pathname to NULL + * + * For example: + * + * If @pathname is "/abc/def/ghi". + * Return the vnode of "/abc/def", and set @pathname to "ghi". + * + * If @pathname is "/abc/def/". + * Return the vnode of "/abc/def", and set @pathname to NULL. + * + */ +static struct vnode *get_dir_vnode(struct vnode *dir_node, + const char **pathname) +{ + struct vnode *result; + const char *start; + const char *end; + char buf[0x100]; + + start = end = *pathname; + + if (*start == '/') { + result = &cpio_root_node; + } else { + result = dir_node; + } + + while (1) { + if (!strncmp("./", start, 2)) { + start += 2; + end = start; + continue; + } else if (!strncmp("../", start, 3)) { + if (result->parent) { + result = result->parent; + } + + start += 3; + end = start; + continue; + } + + // Find next component + while (*end != '\0' && *end != '/') { + end++; + } + + if (*end == '/') { + int ret; + + if (start == end) { + // Case like "//" + end++; + start = end; + continue; + } + + // TODO: Check if the length is less than 0x100 + memncpy(buf, start, end - start); + buf[end - start] = 0; + + ret = result->v_ops->lookup(result, &result, buf); + + if (ret < 0) { + return NULL; + } + + end++; + start = end; + } else { + break; + } + } + + *pathname = *start ? start : NULL; + + return result; +} + +static void cpio_init_mkdir(const char *pathname) +{ + const char *curname; + struct vnode *dir_node; + struct vnode *newdir_node; + struct cpiofs_internal *internal, *dirint; + + curname = pathname; + dir_node = get_dir_vnode(&cpio_root_node, &curname); + + if (!dir_node) { + return; + } + + if (!curname) { + return; + } + + dirint = dir_node->internal; + + if (dirint->type != CPIOFS_TYPE_DIR) { + return; + } + + internal = kmalloc(sizeof(struct cpiofs_internal)); + newdir_node = kmalloc(sizeof(struct vnode)); + + internal->name = curname; + internal->type = CPIOFS_TYPE_DIR; + INIT_LIST_HEAD(&internal->dir.list); + internal->node = newdir_node; + list_add_tail(&internal->list, &dirint->dir.list); + + newdir_node->mount = NULL; + newdir_node->v_ops = &cpiofs_v_ops; + newdir_node->f_ops = &cpiofs_f_ops; + newdir_node->parent = dir_node; + newdir_node->internal = internal; + + return; +} + +static void cpio_init_create(const char *pathname, + const char *data, + uint64 size) +{ + const char *curname; + struct vnode *dir_node; + struct vnode *newdir_node; + struct cpiofs_internal *internal, *dirint; + + curname = pathname; + dir_node = get_dir_vnode(&cpio_root_node, &curname); + + if (!dir_node) { + return; + } + + if (!curname) { + return; + } + + dirint = dir_node->internal; + + if (dirint->type != CPIOFS_TYPE_DIR) { + return; + } + + internal = kmalloc(sizeof(struct cpiofs_internal)); + newdir_node = kmalloc(sizeof(struct vnode)); + + internal->name = curname; + internal->type = CPIOFS_TYPE_FILE; + internal->file.data = data; + internal->file.size = size; + internal->node = newdir_node; + list_add_tail(&internal->list, &dirint->dir.list); + + newdir_node->mount = NULL; + newdir_node->v_ops = &cpiofs_v_ops; + newdir_node->f_ops = &cpiofs_f_ops; + newdir_node->parent = dir_node; + newdir_node->internal = internal; + + return; +} + +struct filesystem *cpiofs_init(void) +{ + char *cur; + struct cpiofs_internal *internal; + + internal = kmalloc(sizeof(struct cpiofs_internal)); + + internal->name = NULL; + internal->type = CPIOFS_TYPE_DIR; + INIT_LIST_HEAD(&internal->dir.list); + internal->node = &cpio_root_node; + INIT_LIST_HEAD(&internal->list); + + cpio_root_node.mount = NULL; + cpio_root_node.v_ops = &cpiofs_v_ops; + cpio_root_node.f_ops = &cpiofs_f_ops; + cpio_root_node.parent = NULL; + cpio_root_node.internal = internal; + + cur = initramfs_base; + + while (1) { + char *component_name, *content; + struct cpio_newc_header *pheader; + uint32 namesize, filesize, adj_namesize, adj_filesize, type; + + pheader = (struct cpio_newc_header *)cur; + cur += sizeof(struct cpio_newc_header); + + // 070701 + if (*(uint32 *)&pheader->c_magic[0] != 0x37303730 && + *(uint16 *)&pheader->c_magic[4] != 0x3130) { + panic("[*] Only support new ASCII format of cpio.\r\n"); + } + + namesize = cpio_read_8hex(pheader->c_namesize); + filesize = cpio_read_8hex(pheader->c_filesize); + type = cpio_read_8hex(pheader->c_mode) & CPIO_TYPE_MASK; + + // The pathname is followed by NUL bytes so that the total size of the + // fixed header plus pathname is a multiple of four. Likewise, the file + // data is padded to a multiple of four bytes + adj_namesize = ALIGN(namesize + + sizeof(struct cpio_newc_header), 4) + - sizeof(struct cpio_newc_header); + adj_filesize = ALIGN(filesize, 4); + + component_name = cur; + cur += adj_namesize; + content = cur; + cur += adj_filesize; + + if (type == CPIO_TYPE_DIR) { + cpio_init_mkdir(component_name); + } else if (type == CPIO_TYPE_FILE) { + cpio_init_create(component_name, content, filesize); + } + + // TRAILER!!! + if (namesize == 0xb && !strcmp(component_name, "TRAILER!!!")) { + break; + } + } + + return &cpiofs; +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/fat32fs.c b/lab8/src/kernel/fs/fat32fs.c new file mode 100644 index 000000000..021002d0b --- /dev/null +++ b/lab8/src/kernel/fs/fat32fs.c @@ -0,0 +1,1673 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BLOCK_SIZE 512 +#define CLUSTER_ENTRY_PER_BLOCK (BLOCK_SIZE / sizeof(struct cluster_entry_t)) +#define DIR_PER_BLOCK (BLOCK_SIZE / sizeof(struct dir_t)) +#define INVALID_CID 0x0ffffff8 + +struct partition_t { + uint8 status; + uint8 chss_head; + uint8 chss_sector; + uint8 chss_cylinder; + uint8 type; + uint8 chse_head; + uint8 chse_sector; + uint8 chse_cylinder; + uint32 lba; + uint32 sectors; +} __attribute__((packed)); + +struct boot_sector_t { + uint8 jmpboot[3]; + uint8 oemname[8]; + uint16 bytes_per_sector; // Bytes Per Sector + uint8 sector_per_cluster; // Sectors Per Cluster + uint16 reserved_sector_cnt; // Number of Reserved Sectors + uint8 fat_cnt; // Number of FATs + uint16 root_entry_cnt; + uint16 old_sector_cnt; + uint8 media; + uint16 sector_per_fat16; + uint16 sector_per_track; + uint16 head_cnt; + uint32 hidden_sector_cnt; + uint32 sector_cnt; + uint32 sector_per_fat32; // Sectors Per FAT + uint16 extflags; + uint16 ver; + uint32 root_cluster; // Root Directory First Cluster + uint16 info; + uint16 bkbooksec; + uint8 reserved[12]; + uint8 drvnum; + uint8 reserved1; + uint8 bootsig; + uint32 volid; + uint8 vollab[11]; + uint8 fstype[8]; +} __attribute__((packed)); + +// attr of dir_t +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_LFN 0x0f +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 +#define ATTR_FILE_DIR_MASK (ATTR_DIRECTORY | ATTR_ARCHIVE) + +struct dir_t { + uint8 name[11]; + uint8 attr; + uint8 ntres; // windows nt reserve + uint8 crttimetenth; // create tiem tenth + uint16 crttime; // creat time + uint16 crtdate; // creat date + uint16 lstaccdate; // last access data + uint16 ch; // clster high + uint16 wrttime; // write time + uint16 wrtdate; // write date + uint16 cl; // cluster low + uint32 size; // file size +} __attribute__((packed)); + +struct long_dir_t { + uint8 order; + uint8 name1[10]; + uint8 attr; + uint8 type; + uint8 checksum; + uint8 name2[12]; + uint16 fstcluslo; // first cluster + uint8 name3[4]; +} __attribute__((packed)); + +struct cluster_entry_t { + union { + uint32 val; + struct { + uint32 idx: 28; + uint32 reserved: 4; + }; + }; +}; + +struct filename_t { + union { + uint8 fullname[256]; + struct { + uint8 name[13]; + } part[20]; + }; +} __attribute__((packed)); + +struct fat_file_block_t { + /* Link fat_file_block_t */ + struct list_head list; + /* + * offset id of file + * offset id N corresponds to offset N * BLOCKS_SIZE of file + */ + uint32 oid; + /* cluster id */ + uint32 cid; + /* Already read the data into buf */ + uint32 read; + uint32 dirty; + uint8 buf[BLOCK_SIZE]; +}; + +struct fat_file_t { + /* Head of fat_file_block_t chain */ + struct list_head list; + uint32 size; +}; + +struct fat_dir_t { + /* Head of fat_internal chain */ + struct list_head list; +}; + +struct fat_info_t { + struct boot_sector_t bs; + uint32 fat_lba; + uint32 cluster_lba; +}; + +// type of struct fat_internal +#define FAT_DIR 1 +#define FAT_FILE 2 + +struct fat_internal { + const char *name; + struct vnode *node; + struct fat_info_t *fat; + /* Link fat_internal */ + struct list_head list; + /* cluster id */ + uint32 cid; + uint32 type; + union { + struct fat_dir_t *dir; + struct fat_file_t *file; + }; +}; + +struct fat_mount_t { + /* Link fat_mount_t */ + struct list_head list; + struct mount *mount; +}; + +/* Head of fat_mount_t chain */ +static struct list_head mounts; + +static int fat32fs_mount(struct filesystem *fs, struct mount *mount); +static int fat32fs_sync(struct filesystem *fs); + +static struct filesystem fat32fs = { + .name = "fat32fs", + .mount = fat32fs_mount, + .sync = fat32fs_sync +}; + +static int fat32fs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fat32fs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fat32fs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fat32fs_isdir(struct vnode *dir_node); +static int fat32fs_getname(struct vnode *dir_node, const char **name); +static int fat32fs_getsize(struct vnode *dir_node); + +static struct vnode_operations fat32fs_v_ops = { + .lookup = fat32fs_lookup, + .create = fat32fs_create, + .mkdir = fat32fs_mkdir, + .isdir = fat32fs_isdir, + .getname = fat32fs_getname, + .getsize = fat32fs_getsize +}; + +static int fat32fs_write(struct file *file, const void *buf, size_t len); +static int fat32fs_read(struct file *file, void *buf, size_t len); +static int fat32fs_open(struct vnode *file_node, struct file *target); +static int fat32fs_close(struct file *file); +static long fat32fs_lseek64(struct file *file, long offset, int whence); +static int fat32fs_ioctl(struct file *file, uint64 request, va_list args); + +static struct file_operations fat32fs_f_ops = { + .write = fat32fs_write, + .read = fat32fs_read, + .open = fat32fs_open, + .close = fat32fs_close, + .lseek64 = fat32fs_lseek64, + .ioctl = fat32fs_ioctl +}; + +static uint32 get_next_cluster(uint32 fat_lba, uint32 cluster_id); +// TODO: Check alloc_cluster ok +static uint32 alloc_cluster(struct fat_info_t *fat, uint32 prev_cid); +static int invalid_cid(uint32 cid); +static struct dir_t *__lookup_fat32(struct vnode *dir_node, + const char *component_name, + uint8 *buf, int *buflba); + +/* filesystem methods */ + +static int fat32fs_mount(struct filesystem *fs, struct mount *mount) +{ + struct partition_t *partition; + struct fat_info_t *fat; + struct fat_dir_t *dir; + struct fat_internal *data; + struct vnode *oldnode, *node; + struct fat_mount_t *newmount; + const char *name; + uint32 lba; + uint8 buf[BLOCK_SIZE]; + + sd_readblock(0, buf); + + partition = (struct partition_t *)&buf[0x1be]; + + if (buf[510] != 0x55 || buf[511] != 0xaa) { + return -1; + } + + if (partition[0].type != 0xb && partition[0].type != 0xc) { + return -1; + } + + lba = partition[0].lba; + + sd_readblock(partition[0].lba, buf); + + node = kmalloc(sizeof(struct vnode)); + data = kmalloc(sizeof(struct fat_internal)); + fat = kmalloc(sizeof(struct fat_info_t)); + dir = kmalloc(sizeof(struct fat_dir_t)); + newmount = kmalloc(sizeof(struct fat_mount_t)); + + memncpy((void *)&fat->bs, (void *)buf, sizeof(fat->bs)); + + fat->fat_lba = lba + fat->bs.reserved_sector_cnt; // fat_begin_lba + fat->cluster_lba = fat->fat_lba + + fat->bs.fat_cnt * fat->bs.sector_per_fat32; // cluster_begin_lba + + INIT_LIST_HEAD(&dir->list); + + oldnode = mount->root; + + oldnode->v_ops->getname(oldnode, &name); + + node->mount = oldnode->mount; + node->v_ops = oldnode->v_ops; + node->f_ops = oldnode->f_ops; + node->parent = oldnode->parent; + node->internal = oldnode->internal; + + data->name = name; + data->node = node; + data->fat = fat; + data->cid = 2; // cluster id + data->type = FAT_DIR; + data->dir = dir; + + oldnode->mount = mount; + oldnode->v_ops = &fat32fs_v_ops; + oldnode->f_ops = &fat32fs_f_ops; + oldnode->internal = data; + + preempt_disable(); + + list_add(&newmount->list, &mounts); + + preempt_enable(); + + newmount->mount = mount; + + return 0; +} + +static void _do_sync_dir(struct vnode *dirnode) +{ + struct fat_internal *data, *entry; + struct list_head *head; + struct dir_t *dir; + struct long_dir_t *ldir; + uint32 cid; + int lba, idx, lfnidx; + uint8 buf[BLOCK_SIZE]; + + data = dirnode->internal; + head = &data->dir->list; + cid = data->cid; + idx = 0; + lfnidx = 1; + + if (invalid_cid(cid)) { + panic("fat32 _do_sync_dir: invalid dirnode->data->cid"); + } + + lba = data->fat->cluster_lba + + (cid - 2) * data->fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + sd_readblock(lba, buf); + + list_for_each_entry(entry, head, list) { + struct dir_t *origindir; + const char *name; + const char *ext; + int lfn, namelen, extpos, i, buflba; + uint8 lookupbuf[BLOCK_SIZE]; + + name = entry->name; + + // If entry is a old file, update its size + origindir = __lookup_fat32(dirnode, name, lookupbuf, &buflba); + + if (origindir) { + if (entry->type == FAT_FILE) { + origindir->size = entry->file->size; + sd_writeblock(buflba, lookupbuf); + } + + continue; + } + + // Else if entry is a new file + ext = NULL; + extpos = -1; + + do { + namelen = strlen(name); + + // is LFM? + if (namelen >= 13) { + lfn = 1; + break; + } + + for (i = 0; i < namelen; ++i) { + if (name[namelen - 1 - i] == '.') { + break; + } + } + + if (i < namelen) { + ext = &name[namelen - i]; + extpos = namelen - 1 - i; + } + + // is long file name? + if (i >= 4) { + lfn = 1; + break; + } + + if (namelen - 1 - i > 8) { + lfn = 1; + break; + } + + lfn = 0; + } while(0); + + // Seek idx to the end of dir + while (1) { + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * idx]); + + if (dir->name[0] == 0) { + break; + } + + idx += 1; + + if (idx >= 16) { + uint32 newcid; + + sd_writeblock(lba, buf); // full use an cluster + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (invalid_cid(newcid)) { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + + (cid - 2) * data->fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + sd_readblock(lba, buf); + + idx = 0; + } + } + + // Write LFN + if (lfn) { + int ord; + int first; + + ord = ((namelen - 1) / 13) + 1; + first = 0x40; + + for (; ord > 0; --ord) { + int end; + + ldir = (struct long_dir_t *) + (&buf[sizeof(struct long_dir_t) * idx]); + + ldir->order = first | ord; + ldir->attr = ATTR_LFN; + ldir->type = 0; + // TODO: Calculate checksum + ldir->checksum = 0; + ldir->fstcluslo = 0; + + first = 0; + end = 0; + + for (i = 0; i < 10; i += 2) { + if (end) { + ldir->name1[i] = 0xff; + ldir->name1[i + 1] = 0xff; + } else { + ldir->name1[i] = name[(ord - 1) * 13 + i / 2]; + ldir->name1[i + 1] = 0; + if (ldir->name1[i] == 0) { + end = 1; + } + } + } + for (i = 0; i < 12; i += 2) { + if (end) { + ldir->name2[i] = 0xff; + ldir->name2[i + 1] = 0xff; + } else { + ldir->name2[i] = name[(ord - 1) * 13 + 5 + i / 2]; + ldir->name2[i + 1] = 0; + if (ldir->name2[i] == 0) { + end = 1; + } + } + } + for (i = 0; i < 4; i += 2) { + if (end) { + ldir->name3[i] = 0xff; + ldir->name3[i + 1] = 0xff; + } else { + ldir->name3[i] = name[(ord - 1) * 13 + 11 + i / 2]; + ldir->name3[i + 1] = 0; + if (ldir->name3[i] == 0) { + end = 1; + } + } + } + + idx += 1; + + if (idx >= 16) { + uint32 newcid; + + sd_writeblock(lba, buf); + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (invalid_cid(newcid)) { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + + (cid - 2) * data->fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + sd_readblock(lba, buf); + + idx = 0; + } + } + } + + // Write SFN + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * idx]); + + // TODO: Set these properties properly + dir->ntres = 0; + dir->crttimetenth = 0; + dir->crttime = 0; + dir->crtdate = 0; + dir->lstaccdate = 0; + dir->wrttime = 0; + dir->wrtdate = 0; + + if (entry->type == FAT_DIR) { + dir->attr = ATTR_DIRECTORY; + dir->size = 0; + } else { + dir->attr = ATTR_ARCHIVE; + dir->size = entry->file->size; + } + + if (invalid_cid(entry->cid)) { + entry->cid = alloc_cluster(data->fat, 0); + } + + dir->ch = (entry->cid >> 16) & 0xffff; + dir->cl = entry->cid & 0xffff; + + if (lfn) { + int lfni; + + // TODO: handle lfnidx + for (i = 7, lfni = lfnidx; i >= 0 && lfni;) { + dir->name[i--] = '0' + lfni % 10; + lfni /= 10; + } + + lfnidx++; + + dir->name[i--] = '~'; + + // TODO: handle letter case + memncpy((void *)dir->name, name, i + 1); + } else { + // TODO: handle letter case + for (i = 0; i != extpos && name[i]; ++i) { + dir->name[i] = name[i]; + } + + for (; i < 8; ++i) { + dir->name[i] = ' '; + } + } + + // TODO: handle letter case + for (i = 0; i < 3 && ext[i]; ++i) { + dir->name[8 + i] = ext[i]; + } + + for (; i < 3; ++i) { + dir->name[8 + i] = ' '; + } + + idx += 1; + + if (idx >= 16) { + int newcid; + + sd_writeblock(lba, buf); + + newcid = get_next_cluster(data->fat->fat_lba, cid); + if (invalid_cid(newcid)) { + newcid = alloc_cluster(data->fat, cid); + } + + cid = newcid; + + lba = data->fat->cluster_lba + + (cid - 2) * data->fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + sd_readblock(lba, buf); + + idx = 0; + } + } + + if (idx) { + sd_writeblock(lba, buf); + } +} + +static void _do_sync_file(struct vnode *filenode) +{ + struct fat_file_block_t *entry; + struct fat_internal *data; + struct list_head *head; + uint32 cid; + + data = filenode->internal; + head = &data->file->list; + cid = data->cid; + + if (invalid_cid(cid)) { + panic("fat32 _do_sync_file: invalid cid"); + } + + list_for_each_entry(entry, head, list) { + int lba; + + if (entry->oid == 0) { + if (!invalid_cid(entry->cid) && data->cid != entry->cid) { + panic("_do_sync_file: cid isn't sync"); + } + + entry->cid = data->cid; + } + + if (invalid_cid(entry->cid)) { + entry->cid = alloc_cluster(data->fat, cid); + } + + if (!entry->dirty) { + continue; + } + + if (!entry->read) { + memset(entry->buf, 0, BLOCK_SIZE); + entry->read = 1; + } + + lba = data->fat->cluster_lba + + (entry->cid - 2) * data->fat->bs.sector_per_cluster; + + sd_writeblock(lba, entry->buf); + + entry->dirty = 0; + + cid = entry->cid; + } +} + +static void _sync_dir(struct vnode *dirnode) +{ + struct fat_internal *data, *entry; + struct list_head *head; + + data = dirnode->internal; + head = &data->dir->list; + + _do_sync_dir(dirnode); + + list_for_each_entry(entry, head, list) { + if (entry->type == FAT_DIR) { + _sync_dir(entry->node); + } else { + _do_sync_file(entry->node); + } + } +} + +static int fat32fs_sync(struct filesystem *fs) +{ + struct fat_mount_t *entry; + + list_for_each_entry(entry, &mounts, list) { + _sync_dir(entry->mount->root); + } + + return 0; +} + +/* vnode_operations methods */ + +static struct vnode *_create_vnode(struct vnode *parent, + const char *name, + uint32 type, + uint32 cid, + uint32 size) +{ + struct vnode *node; + struct fat_internal *info, *data; + char *buf; + int len; + + info = parent->internal; + len = strlen(name); + + buf = kmalloc(len + 1); + node = kmalloc(sizeof(struct vnode)); + data = kmalloc(sizeof(struct fat_internal)); + + strcpy(buf, name); + + data->name = buf; + data->node = node; + data->fat = info->fat; + data->cid = cid; + data->type = type; + + if (type == FAT_DIR) { + struct fat_dir_t *dir; + + dir = kmalloc(sizeof(struct fat_dir_t)); + + INIT_LIST_HEAD(&dir->list); + + data->dir = dir; + } else { + struct fat_file_t *file; + + file = kmalloc(sizeof(struct fat_file_t)); + + INIT_LIST_HEAD(&file->list); + file->size = size; + + data->file = file; + } + + node->mount = parent->mount; + node->v_ops = &fat32fs_v_ops; + node->f_ops = &fat32fs_f_ops; + node->parent = parent; + node->internal = data; + + list_add(&data->list, &info->dir->list); + + return node; +} + +static int _lookup_cache(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct fat_internal *data, *entry; + struct fat_dir_t *dir; + int found; + + data = dir_node->internal; + dir = data->dir; + + found = 0; + + list_for_each_entry(entry, &dir->list, list) { + if (!strcasecmp(component_name, entry->name)) { + found = 1; + break; + } + } + + if (!found) { + return -1; + } + + *target = entry->node; + + return 0; +} + +static struct dir_t *__lookup_fat32(struct vnode *dir_node, + const char *component_name, + uint8 *buf, int *buflba) +{ + struct dir_t *dir; + struct fat_internal *data; + struct fat_info_t *fat; + struct filename_t name; + uint32 cid; + int found, dirend, lfn; + + data = dir_node->internal; + fat = data->fat; + cid = data->cid; + + found = 0; + dirend = 0; + + memset(&name, 0, sizeof(struct filename_t)); + + while (1) { + int lba; + + lba = fat->cluster_lba + (cid - 2) * fat->bs.sector_per_cluster; + + // TODO: Cache data block of directory + sd_readblock(lba, buf); + + if (buflba) { + *buflba = lba; + } + + for (int i = 0; i < DIR_PER_BLOCK; ++i) { + uint8 len; + + dir = (struct dir_t *)(&buf[sizeof(struct dir_t) * i]); + + if (dir->name[0] == 0) { + dirend = 1; + break; + } + + if ((dir->attr & ATTR_LFN) == ATTR_LFN) { + struct long_dir_t *ldir; + int n; + + lfn = 1; + + ldir = (struct long_dir_t *)dir; + n = (dir->name[0] & 0x3f) - 1; + + for (int i = 0; ldir->name1[i] != 0xff && i < 10; i += 2) { + name.part[n].name[i / 2] = ldir->name1[i]; + } + for (int i = 0; ldir->name2[i] != 0xff && i < 12; i += 2) { + name.part[n].name[5 + i / 2] = ldir->name2[i]; + } + for (int i = 0; ldir->name3[i] != 0xff && i < 4; i += 2) { + name.part[n].name[11 + i / 2] = ldir->name3[i]; + } + + continue; + } + + if (lfn == 1) { + if (!strcasecmp(component_name, (void *)name.fullname)) { + found = 1; + break; + } + + lfn = 0; + memset(&name, 0, sizeof(struct filename_t)); // clear name + + continue; + } + + // shoter name + lfn = 0; + len = 8; + + while (len) { + if (dir->name[len - 1] != 0x20) { + break; + } + len -= 1; + } + + memncpy((void *)name.fullname, (void *)dir->name, len); + name.fullname[len] = 0; + + // extension name + len = 3; + + while (len) { + if (dir->name[8 + len - 1] != 0x20) { + break; + } + len -= 1; + } + + if (len >= 0) { + strcat((void *)name.fullname, "."); + strncat((void *)name.fullname, (void *)&dir->name[8], len); + } + + if (!strcasecmp(component_name, (void *)name.fullname)) { + found = 1; + break; + } + + memset(&name, 0, sizeof(struct filename_t)); + } + + if (found) { + break; + } + + if (dirend) { + break; + } + + cid = get_next_cluster(fat->fat_lba, cid); + + if (invalid_cid(cid)) { + break; + } + } + + if (!found) { + return NULL; + } + + return dir; +} + +static int _lookup_fat32(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct vnode *node; + struct dir_t *dir; + uint32 type, cid; + uint8 buf[BLOCK_SIZE]; + + dir = __lookup_fat32(dir_node, component_name, buf, NULL); + + if (!dir) { + return -1; + } + + if (!(dir->attr & ATTR_FILE_DIR_MASK)) { + return -1; + } + + cid = (dir->ch << 16) | dir->cl; + + if (dir->attr & ATTR_ARCHIVE) { + type = FAT_FILE; + } else { + type = FAT_DIR; + } + + node = _create_vnode(dir_node, component_name, type, cid, dir->size); + + *target = node; + + return 0; +} + +static int fat32fs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct fat_internal *data; + int ret; + + data = dir_node->internal; + + if (data->type != FAT_DIR) { + return -1; + } + + ret = _lookup_cache(dir_node, target, component_name); + + if (ret >= 0) { + return ret; + } + + return _lookup_fat32(dir_node, target, component_name); +} + +static int fat32fs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct vnode *node; + struct fat_internal *internal; + int ret; + + internal = dir_node->internal; + + if (internal->type != FAT_DIR) { + return -1; + } + + ret = fat32fs_lookup(dir_node, target, component_name); + + if (!ret) { + return -1; + } + + node = _create_vnode(dir_node, component_name, FAT_FILE, -1, 0); + + *target = node; + + return 0; +} + +static int fat32fs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct vnode *node; + struct fat_internal *internal; + int ret; + + internal = dir_node->internal; + + if (internal->type != FAT_DIR) { + return -1; + } + + ret = fat32fs_lookup(dir_node, target, component_name); + + if (!ret) { + return -1; + } + + node = _create_vnode(dir_node, component_name, FAT_DIR, -1, 0); + + *target = node; + + return 0; +} + +static int fat32fs_isdir(struct vnode *dir_node) +{ + struct fat_internal *internal; + + internal = dir_node->internal; + + if (internal->type != FAT_DIR) { + return 0; + } + + return 1; +} + +static int fat32fs_getname(struct vnode *dir_node, const char **name) +{ + struct fat_internal *internal; + + internal = dir_node->internal; + + *name = internal->name; + + return 0; +} + +static int fat32fs_getsize(struct vnode *dir_node) +{ + struct fat_internal *internal; + + internal = dir_node->internal; + + if (internal->type == FAT_DIR) { + return 0; + } + + return internal->file->size; +} + +/* file_operations methods */ + +static int _writefile_seek_cache(struct fat_internal *data, uint32 foid, + struct fat_file_block_t **block) +{ + struct fat_file_block_t *entry; + struct list_head *head; + + head = &data->file->list; + + if (list_empty(head)) { + return -1; + } + + list_for_each_entry(entry, head, list) { + *block = entry; + + if (foid == entry->oid) { + return 0; + } + } + + return -1; +} + +static int _writefile_seek_fat32(struct fat_internal *data, + uint32 foid, uint32 fcid, + struct fat_file_block_t **block) +{ + struct fat_info_t *info; + uint32 curoid, curcid; + + info = data->fat; + + if (*block) { + curoid = (*block)->oid; + curcid = (*block)->cid; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + } else { + curoid = 0; + curcid = fcid; + } + + while (1) { + struct fat_file_block_t *newblock; + + newblock = kmalloc(sizeof(struct fat_file_block_t)); + + newblock->oid = curoid; + newblock->cid = curcid; + newblock->read = 0; + newblock->dirty = 1; + + list_add_tail(&newblock->list, &data->file->list); + + *block = newblock; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + } +} + +static int _writefile_cache(struct fat_internal *data, uint64 bckoff, + const uint8 *buf, uint64 bufoff, uint32 size, + struct fat_file_block_t *block) +{ + int wsize; + + if (!block->read) { + // read the data from sdcard + struct fat_info_t *info; + int lba; + + info = data->fat; + lba = info->cluster_lba + + (block->cid - 2) * info->bs.sector_per_cluster; + + sd_readblock(lba, block->buf); + + block->read = 1; + } + + wsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + + memncpy((void *)&block->buf[bckoff], (void *)&buf[bufoff], wsize); + + return wsize; +} + +static int _writefile_fat32(struct fat_internal *data, uint64 bckoff, + const uint8 *buf, uint32 bufoff, uint32 size, + uint32 oid, uint32 cid) +{ + struct list_head *head; + struct fat_info_t *info; + struct fat_file_block_t *block; + int lba; + int wsize; + + head = &data->file->list; + info = data->fat; + + block = kmalloc(sizeof(struct fat_file_block_t)); + + wsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + + if (invalid_cid(cid)) { + memset(block->buf, 0, BLOCK_SIZE); + } else { + lba = info->cluster_lba + (cid - 2) * info->bs.sector_per_cluster; + + sd_readblock(lba, block->buf); + } + + memncpy((void *)&block->buf[bckoff], (void *)&buf[bufoff], wsize); + + block->oid = oid; + block->cid = cid; + block->read = 1; + block->dirty = 1; + + list_add_tail(&block->list, head); + + return wsize; +} + +static int _writefile(const void *buf, struct fat_internal *data, + uint64 fileoff, uint64 len) +{ + struct fat_file_block_t *block; + struct list_head *head; + uint32 foid; // first block id + uint32 coid; // current block id + uint32 cid; // target cluster id + uint64 bufoff, result; + int ret; + + block = NULL; + head = &data->file->list; + foid = fileoff / BLOCK_SIZE; + coid = 0; + cid = data->cid; + bufoff = 0; + result = 0; + + // Seek + + ret = _writefile_seek_cache(data, foid, &block); + + if (ret < 0) { + ret = _writefile_seek_fat32(data, foid, cid, &block); + } + + if (ret < 0) { + return 0; + } + + // if (block->oid != foid) error! + + // Write + + while (len) { + uint64 bckoff; + + bckoff = (fileoff + result) % BLOCK_SIZE; + + if (&block->list != head) { + ret = _writefile_cache(data, bckoff, buf, bufoff, len, block); + + cid = block->cid; + block = list_first_entry(&block->list, + struct fat_file_block_t, list); + } else { + // Read block from sdcard, create cache, then write it + cid = get_next_cluster(data->fat->fat_lba, cid); + + ret = _writefile_fat32(data, bckoff, buf, bufoff, len, coid, cid); + } + + if (ret < 0) { + break; + } + + bufoff += ret; + result += ret; + coid += 1; + len -= ret; + } + + return result; +} + +static int fat32fs_write(struct file *file, const void *buf, size_t len) +{ + struct fat_internal *data; + int filesize; + int ret; + + if (fat32fs_isdir(file->vnode)) { // is dir --> return 1 + return -1; + } + + if (!len) { + return len; + } + + filesize = fat32fs_getsize(file->vnode); + + data = file->vnode->internal; + + ret = _writefile(buf, data, file->f_pos, len); + + if (ret <= 0) { + return ret; + } + + file->f_pos += ret; + + if (file->f_pos > filesize) { + data->file->size = file->f_pos; + } + + return ret; +} + +static int _readfile_seek_cache(struct fat_internal *data, uint32 foid, + struct fat_file_block_t **block) +{ + struct fat_file_block_t *entry; + struct list_head *head; + + head = &data->file->list; + + if (list_empty(head)) { + return -1; + } + + list_for_each_entry(entry, head, list) { + *block = entry; + + if (foid == entry->oid) { + return 0; + } + } + + return -1; +} + +static int _readfile_seek_fat32(struct fat_internal *data, + uint32 foid, uint32 fcid, + struct fat_file_block_t **block) +{ + struct fat_info_t *info; + uint32 curoid, curcid; + + info = data->fat; + + if (*block) { + curoid = (*block)->oid; + curcid = (*block)->cid; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + + if (invalid_cid(curcid)) { + return -1; + } + } else { + curoid = 0; + curcid = fcid; + } + + while (1) { + struct fat_file_block_t *newblock; + + newblock = kmalloc(sizeof(struct fat_file_block_t)); + + newblock->oid = curoid; + newblock->cid = curcid; + newblock->read = 0; + newblock->dirty = 0; + + list_add_tail(&newblock->list, &data->file->list); + + *block = newblock; + + if (curoid == foid) { + return 0; + } + + curoid++; + curcid = get_next_cluster(info->fat_lba, curcid); + + if (invalid_cid(curcid)) { + return -1; + } + } +} + +static int _readfile_cache(struct fat_internal *data, uint64 bckoff, + uint8 *buf, uint64 bufoff, uint32 size, + struct fat_file_block_t *block) +{ + int rsize; + + if (!block->read) { + // read the data from sdcard + struct fat_info_t *info; + int lba; + + info = data->fat; + lba = info->cluster_lba + + (block->cid - 2) * info->bs.sector_per_cluster; + + sd_readblock(lba, block->buf); + + block->read = 1; + } + + rsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + + memncpy((void *)&buf[bufoff], (void *)&block->buf[bckoff], rsize); + + return rsize; +} + +static int _readfile_fat32(struct fat_internal *data, uint64 bckoff, + uint8 *buf, uint32 bufoff, uint32 size, + uint32 oid, uint32 cid) +{ + struct list_head *head; + struct fat_info_t *info; + struct fat_file_block_t *block; + int lba; + int rsize; + + head = &data->file->list; + info = data->fat; + + block = kmalloc(sizeof(struct fat_file_block_t)); + + rsize = size > BLOCK_SIZE - bckoff ? BLOCK_SIZE - bckoff : size; + lba = info->cluster_lba + (cid - 2) * info->bs.sector_per_cluster; + + sd_readblock(lba, block->buf); + + memncpy((void *)&buf[bufoff], (void *)&block->buf[bckoff], rsize); + + block->oid = oid; + block->cid = cid; + block->read = 1; + block->dirty = 0; + + list_add_tail(&block->list, head); + + return rsize; +} + +static int _readfile(void *buf, struct fat_internal *data, + uint64 fileoff, uint64 len) +{ + struct fat_file_block_t *block; + struct list_head *head; + uint32 foid; // first block id + uint32 coid; // current block id + uint32 cid; // target cluster id + uint64 bufoff, result; + int ret; + + block = NULL; + head = &data->file->list; + foid = fileoff / BLOCK_SIZE; + coid = 0; + cid = data->cid; + bufoff = 0; + result = 0; + + // Seek + + ret = _readfile_seek_cache(data, foid, &block); + + if (ret < 0) { + ret = _readfile_seek_fat32(data, foid, cid, &block); + } + + if (ret < 0) { + return 0; + } + + // if (block->oid != foid) error! + + // Start read + + while (len) { + uint64 bckoff; + + bckoff = (fileoff + result) % BLOCK_SIZE; + + if (&block->list != head) { + ret = _readfile_cache(data, bckoff, buf, bufoff, len, block); + + cid = block->cid; + block = list_first_entry(&block->list, + struct fat_file_block_t, list); + } else { + // Read block from sdcard, create cache + cid = get_next_cluster(data->fat->fat_lba, cid); + + if (invalid_cid(cid)) { + break; + } + + ret = _readfile_fat32(data, bckoff, buf, bufoff, len, coid, cid); + } + + if (ret < 0) { + break; + } + + bufoff += ret; + result += ret; + coid += 1; + len -= ret; + } + + return result; +} + +static int fat32fs_read(struct file *file, void *buf, size_t len) +{ + struct fat_internal *data; + int filesize; + int ret; + + if (fat32fs_isdir(file->vnode)) { + return -1; + } + + filesize = fat32fs_getsize(file->vnode); + + data = file->vnode->internal; + + if (file->f_pos + len > filesize) { + len = filesize - file->f_pos; + } + + if (!len) { + return len; + } + + ret = _readfile(buf, data, file->f_pos, len); + + if (ret <= 0) { + return ret; + } + + file->f_pos += ret; + + return ret; +} + +static int fat32fs_open(struct vnode *file_node, struct file *target) +{ + target->vnode = file_node; + target->f_pos = 0; + target->f_ops = file_node->f_ops; + + return 0; +} + +static int fat32fs_close(struct file *file) +{ + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + + return 0; +} + +static long fat32fs_lseek64(struct file *file, long offset, int whence) +{ + int filesize; + int base; + + if (!fat32fs_isdir(file->vnode)) { + return -1; + } + + filesize = fat32fs_getsize(file->vnode); + + if (filesize < 0) { + return -1; + } + + switch (whence) { + case SEEK_SET: + base = 0; + break; + case SEEK_CUR: + base = file->f_pos; + break; + case SEEK_END: + base = filesize; + break; + default: + return -1; + } + + if (base + offset > filesize) { + return -1; + } + + file->f_pos = base + offset; + + return 0; +} + +static int fat32fs_ioctl(struct file *file, uint64 request, va_list args) +{ + return -1; +} + +/* Others */ + +static uint32 get_next_cluster(uint32 fat_lba, uint32 cluster_id) +{ + struct cluster_entry_t *ce; + uint32 idx; + uint8 buf[BLOCK_SIZE]; + + if (invalid_cid(cluster_id)) { + return cluster_id; + } + + fat_lba += cluster_id / CLUSTER_ENTRY_PER_BLOCK; + idx = cluster_id % CLUSTER_ENTRY_PER_BLOCK; + + // TODO: Cache FAT + sd_readblock(fat_lba, buf); + + ce = &(((struct cluster_entry_t *)buf)[idx]); + + return ce->val; +} + +static uint32 alloc_cluster(struct fat_info_t *fat, uint32 prev_cid) +{ + struct cluster_entry_t *ce; + uint32 fat_lba; + uint32 cid; + int found; + uint8 buf[BLOCK_SIZE]; + + fat_lba = fat->fat_lba; // FAT location + cid = 0; + + while (fat_lba < fat->cluster_lba) { + found = 0; + + // TODO: Cache FAT + sd_readblock(fat_lba, buf); + + for (int i = 0; i < CLUSTER_ENTRY_PER_BLOCK; ++i) { + ce = &(((struct cluster_entry_t *)buf)[i]); + + if (!ce->val) { + found = 1; + break; + } + + ++cid; + } + + if (found) { + break; + } + + fat_lba += 1; + } + + if (found && prev_cid) { + uint32 target_lba; + uint32 target_idx; + + target_lba = fat_lba + prev_cid / CLUSTER_ENTRY_PER_BLOCK; + target_idx = prev_cid % CLUSTER_ENTRY_PER_BLOCK; + + // TODO: Cache FAT + sd_readblock(target_lba, buf); + + ce = &(((struct cluster_entry_t *)buf)[target_idx]); + + ce->val = cid; + + sd_writeblock(target_lba, buf); + } + + if (!found) { + panic("fat32 alloc_cluster: No space!"); + return -1; + } + + return cid; +} + +static int invalid_cid(uint32 cid) +{ + if (cid >= INVALID_CID) { + return 1; + } + + return 0; +} + +struct filesystem *fat32fs_init(void) +{ + INIT_LIST_HEAD(&mounts); + + return &fat32fs; +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/framebufferfs.c b/lab8/src/kernel/fs/framebufferfs.c new file mode 100644 index 000000000..0a245c6c8 --- /dev/null +++ b/lab8/src/kernel/fs/framebufferfs.c @@ -0,0 +1,337 @@ +#include +#include +#include +#include +#include + +static uint32 __attribute__((aligned(0x10))) mbox[36]; + +struct fb_info { + uint32 width; + uint32 height; + uint32 pitch; + uint32 isrgb; +}; + +struct fbfs_internal { + const char *name; + struct vnode oldnode; + /* raw frame buffer address */ + uint8 *lfb; + uint32 lfbsize; + int isopened; + int isinit; +}; + +static int fbfs_mount(struct filesystem *fs, struct mount *mount); +static int fbfs_sync(struct filesystem *fs); + +static struct filesystem fbfs = { + .name = "framebufferfs", + .mount = fbfs_mount, + .sync = fbfs_sync +}; + +static int fbfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fbfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fbfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int fbfs_isdir(struct vnode *dir_node); +static int fbfs_getname(struct vnode *dir_node, const char **name); +static int fbfs_getsize(struct vnode *dir_node); + +static struct vnode_operations fbfs_v_ops = { + .lookup = fbfs_lookup, + .create = fbfs_create, + .mkdir = fbfs_mkdir, + .isdir = fbfs_isdir, + .getname = fbfs_getname, + .getsize = fbfs_getsize +}; + +static int fbfs_write(struct file *file, const void *buf, size_t len); +static int fbfs_read(struct file *file, void *buf, size_t len); +static int fbfs_open(struct vnode *file_node, struct file *target); +static int fbfs_close(struct file *file); +static long fbfs_lseek64(struct file *file, long offset, int whence); +static int fbfs_ioctl(struct file *file, uint64 request, va_list args); + +static struct file_operations fbfs_f_ops = { + .write = fbfs_write, + .read = fbfs_read, + .open = fbfs_open, + .close = fbfs_close, + .lseek64 = fbfs_lseek64, + .ioctl = fbfs_ioctl +}; + +/* filesystem methods */ + +static int fbfs_mount(struct filesystem *fs, struct mount *mount) +{ + struct vnode *oldnode; + struct fbfs_internal *internal; + const char *name; + + internal = kmalloc(sizeof(struct fbfs_internal)); + + oldnode = mount->root; + + oldnode->v_ops->getname(oldnode, &name); + + internal->name = name; + internal->oldnode.mount = oldnode->mount; + internal->oldnode.v_ops = oldnode->v_ops; + internal->oldnode.f_ops = oldnode->f_ops; + internal->oldnode.parent = oldnode->parent; + internal->oldnode.internal = oldnode->internal; + internal->lfb = NULL; + internal->isopened = 0; + internal->isinit = 0; + + oldnode->mount = mount; + oldnode->v_ops = &fbfs_v_ops; + oldnode->f_ops = &fbfs_f_ops; + oldnode->internal = internal; + + return 0; +} + +static int fbfs_sync(struct filesystem *fs) +{ + return 0; +} + +/* vnode_operations methods */ + +static int fbfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int fbfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int fbfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int fbfs_isdir(struct vnode *dir_node) +{ + return 0; +} + +static int fbfs_getname(struct vnode *dir_node, const char **name) +{ + struct fbfs_internal *internal; + + internal = dir_node->internal; + + *name = internal->name; + + return 0; +} + +static int fbfs_getsize(struct vnode *dir_node) +{ + return -1; +} + +/* file_operations methods */ + +static int fbfs_write(struct file *file, const void *buf, size_t len) +{ + struct fbfs_internal *internal; + + internal = file->vnode->internal; + + if (!internal->isinit) { + return -1; + } + + if (file->f_pos + len > internal->lfbsize) { + return -1; + } + + memncpy((void *)(internal->lfb + file->f_pos), buf, len); + + file->f_pos += len; + + return len; +} + +static int fbfs_read(struct file *file, void *buf, size_t len) +{ + return -1; +} + +static int fbfs_open(struct vnode *file_node, struct file *target) +{ + struct fbfs_internal *internal; + + preempt_disable(); + + internal = file_node->internal; + + if (internal->isopened) { + preempt_enable(); + + return -1; + } + + internal->isopened = 1; + + preempt_enable(); + + target->vnode = file_node; + target->f_pos = 0; + target->f_ops = file_node->f_ops; + + return 0; +} + +static int fbfs_close(struct file *file) +{ + struct fbfs_internal *internal; + + internal = file->vnode->internal; + + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + + internal->isopened = 0; + + return 0; +} + +static long fbfs_lseek64(struct file *file, long offset, int whence) +{ + struct fbfs_internal *internal; + int base; + + internal = file->vnode->internal; + + switch (whence) { + case SEEK_SET: + base = 0; + break; + case SEEK_CUR: + base = file->f_pos; + break; + case SEEK_END: + base = internal->lfbsize; + default: + return -1; + } + + if (base + offset > internal->lfbsize) { + return -1; + } + + file->f_pos = base + offset; + + return 0; +} + +static int fbfs_ioctl(struct file *file, uint64 request, va_list args) +{ + struct fb_info *user_fb_info; + struct fbfs_internal *internal; + /* dimensions and channel order */ + uint32 width, height, pitch, isrgb; + + if (request != 0) { + return -1; + } + + internal = file->vnode->internal; + + mbox[0] = 35 * 4; + mbox[1] = MBOX_REQUEST_CODE; + + mbox[2] = 0x48003; // set phy wh + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = 1024; // FrameBufferInfo.width + mbox[6] = 768; // FrameBufferInfo.height + + mbox[7] = 0x48004; // set virt wh + mbox[8] = 8; + mbox[9] = 8; + mbox[10] = 1024; // FrameBufferInfo.virtual_width + mbox[11] = 768; // FrameBufferInfo.virtual_height + + mbox[12] = 0x48009; // set virt offset + mbox[13] = 8; + mbox[14] = 8; + mbox[15] = 0; // FrameBufferInfo.x_offset + mbox[16] = 0; // FrameBufferInfo.y.offset + + mbox[17] = 0x48005; // set depth + mbox[18] = 4; + mbox[19] = 4; + mbox[20] = 32; // FrameBufferInfo.depth + + mbox[21] = 0x48006; // set pixel order + mbox[22] = 4; + mbox[23] = 4; + mbox[24] = 1; // RGB, not BGR preferably + + mbox[25] = 0x40001; // get framebuffer, gets alignment on request + mbox[26] = 8; + mbox[27] = 8; + mbox[28] = 4096; // FrameBufferInfo.pointer + mbox[29] = 0; // FrameBufferInfo.size + + mbox[30] = 0x40008; // get pitch + mbox[31] = 4; + mbox[32] = 4; + mbox[33] = 0; // FrameBufferInfo.pitch + + mbox[34] = MBOX_END_TAG; + + // this might not return exactly what we asked for, could be + // the closest supported resolution instead + + mailbox_call(MAILBOX_CH_PROP, mbox); + + if (mbox[20] == 32 && mbox[28] != 0) { + mbox[28] &= 0x3FFFFFFF; // convert GPU address to ARM address + width = mbox[5]; // get actual physical width + height = mbox[6]; // get actual physical height + pitch = mbox[33]; // get number of bytes per line + isrgb = mbox[24]; // get the actual channel order + internal->lfb = (void *)PA2VA(mbox[28]); + internal->lfbsize = mbox[29]; + } else { + // Unable to set screen resolution to 1024x768x32 + return -1; + } + + user_fb_info = va_arg(args, void *); + + user_fb_info->width = width; + user_fb_info->height = height; + user_fb_info->pitch = pitch; + user_fb_info->isrgb = isrgb; + + internal->isinit = 1; + + return 0; +} + +/* Others */ + +struct filesystem *framebufferfs_init(void) +{ + return &fbfs; +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/fsinit.c b/lab8/src/kernel/fs/fsinit.c new file mode 100644 index 000000000..3cec57085 --- /dev/null +++ b/lab8/src/kernel/fs/fsinit.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +void fs_init(void) +{ + struct filesystem *tmpfs, *cpiofs, *uartfs, *fbfs, *fat32fs; + + vfs_init(); + sd_init(); + + tmpfs = tmpfs_init(); + cpiofs = cpiofs_init(); + uartfs = uartfs_init(); + fbfs = framebufferfs_init(); + fat32fs = fat32fs_init(); + register_filesystem(tmpfs); + register_filesystem(cpiofs); + register_filesystem(uartfs); + register_filesystem(fbfs); + register_filesystem(fat32fs); + + vfs_init_rootmount(tmpfs); + + vfs_mkdir("/initramfs"); + vfs_mount("/initramfs", "cpiofs"); + + vfs_mkdir("/dev"); + + vfs_mkdir("/dev/uart"); + vfs_mount("/dev/uart", "uartfs"); + + vfs_mkdir("/dev/framebuffer"); + vfs_mount("/dev/framebuffer", "framebufferfs"); + + vfs_mkdir("/boot"); + vfs_mount("/boot", "fat32fs"); +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/tmpfs.c b/lab8/src/kernel/fs/tmpfs.c new file mode 100644 index 000000000..2619b0c70 --- /dev/null +++ b/lab8/src/kernel/fs/tmpfs.c @@ -0,0 +1,477 @@ +#include +#include +#include +#include + +#define TMPFS_FILE_MAXSIZE PAGE_SIZE + +struct tmpfs_file_t { + char *data; + int size; + int capacity; +}; + +#define TMPFS_DIR_MAXSIZE 0x10 + +struct tmpfs_dir_t { + int size; + struct vnode *entries[TMPFS_DIR_MAXSIZE]; +}; + +#define TMPFS_TYPE_UNDEFINE 0x0 +#define TMPFS_TYPE_FILE 0x1 +#define TMPFS_TYPE_DIR 0x2 + +#define TMPFS_NAME_MAXLEN 0x10 + +struct tmpfs_internal { + char name[TMPFS_NAME_MAXLEN]; + int type; + union { + struct tmpfs_file_t *file; + struct tmpfs_dir_t *dir; + }; + struct vnode *oldnode; +}; + +static int tmpfs_mount(struct filesystem *fs, struct mount *mount); +static int tmpfs_alloc_vnode(struct filesystem *fs, struct vnode **target); +static int tmpfs_sync(struct filesystem *fs); + +static struct filesystem tmpfs = { + .name = "tmpfs", + .mount = tmpfs_mount, + .alloc_vnode = tmpfs_alloc_vnode, + .sync = tmpfs_sync +}; + +static int tmpfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int tmpfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int tmpfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int tmpfs_isdir(struct vnode *dir_node); +static int tmpfs_getname(struct vnode *dir_node, const char **name); +static int tmpfs_getsize(struct vnode *dir_node); + +static struct vnode_operations tmpfs_v_ops = { + .lookup = tmpfs_lookup, + .create = tmpfs_create, + .mkdir = tmpfs_mkdir, + .isdir = tmpfs_isdir, + .getname = tmpfs_getname, + .getsize = tmpfs_getsize +}; + +static int tmpfs_write(struct file *file, const void *buf, size_t len); +static int tmpfs_read(struct file *file, void *buf, size_t len); +static int tmpfs_open(struct vnode *file_node, struct file *target); +static int tmpfs_close(struct file *file); +static long tmpfs_lseek64(struct file *file, long offset, int whence); +static int tmpfs_ioctl(struct file *file, uint64 request, va_list args); + +static struct file_operations tmpfs_f_ops = { + .write = tmpfs_write, + .read = tmpfs_read, + .open = tmpfs_open, + .close = tmpfs_close, + .lseek64 = tmpfs_lseek64, + .ioctl = tmpfs_ioctl +}; + +/* filesystem methods */ + +static int tmpfs_mount(struct filesystem *fs, struct mount *mount) +{ + struct vnode *node, *oldnode; + struct tmpfs_internal *internal; + struct tmpfs_dir_t *dir; + const char *name; + + oldnode = mount->root; + + oldnode->v_ops->getname(oldnode, &name); + + if (strlen(name) >= TMPFS_NAME_MAXLEN) { + return -1; + } + + node = kmalloc(sizeof(struct vnode)); + internal = kmalloc(sizeof(struct tmpfs_internal)); + dir = kmalloc(sizeof(struct tmpfs_dir_t)); + + dir->size = 0; + + node->mount = oldnode->mount; + node->v_ops = oldnode->v_ops; + node->f_ops = oldnode->f_ops; + node->internal = oldnode->internal; + + strcpy(internal->name, name); + internal->type = TMPFS_TYPE_DIR; + internal->dir = dir; + internal->oldnode = node; + + oldnode->mount = mount; + oldnode->v_ops = &tmpfs_v_ops; + oldnode->f_ops = &tmpfs_f_ops; + oldnode->internal = internal; + + return 0; +} + +static int tmpfs_alloc_vnode(struct filesystem *fs, struct vnode **target) +{ + struct vnode *node; + struct tmpfs_internal *internal; + struct tmpfs_dir_t *dir; + + node = kmalloc(sizeof(struct vnode)); + internal = kmalloc(sizeof(struct tmpfs_internal)); + dir = kmalloc(sizeof(struct tmpfs_dir_t)); + + dir->size = 0; + + internal->name[0] = '\0'; + internal->type = TMPFS_TYPE_DIR; + internal->dir = dir; + internal->oldnode = NULL; + + node->mount = NULL; + node->v_ops = &tmpfs_v_ops; + node->f_ops = &tmpfs_f_ops; + node->internal = internal; + + *target = node; + + return 0; +} + +static int tmpfs_sync(struct filesystem *fs) +{ + return 0; +} + +/* vnode_operations methods */ + +static int tmpfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct tmpfs_internal *internal; + struct tmpfs_dir_t *dir; + int i; + + internal = dir_node->internal; + + if (internal->type != TMPFS_TYPE_DIR) { + return -1; + } + + dir = internal->dir; + + for (i = 0; i < dir->size ; ++i) { + struct vnode *node; + const char *name; + int ret; + + node = dir->entries[i]; + + ret = node->v_ops->getname(node, &name); + + if (ret < 0) { + continue; + } + + if (!strcmp(name, component_name)) { + break; + } + } + + if (i >= dir->size) { + return -1; + } + + *target = dir->entries[i]; + + return 0; +} + +static int tmpfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct tmpfs_internal *internal, *newint; + struct tmpfs_file_t *file; + struct tmpfs_dir_t *dir; + struct vnode *node; + int ret; + + if (strlen(component_name) >= 0x10) { + return -1; + } + + internal = dir_node->internal; + + if (internal->type != TMPFS_TYPE_DIR) { + return -1; + } + + dir = internal->dir; + + if (dir->size >= TMPFS_DIR_MAXSIZE) { + return -1; + } + + ret = tmpfs_lookup(dir_node, &node, component_name); + + if (!ret) { + return -1; + } + + node = kmalloc(sizeof(struct vnode)); + newint = kmalloc(sizeof(struct tmpfs_internal)); + file = kmalloc(sizeof(struct tmpfs_file_t)); + + file->data = kmalloc(TMPFS_FILE_MAXSIZE); + file->size = 0; + file->capacity = TMPFS_FILE_MAXSIZE; + + strcpy(newint->name, component_name); + newint->type = TMPFS_TYPE_FILE; + newint->file = file; + newint->oldnode = NULL; + + node->mount = dir_node->mount; + node->v_ops = &tmpfs_v_ops; + node->f_ops = &tmpfs_f_ops; + node->parent = dir_node; + node->internal = newint; + + dir->entries[dir->size] = node; + dir->size++; + + *target = node; + + return 0; +} + +static int tmpfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + struct tmpfs_internal *internal, *newint; + struct tmpfs_dir_t *dir, *newdir; + struct vnode *node; + int ret; + + if (strlen(component_name) >= 0x10) { + return -1; + } + + internal = dir_node->internal; + + if (internal->type != TMPFS_TYPE_DIR) { + return -1; + } + + dir = internal->dir; + + if (dir->size >= TMPFS_DIR_MAXSIZE) { + return -1; + } + + ret = tmpfs_lookup(dir_node, &node, component_name); + + if (!ret) { + return -1; + } + + node = kmalloc(sizeof(struct vnode)); + newint = kmalloc(sizeof(struct tmpfs_internal)); + newdir = kmalloc(sizeof(struct tmpfs_dir_t)); + + newdir->size = 0; + + strcpy(newint->name, component_name); + newint->type = TMPFS_TYPE_DIR; + newint->dir = newdir; + newint->oldnode = NULL; + + node->mount = dir_node->mount; + node->v_ops = &tmpfs_v_ops; + node->f_ops = &tmpfs_f_ops; + node->parent = dir_node; + node->internal = newint; + + dir->entries[dir->size] = node; + dir->size++; + + *target = node; + + return 0; +} + +static int tmpfs_isdir(struct vnode *dir_node) +{ + struct tmpfs_internal *internal; + + internal = dir_node->internal; + + if (internal->type != TMPFS_TYPE_DIR) { + return 0; + } + + return 1; +} + +static int tmpfs_getname(struct vnode *dir_node, const char **name) +{ + struct tmpfs_internal *internal; + + internal = dir_node->internal; + + *name = internal->name; + + return 0; +} + +static int tmpfs_getsize(struct vnode *dir_node) +{ + struct tmpfs_internal *internal; + + internal = dir_node->internal; + + if (internal->type != TMPFS_TYPE_FILE) { + return -1; + } + + return internal->file->size; +} + +/* file_operations methods */ + +static int tmpfs_write(struct file *file, const void *buf, size_t len) +{ + struct tmpfs_internal *internal; + struct tmpfs_file_t *f; + + internal = file->vnode->internal; + + if (internal->type != TMPFS_TYPE_FILE) { + return -1; + } + + f = internal->file; + + if (len > f->capacity - file->f_pos) { + len = f->capacity - file->f_pos; + } + + if (!len) { + return 0; + } + + memncpy(&f->data[file->f_pos], buf, len); + + file->f_pos += len; + + if (file->f_pos > f->size) { + f->size = file->f_pos; + } + + return len; +} + +static int tmpfs_read(struct file *file, void *buf, size_t len) +{ + struct tmpfs_internal *internal; + struct tmpfs_file_t *f; + + internal = file->vnode->internal; + + if (internal->type != TMPFS_TYPE_FILE) { + return -1; + } + + f = internal->file; + + if (len > f->size - file->f_pos) { + len = f->size - file->f_pos; + } + + if (!len) { + return 0; + } + + memncpy(buf, &f->data[file->f_pos], len); + + file->f_pos += len; + + return len; +} + +static int tmpfs_open(struct vnode *file_node, struct file *target) +{ + // TODO: Verify file access permission + + target->vnode = file_node; + target->f_pos = 0; + target->f_ops = file_node->f_ops; + + return 0; +} + +static int tmpfs_close(struct file *file) +{ + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + + return 0; +} + +static long tmpfs_lseek64(struct file *file, long offset, int whence) +{ + int filesize; + int base; + + filesize = file->vnode->v_ops->getsize(file->vnode); + + if (filesize < 0) { + return -1; + } + + switch (whence) { + case SEEK_SET: + base = 0; + break; + case SEEK_CUR: + base = file->f_pos; + break; + case SEEK_END: + base = filesize; + break; + default: + return -1; + } + + if (base + offset > filesize) { + // TODO: Create a gap (a "hole") + return -1; + } + + file->f_pos = base + offset; + + return 0; +} + +static int tmpfs_ioctl(struct file *file, uint64 request, va_list args) +{ + return -1; +} + +/* Others */ + +struct filesystem *tmpfs_init(void) +{ + return &tmpfs; +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/uartfs.c b/lab8/src/kernel/fs/uartfs.c new file mode 100644 index 000000000..533451d87 --- /dev/null +++ b/lab8/src/kernel/fs/uartfs.c @@ -0,0 +1,178 @@ +#include +#include +#include + +struct uartfs_internal { + const char *name; + struct vnode oldnode; +}; + +static int uartfs_mount(struct filesystem *fs, struct mount *mount); +static int uartfs_sync(struct filesystem *fs); + +static struct filesystem uartfs = { + .name = "uartfs", + .mount = uartfs_mount, + .sync = uartfs_sync +}; + +static int uartfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int uartfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int uartfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name); +static int uartfs_isdir(struct vnode *dir_node); +static int uartfs_getname(struct vnode *dir_node, const char **name); +static int uartfs_getsize(struct vnode *dir_node); + +static struct vnode_operations uartfs_v_ops = { + .lookup = uartfs_lookup, + .create = uartfs_create, + .mkdir = uartfs_mkdir, + .isdir = uartfs_isdir, + .getname = uartfs_getname, + .getsize = uartfs_getsize +}; + +static int uartfs_write(struct file *file, const void *buf, size_t len); +static int uartfs_read(struct file *file, void *buf, size_t len); +static int uartfs_open(struct vnode *file_node, struct file *target); +static int uartfs_close(struct file *file); +static long uartfs_lseek64(struct file *file, long offset, int whence); +static int uartfs_ioctl(struct file *file, uint64 request, va_list args); + +static struct file_operations uartfs_f_ops = { + .write = uartfs_write, + .read = uartfs_read, + .open = uartfs_open, + .close = uartfs_close, + .lseek64 = uartfs_lseek64, + .ioctl = uartfs_ioctl +}; + +/* filesystem methods */ + +static int uartfs_mount(struct filesystem *fs, struct mount *mount) +{ + struct vnode *oldnode; + struct uartfs_internal *internal; + const char *name; + + internal = kmalloc(sizeof(struct uartfs_internal)); + + oldnode = mount->root; + + oldnode->v_ops->getname(oldnode, &name); + + internal->name = name; + internal->oldnode.mount = oldnode->mount; + internal->oldnode.v_ops = oldnode->v_ops; + internal->oldnode.f_ops = oldnode->f_ops; + internal->oldnode.parent = oldnode->parent; + internal->oldnode.internal = oldnode->internal; + + oldnode->mount = mount; + oldnode->v_ops = &uartfs_v_ops; + oldnode->f_ops = &uartfs_f_ops; + oldnode->internal = internal; + + return 0; +} + +static int uartfs_sync(struct filesystem *fs) +{ + return 0; +} + +/* vnode_operations methods */ + +static int uartfs_lookup(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int uartfs_create(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int uartfs_mkdir(struct vnode *dir_node, struct vnode **target, + const char *component_name) +{ + return -1; +} + +static int uartfs_isdir(struct vnode *dir_node) +{ + return 0; +} + +static int uartfs_getname(struct vnode *dir_node, const char **name) +{ + struct uartfs_internal *internal; + + internal = dir_node->internal; + + *name = internal->name; + + return 0; +} + +static int uartfs_getsize(struct vnode *dir_node) +{ + return -1; +} + +/* file_operations methods */ + +static int uartfs_write(struct file *file, const void *buf, size_t len) +{ + uart_sendn(buf, len); + + return len; +} + +static int uartfs_read(struct file *file, void *buf, size_t len) +{ + uart_recvn(buf, len); + + return len; +} + +static int uartfs_open(struct vnode *file_node, struct file *target) +{ + target->vnode = file_node; + target->f_pos = 0; + target->f_ops = file_node->f_ops; + + return 0; +} + +static int uartfs_close(struct file *file) +{ + file->vnode = NULL; + file->f_pos = 0; + file->f_ops = NULL; + + return 0; +} + +static long uartfs_lseek64(struct file *file, long offset, int whence) +{ + return -1; +} + +static int uartfs_ioctl(struct file *file, uint64 request, va_list args) +{ + return -1; +} + +/* Others */ + +struct filesystem *uartfs_init(void) +{ + return &uartfs; +} \ No newline at end of file diff --git a/lab8/src/kernel/fs/vfs.c b/lab8/src/kernel/fs/vfs.c new file mode 100644 index 000000000..e8115d5c2 --- /dev/null +++ b/lab8/src/kernel/fs/vfs.c @@ -0,0 +1,585 @@ +#include +#include +#include +#include +#include +#include +#include + +struct mount *rootmount; + +static struct list_head filesystems; + +/* + * Return directory vnode, and set @pathname to the last component name. + * If the @pathname is end with '/', set @pathname to NULL + * + * For example: + * + * If @pathname is "/abc/def/ghi". + * Return the vnode of "/abc/def", and set @pathname to "ghi". + * + * If @pathname is "/abc/def/". + * Return the vnode of "/abc/def", and set @pathname to NULL. + * + */ +static struct vnode *get_dir_vnode(struct vnode *dir_node, + const char **pathname) +{ + struct vnode *result; + const char *start; + const char *end; + char buf[0x100]; + + start = end = *pathname; + + if (*start == '/') { + result = rootmount->root; + } else { + result = dir_node; + } + + while (1) { + if (!strncmp("./", start, 2)) { + start += 2; + end = start; + continue; + } else if (!strncmp("../", start, 3)) { + if (result->parent) { + result = result->parent; + } + + start += 3; + end = start; + continue; + } + + // Find next component + while (*end != '\0' && *end != '/') { + end++; + } + + if (*end == '/') { + int ret; + + if (start == end) { + // Case like "//" + end++; + start = end; + continue; + } + + // TODO: Check if the length is less than 0x100 + memncpy(buf, start, end - start); + buf[end - start] = 0; + + ret = result->v_ops->lookup(result, &result, buf); + + if (ret < 0) { + return NULL; + } + + end++; + start = end; + } else { + break; + } + } + + *pathname = *start ? start : NULL; + + return result; +} + +static struct filesystem *find_filesystem(const char *filesystem) +{ + struct filesystem *fs; + + list_for_each_entry(fs, &filesystems, fs_list) { + if (!strcmp(fs->name, filesystem)) { + return fs; + } + } + + return NULL; +} + +void vfs_init(void) +{ + INIT_LIST_HEAD(&filesystems); +} + +void vfs_init_rootmount(struct filesystem *fs) +{ + struct vnode *n; + int ret; + + ret = fs->alloc_vnode(fs, &n); + if (ret < 0) { + panic("vfs_init_rootmount failed"); + } + + rootmount = kmalloc(sizeof(struct mount)); + + rootmount->root = n; + rootmount->fs = fs; + + n->mount = rootmount; + n->parent = NULL; +} + +int register_filesystem(struct filesystem *fs) +{ + list_add_tail(&fs->fs_list, &filesystems); + + return 0; +} + +int vfs_open(const char *pathname, int flags, struct file *target) +{ + const char *curname; + struct vnode *dir_node; + struct vnode *file_node; + int ret; + + curname = pathname; + dir_node = get_dir_vnode(current->work_dir, &curname); + + if (!dir_node) { + return -1; + } + + if (!curname) { + return -1; + } + + ret = dir_node->v_ops->lookup(dir_node, &file_node, curname); + + if (flags & O_CREAT) { + // TODO: Support overwrite a existed + + if (ret == 0) { + return -1; + } + + ret = dir_node->v_ops->create(dir_node, &file_node, curname); + } + + if (ret < 0) { + return ret; + } + + if (!file_node) { + return -1; + } + + ret = file_node->f_ops->open(file_node, target); + + if (ret < 0) { + return ret; + } + + target->flags = 0; + + return 0; +} + +int vfs_close(struct file *file) +{ + return file->f_ops->close(file); +} + +int vfs_write(struct file *file, const void *buf, size_t len) +{ + return file->f_ops->write(file, buf, len); +} + +int vfs_read(struct file *file, void *buf, size_t len) +{ + return file->f_ops->read(file, buf, len); +} + +long vfs_lseek64(struct file *file, long offset, int whence) +{ + return file->f_ops->lseek64(file, offset, whence); +} + +int vfs_ioctl(struct file *file, uint64 request, va_list args) +{ + return file->f_ops->ioctl(file, request, args); +} + +int vfs_mkdir(const char *pathname) +{ + const char *curname; + struct vnode *dir_node; + struct vnode *newdir_node; + int ret; + + curname = pathname; + + if (current) { + dir_node = get_dir_vnode(current->work_dir, &curname); + } else { + dir_node = get_dir_vnode(rootmount->root, &curname); + } + + if (!dir_node) { + return -1; + } + + if (!curname) { + return -1; + } + + ret = dir_node->v_ops->mkdir(dir_node, &newdir_node, curname); + + return ret; +} + +int vfs_mount(const char *mountpath, const char *filesystem) +{ + const char *curname; + struct vnode *dir_node; + struct filesystem *fs; + struct mount *mo; + int ret; + + curname = mountpath; + + if (current) { + dir_node = get_dir_vnode(current->work_dir, &curname); + } else { + dir_node = get_dir_vnode(rootmount->root, &curname); + } + + if (!dir_node) { + return -1; + } + + if (curname) { + // find return 0 + ret = dir_node->v_ops->lookup(dir_node, &dir_node, curname); + if (ret < 0) { + return ret; + } + } + + if (!dir_node->v_ops->isdir(dir_node)) { + return -1; + } + + fs = find_filesystem(filesystem); + + if (!fs) { + return -1; + } + + mo = kmalloc(sizeof(struct mount)); + + mo->root = dir_node; + mo->fs = fs; + + ret = fs->mount(fs, mo); + + if (ret < 0) { + kfree(mo); + return ret; + } + + return 0; +} + +int vfs_lookup(const char *pathname, struct vnode **target) +{ + const char *curname; + struct vnode *dir_node; + struct vnode *file_node; + int ret; + + curname = pathname; + dir_node = get_dir_vnode(current->work_dir, &curname); + + if (!dir_node) { + return -1; + } + + if (!curname) { + *target = dir_node; + + return 0; + } + + ret = dir_node->v_ops->lookup(dir_node, &file_node, curname); + + if (ret < 0) { + return ret; + } + + *target = file_node; + + return 0; +} + +int vfs_sync(struct filesystem *fs) +{ + return fs->sync(fs); +} + +static int do_open(const char *pathname, int flags) +{ + int i, ret; + + for (i = 0; i <= current->maxfd; ++i) { + if (current->fds[i].vnode == NULL) { + break; + } + } + + if (i > current->maxfd) { + if (current->maxfd >= TASK_MAX_FD) { + return -1; + } + + current->maxfd += 1; + i = current->maxfd; + } + + ret = vfs_open(pathname, flags, ¤t->fds[i]); + + if (ret < 0) { + current->fds[i].vnode = NULL; + + return ret; + } + + return i; +} + +static int do_close(int fd) +{ + int ret; + + if (fd < 0 || current->maxfd < fd) { + return -1; + } + + if (current->fds[fd].vnode == NULL) { + return -1; + } + + ret = vfs_close(¤t->fds[fd]); + + if (ret < 0) { + return ret; + } + + return 0; +} + +static int do_write(int fd, const void *buf, uint64 count) +{ + int ret; + + if (fd < 0 || current->maxfd < fd) { + return -1; + } + + if (current->fds[fd].vnode == NULL) { + return -1; + } + + ret = vfs_write(¤t->fds[fd], buf, count); + + return ret; +} + +static int do_read(int fd, void *buf, uint64 count) +{ + int ret; + + if (fd < 0 || current->maxfd < fd) { + return -1; + } + + if (current->fds[fd].vnode == NULL) { + return -1; + } + + ret = vfs_read(¤t->fds[fd], buf, count); + + return ret; +} + +static int do_mkdir(const char *pathname, uint32 mode) +{ + int ret; + + ret = vfs_mkdir(pathname); + + return ret; +} + +static int do_mount(const char *target, const char *filesystem) +{ + int ret; + + ret = vfs_mount(target, filesystem); + + return ret; +} + +static int do_chdir(const char *path) +{ + struct vnode *result; + int ret; + + ret = vfs_lookup(path, &result); + + if (ret < 0) { + return ret; + } + + if (!result->v_ops->isdir(result)) { + return -1; + } + + current->work_dir = result; + + return 0; +} + +static long do_lseek64(int fd, int64 offset, int whence) +{ + long ret; + + if (fd < 0 || current->maxfd < fd) { + return -1; + } + + if (current->fds[fd].vnode == NULL) { + return -1; + } + + ret = vfs_lseek64(¤t->fds[fd], offset, whence); + + return ret; +} + +static int do_ioctl(int fd, uint64 request, va_list args) +{ + int ret; + + if (fd < 0 || current->maxfd < fd) { + return -1; + } + + if (current->fds[fd].vnode == NULL) { + return -1; + } + + ret = vfs_ioctl(¤t->fds[fd], request, args); + + return ret; +} + +static int do_sync(void) +{ + struct filesystem *entry; + + list_for_each_entry(entry, &filesystems, fs_list) { + vfs_sync(entry); + } + + return 0; +} + +void syscall_open(trapframe *frame, const char *pathname, int flags) +{ + int fd = do_open(pathname, flags); + + frame->x0 = fd; + + uart_sync_printf("[open] (\"%s\", 0x%x) = %d\r\n", pathname, flags, fd); +} + +void syscall_close(trapframe *frame, int fd) +{ + int ret = do_close(fd); + + frame->x0 = ret; + + uart_sync_printf("[close] (%d) = %d\r\n", fd, ret); +} + +void syscall_write(trapframe *frame, int fd, const void *buf, uint64 count) +{ + int ret = do_write(fd, buf, count); + + frame->x0 = ret; + + uart_sync_printf("[write] (%d, \"%s\", 0x%x) = %d\r\n", fd, buf, count, ret); +} + +void syscall_read(trapframe *frame, int fd, void *buf, uint64 count) +{ + int ret = do_read(fd, buf, count); + + frame->x0 = ret; + + uart_sync_printf("[read] (%d, \"%s\", 0x%x) = %d\r\n", fd, buf, count, ret); +} + +void syscall_mkdir(trapframe *frame, const char *pathname, uint32 mode) +{ + int ret = do_mkdir(pathname, mode); + + frame->x0 = ret; +} + +void syscall_mount(trapframe *frame, const char *src, const char *target, + const char *filesystem, uint64 flags, const void *data) +{ + int ret = do_mount(target, filesystem); + + frame->x0 = ret; +} + +void syscall_chdir(trapframe *frame, const char *path) +{ + int ret = do_chdir(path); + + frame->x0 = ret; +} + +void syscall_lseek64(trapframe *frame, int fd, int64 offset, int whence) +{ + long ret = do_lseek64(fd, offset, whence); + + frame->x0 = ret; + + uart_sync_printf("[lseek64] (%d, 0x%x, 0x%x) = %d\r\n", fd, offset, whence, ret); +} + +void syscall_ioctl(trapframe *frame, int fd, uint64 request, ...) +{ + int ret; + va_list args; + + va_start(args, request); + + ret = do_ioctl(fd, request, args); + + va_end(args); + + frame->x0 = ret; +} + +void syscall_sync(trapframe *frame) +{ + int ret = do_sync(); + + frame->x0 = ret; + + uart_sync_printf("[sync] = %d\r\n", ret); +} \ No newline at end of file diff --git a/lab8/src/kernel/head.S b/lab8/src/kernel/head.S new file mode 100644 index 000000000..1deaeaa08 --- /dev/null +++ b/lab8/src/kernel/head.S @@ -0,0 +1,316 @@ +// Reference: https://github.com/s-matyukevich/raspberry-pi-os +.section ".text.boot" + +.globl _start +_start: + // Preserve flattened devicetree pointer + mov x19, x0 + + bl from_el2_to_el1 + // the next instruction runs in EL1 + + // Set booting stack + ldr x0, =_PA_stack_top + mov sp, x0 + + bl mmu_init + + // Use virtual address after mmu_init + ldr x0, =_va_trampoline + br x0 +_va_trampoline: + + bl set_exception_vector_table + + bl enable_core0_timer + + // Initialize bss + ldr x0, =_sbss + ldr x1, =_ebss + sub x1, x1, x0 + bl memzero + + // Initialize stack + ldr x0, =_stack_top + mov sp, x0 + // Pass flattened devicetree pointer + mov x0, x19 + bl start_kernel + + // Should never return +proc_hang: + b proc_hang + +from_el2_to_el1: + // EL1 uses aarch64 + mov x0, (1 << 31) + msr hcr_el2, x0 + // Disable interrupt ({D, A, I, F} = 1 (masked)) + // EL1h ({M[3:0]} = 5) + mov x0, 0x3c5 + msr spsr_el2, x0 + msr elr_el2, lr + // return to EL1 + eret + +set_exception_vector_table: + adr x0, exception_vector_table + msr vbar_el1, x0 + ret + +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 8 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] +.endm + +// save exception registers to stack +.macro save_exception_reg + sub sp, sp, 2 * 8 + mrs x0, elr_el1 + mrs x1, spsr_el1 + stp x0, x1, [sp, 0] +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + add sp, sp, 32 * 8 +.endm + +// load exception registers from stack +.macro load_exception_reg + ldp x0, x1, [sp, 0] + msr elr_el1, x0 + msr spsr_el1, x1 + add sp, sp, 2 * 8 +.endm + +.macro kernel_entry el + sub sp, sp, 17 * 16 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + + .if \el == 0 + mrs x0, sp_el\el + stp x30, x0, [sp, 16 * 15] + .else + str x30, [sp, 16 * 15] + .endif + + mrs x0, elr_el1 + mrs x1, spsr_el1 + stp x0, x1, [sp, 16 * 16] +.endm + +.macro kernel_exit el + ldp x0, x1, [sp, 16 * 16] + msr elr_el1, x0 + msr spsr_el1, x1 + + .if \el ==0 + ldp x30, x0, [sp, 16 * 15] + msr sp_el\el, x0 + .else + ldr x30, [sp, 16 * 15] + .endif + + ldp x28, x29, [sp ,16 * 14] + ldp x26, x27, [sp ,16 * 13] + ldp x24, x25, [sp ,16 * 12] + ldp x22, x23, [sp ,16 * 11] + ldp x20, x21, [sp ,16 * 10] + ldp x18, x19, [sp ,16 * 9] + ldp x16, x17, [sp ,16 * 8] + ldp x14, x15, [sp ,16 * 7] + ldp x12, x13, [sp ,16 * 6] + ldp x10, x11, [sp ,16 * 5] + ldp x8, x9, [sp ,16 * 4] + ldp x6, x7, [sp ,16 * 3] + ldp x4, x5, [sp ,16 * 2] + ldp x2, x3, [sp ,16 * 1] + ldp x0, x1, [sp ,16 * 0] + add sp, sp, 17 * 16 + + eret +.endm + +exception_handler: + // Do nothing + save_all + + mov x0, 0 + bl exception_default_handler + + load_all + eret + +l64_syn_eh: + kernel_entry 0 + + mov x0, sp + mrs x1, esr_el1 + bl el0_sync_handler + + mov x0, sp + bl exit_to_user_mode + + kernel_exit 0 + +l64_irq_eh: + kernel_entry 0 + + bl irq_handler + + mov x0, sp + bl exit_to_user_mode + + kernel_exit 0 + +curr_syn_eh: + save_all + + mov x0, 1 + bl exception_default_handler + + load_all + eret + +curr_irq_eh: + kernel_entry 1 + + bl irq_handler + + kernel_exit 1 + +curr_fiq_eh: + save_all + + mov x0, 2 + bl exception_default_handler + + load_all + eret + +curr_se_eh: + save_all + + mov x0, 3 + bl exception_default_handler + + load_all + eret + +.align 11 // vector table should be aligned to 0x800 +.global exception_vector_table +exception_vector_table: + // Exception from the current EL while using SP_EL0 + // Synchronous + b exception_handler + .align 7 + + // IRQ + b exception_handler + .align 7 + + // FIQ + b exception_handler + .align 7 + + // SError + b exception_handler + .align 7 + + // Exception from the current EL while using SP_ELx + // Synchronous + b curr_syn_eh + .align 7 + + // IRQ + b curr_irq_eh + .align 7 + + // FIQ + b curr_fiq_eh + .align 7 + + // SError + b curr_se_eh + .align 7 + + // Exception from a lower EL and at least one lower EL is AArch64 + // Synchronous + b l64_syn_eh + .align 7 + + // IRQ + b l64_irq_eh + .align 7 + + // FIQ + b exception_handler + .align 7 + + // SError + b exception_handler + .align 7 + + // Exception from a lower EL and all lower ELs are AArch32 + // Synchronous + b exception_handler + .align 7 + + // IRQ + b exception_handler + .align 7 + + // FIQ + b exception_handler + .align 7 + + // SError + b exception_handler + .align 7 \ No newline at end of file diff --git a/lab8/src/kernel/irq.c b/lab8/src/kernel/irq.c new file mode 100644 index 000000000..d72a4f463 --- /dev/null +++ b/lab8/src/kernel/irq.c @@ -0,0 +1,255 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IRQ_TASK_NUM 32 + +typedef struct { + /* cb(args) */ + void (*cb)(void *); + void *args; + /* Priority, the lowest priority is 0 */ + uint32 prio; + uint32 is_running; + /* Link to next priority */ + struct list_head np_list; + /* Link all tasks that is same priority */ + struct list_head sp_list; +} irq_task; + +irq_task irq_tasks[IRQ_TASK_NUM]; + +/* Metadata of irq_tasks + * This list links tasks with different priorities and is structured + * as shown below: + * @irq_tasks_meta <-> task (prio: 5) <-> task (prio: 2) <-> task (prio: 0) + * ^ ^ ^ + * | | | + * v v v + * task (prio: 5) task (prio: 2) task (prio: 0) + * + * If a task isn't in the irq_tasks_meta list, its np_list isn't used. + */ +struct list_head irq_tasks_meta; + +/* This variable has 32 bits, n-th bit stands for the status of irq_tasks[n]. + * If n-th bit is 1, it means irq_tasks[n] is available. + * If n-th bit is 0, it means irq_tasks[n] is unavailable. + */ +uint32 irq_tasks_status; + +uint32 irq_nested_layer; + +/* + * Interrupts must be disabled before calling this function. + */ +static irq_task *it_alloc() +{ + uint32 idx; + + idx = ffs(irq_tasks_status); + + if (idx == 0) { + return NULL; + } + + irq_tasks_status &= ~(1 << (idx - 1)); + + return &irq_tasks[idx - 1]; +} + +static void it_release(irq_task *it) +{ + if (!it) { + return; + } + + uint32 idx = get_elem_idx(it, irq_tasks); + + irq_tasks_status |= (1 << idx); +} + +static void it_remove(irq_task *it) +{ + if (!list_empty(&it->np_list)) { + if (!list_empty(&it->sp_list)) { + irq_task *prev_np = list_last_entry(&it->np_list, irq_task, np_list); + irq_task *next_sp = list_first_entry(&it->sp_list, irq_task, sp_list); + + list_del(&it->np_list); + list_add(&next_sp->np_list, &prev_np->np_list); + } else { + list_del(&it->np_list); + } + } + + list_del(&it->sp_list); + it_release(it); +} + +/* + * Interrupts must be disabled before calling this function. + * + * Return 1 if @it can preempt the currently running irq_task. + */ +static int it_insert(irq_task *it) +{ + irq_task *iter; + int preempt; + int inserted; + + // Insert irq_task + preempt = 1; + inserted = 0; + + list_for_each_entry(iter, &irq_tasks_meta, np_list) { + if (it->prio > iter->prio) { + list_add_tail(&it->np_list, &iter->np_list); + inserted = 1; + break; + } else if (it->prio == iter->prio) { + list_add_tail(&it->sp_list, &iter->sp_list); + preempt = 0; + inserted = 1; + break; + } + preempt = 0; + } + + if (!inserted) { + list_add_tail(&it->np_list, &irq_tasks_meta); + } + + return preempt; +} + +static irq_task *it_get_next_task_to_run() +{ + irq_task *it; + + if (list_empty(&irq_tasks_meta)) { + return NULL; + } + + it = list_first_entry(&irq_tasks_meta, irq_task, np_list); + + if (it->is_running) { + return NULL; + } + + return it; +} + +/* + * Run irq_tasks + */ +static inline void it_run() +{ + while (1) { + irq_task *it = it_get_next_task_to_run(); + + if (!it) { + break; + } + + it->is_running = 1; + + enable_interrupt(); + + (it->cb)(it->args); + + disable_interrupt(); + + it_remove(it); + } +} + +void irq_init() +{ + INIT_LIST_HEAD(&irq_tasks_meta); + irq_tasks_status = 0xffffffff; +} + +/* + * Interrupts must be disabled before calling this function. + */ +int irq_run_task(void (*task)(void *), + void *args, + void (*fini)(void), + uint32 prio) +{ + irq_task *it; + int preempt; + + it = it_alloc(); + + if (!it) { + return -1; + } + + it->cb = task; + it->args = args; + it->prio = prio; + it->is_running = 0; + INIT_LIST_HEAD(&it->np_list); + INIT_LIST_HEAD(&it->sp_list); + preempt = it_insert(it); + + if (preempt) { + it->is_running = 1; + + enable_interrupt(); + + (task)(args); + + disable_interrupt(); + + (fini)(); + + it_remove(it); + } + + it_run(); + + return 0; +} + +void irq_handler() +{ + irq_nested_layer++; + + // These check functions may add irq_task and run it. + if (!timer_irq_check()) {} + else if (!uart_irq_check()) {} + + irq_nested_layer--; + + // IRQ handling completed + + // Reschedule + if (irq_nested_layer || !current->need_resched || current->preempt) { + return; + } + + enable_interrupt(); + + schedule(); + + disable_interrupt(); +} + +void exception_default_handler(uint32 n) +{ + uart_printf("[exception] %d\r\n", n); +} + +void irq1_enable(int bit) +{ + put32(PA2VA(IRQ_ENABLE_1_REG), 1 << bit); +} \ No newline at end of file diff --git a/lab8/src/kernel/kthread.c b/lab8/src/kernel/kthread.c new file mode 100644 index 000000000..a13f4daa1 --- /dev/null +++ b/lab8/src/kernel/kthread.c @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include +#include + +static wait_queue_head *wait_queue; + +static void kthread_start(void) +{ + void (*main)(void); + + asm volatile("mov %0, x19\n" + "mov x19, xzr" + : "=r" (main)); + + main(); + + kthread_fini(); +} + +void kthread_add_wait_queue(task_struct *task) +{ + wq_add_task(task, wait_queue); +} + +/* + * Add to wait_queue to wait some process to recycle this kthread + */ +void kthread_fini(void) +{ + preempt_disable(); + + current->status = TASK_DEAD; + + sched_del_task(current); + + wq_add_task(current, wait_queue); + + preempt_enable(); + + schedule(); + + // Never reach +} + +void kthread_early_init(void) +{ + set_current(NULL); +} + +void kthread_init(void) +{ + task_struct *task; + + // Initialze current task + task = task_create(); + + // Must set current first + set_current(task); + + sched_add_task(task); + + // Create wait_queue + wait_queue = wq_create(); +} + +static inline void pt_regs_init(struct pt_regs *regs, void *main) +{ + regs->x19 = main; + regs->x20 = 0; + regs->x21 = 0; + regs->x22 = 0; + regs->x23 = 0; + regs->x24 = 0; + regs->x25 = 0; + regs->x26 = 0; + regs->x27 = 0; + regs->x28 = 0; + regs->fp = 0; + regs->lr = kthread_start; +} + +void kthread_create(void (*start)(void)) +{ + task_struct *task; + + task = task_create(); + + task->kernel_stack = kmalloc(STACK_SIZE); + task->regs.sp = (char *)task->kernel_stack + STACK_SIZE - 0x10; + pt_regs_init(&task->regs, start); + + sched_add_task(task); +} + +void kthread_kill_zombies(void) +{ + while (1) { + task_struct *task; + + if (wq_empty(wait_queue)) { + return; + } + + preempt_disable(); + + task = wq_get_first_task(wait_queue); + + wq_del_task(task); + + preempt_enable(); + + task_free(task); + } +} \ No newline at end of file diff --git a/lab8/src/kernel/linker.ld b/lab8/src/kernel/linker.ld new file mode 100644 index 000000000..e2dc7a44c --- /dev/null +++ b/lab8/src/kernel/linker.ld @@ -0,0 +1,46 @@ +_stack_top = 0xffff000000400000; +_PA_stack_top = 0x0000000000400000; +_early_mem_base = 0xffff000007000000; +_early_mem_end = 0xffff000007ffffff; + +SECTIONS +{ + . = 0xffff000000080000; + + .text.boot : { + *(.text.boot) + } + + .text : { + *(.text) + } + + . = ALIGN(0x1000); + + _stext_user_shared = .; + .text.user.shared : { + *(.text.user.shared) + } + + . = ALIGN(0x1000); + _etext_user_shared = .; + + .rodata : { + *(.rodata) + } + + .data : { + *(.got) + *(.got.plt) + *(.data*) + } + + _sbss = .; + .bss : { + *(.bss*) + } + _ebss = .; + + . = _stack_top; + _sstack = .; +} \ No newline at end of file diff --git a/lab8/src/kernel/main.c b/lab8/src/kernel/main.c new file mode 100644 index 000000000..e56a8a8e5 --- /dev/null +++ b/lab8/src/kernel/main.c @@ -0,0 +1,306 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFSIZE 0x100 + +static char shell_buf[BUFSIZE]; + +#define TEST_PTR_CNT 0x10 + +static uint8 test_ptrs_inused[TEST_PTR_CNT]; +static char *test_ptrs[TEST_PTR_CNT]; + +static void timeout_print(char *str) +{ + uart_printf("%s\r\n", str); + + kfree(str); +} + +static void foo(void) +{ + for (int i = 0; i < 10; ++i) { + uart_sync_printf("Thread id: %d %d\r\n", current->tid, i); + delay(1000000); + schedule(); + } +} + +static void cmd_alloc(char *ssize) +{ + int size, idx; + + size = atoi(ssize); + + if (size == 0) { + return; + } + + for (idx = 0; idx < TEST_PTR_CNT; ++idx) { + if (!test_ptrs_inused[idx]) { + break; + } + } + + if (idx == TEST_PTR_CNT) { + return; + } + + test_ptrs_inused[idx] = 1; + + test_ptrs[idx] = kmalloc(size); + + uart_printf("[*] ptrs[%d]: %llx\r\n", idx + 1, test_ptrs[idx]); +} + +static void cmd_free(char *sidx) +{ + int idx = atoi(sidx); + + if (idx == 0) { + return; + } + + idx -= 1; + + if (!test_ptrs_inused[idx]) { + return; + } + + test_ptrs_inused[idx] = 0; + + kfree(test_ptrs[idx]); +} + +static void cmd_help(void) +{ + uart_printf( + "alloc \t: " "test allocator" "\r\n" + "exec \t: " "execute file" "\r\n" + "free \t: " "test allocator" "\r\n" + "help\t: " "print this help menu" "\r\n" + "hello\t: " "print Hello World!" "\r\n" + "hwinfo\t: " "print hardware info" "\r\n" + "parsedtb\t: " "parse devicetree blob (dtb)" "\r\n" + "reboot\t: " "reboot the device" "\r\n" + "setTimeout \t: " + "print @msg after @sec seconds" "\r\n" + "sw_timer\t: " "turn on/off timer debug info" "\r\n" + "sw_uart_mode\t: " "use sync/async UART" "\r\n" + "thread_test\t: " "test kthread" "\r\n" + ); +} + +static void cmd_hello(void) +{ + uart_printf("Hello World!\r\n"); +} + +static void cmd_hwinfo(void) +{ + unsigned int rev; + struct arm_memory_info ami; + + // Board revision + rev = get_board_revision(); + uart_printf("[*] Revision: %x\r\n", rev); + + // ARM memory base address and size + get_arm_memory(&ami); + uart_printf("[*] ARM memory base address: %x\r\n", ami.baseaddr); + uart_printf("[*] ARM memory size: %d\r\n", ami.size); +} + +static void cmd_reboot(void) +{ + BCM2837_reset(10); +} + +static void cmd_setTimeout(char *msg, char *ssec) +{ + int len; + char *m; + + len = strlen(msg) + 1; + m = kmalloc(len); + + if (!m) { + return; + } + + memncpy(m, msg, len); + + uart_printf("[*] time: %d\r\n", atoi(ssec)); + timer_add_proc_after((void (*)(void *))timeout_print, m, atoi(ssec)); +} + +static void cmd_sw_timer(void) +{ + timer_switch_info(); +} + +static void cmd_sw_uart_mode(void) +{ + int mode = uart_switch_mode(); + + if (mode == 0) { + uart_printf("[*] Use synchronous UART\r\n"); + } else { + uart_printf("[*] Use asynchronous UART\r\n"); + } +} + +static void cmd_exec(char *filename) +{ + // TODO: Add argv & envp + sched_new_user_prog(filename); +} + +static void cmd_parsedtb(void) +{ + fdt_traversal(fdt_base); +} + +static void cmd_thread_test(void) +{ + for (int i = 0; i < 3; ++i) { + kthread_create(foo); + } +} + +static int shell_read_cmd(void) +{ + return uart_recvline(shell_buf, BUFSIZE); +} + +static void shell(void) +{ + while (1) { + int cmd_len; + uart_printf("# "); + cmd_len = shell_read_cmd(); + uart_printf("\r\n"); + if (!strncmp("alloc", shell_buf, 5)) { + if (cmd_len >= 7) { + cmd_alloc(&shell_buf[6]); + } + } else if (!strncmp("free", shell_buf, 4)) { + if (cmd_len >= 6) { + cmd_free(&shell_buf[5]); + } + } else if (!strcmp("help", shell_buf)) { + cmd_help(); + } else if (!strcmp("hello", shell_buf)) { + cmd_hello(); + } else if (!strcmp("hwinfo", shell_buf)) { + cmd_hwinfo(); + } else if (!strcmp("reboot", shell_buf)) { + cmd_reboot(); + } else if (!strncmp("setTimeout", shell_buf, 10)) { + char *msg, *ssec; + + msg = shell_buf + 10; + + if (*msg != ' ') { + continue; + } + + msg++; + + if (!*msg) { + continue; + } + + ssec = msg; + + while (*(++ssec)) { + if (*ssec == ' ') { + break; + } + } + + if (*ssec != ' ') { + continue; + } + + *ssec = 0; + + ssec++; + + if (!*ssec) { + continue; + } + + cmd_setTimeout(msg, ssec); + } else if (!strcmp("sw_timer", shell_buf)) { + cmd_sw_timer(); + } else if (!strcmp("sw_uart_mode", shell_buf)) { + cmd_sw_uart_mode(); + } else if (!strcmp("parsedtb", shell_buf)) { + cmd_parsedtb(); + } else if (!strcmp("thread_test", shell_buf)) { + cmd_thread_test(); + } else if (!strncmp("exec", shell_buf, 4)) { + if (cmd_len >= 6) { + cmd_exec(&shell_buf[5]); + } + } else { + // Just echo back + uart_printf("%s\r\n", shell_buf); + } + } +} + +static void idle(void) +{ + while (1) { + kthread_kill_zombies(); + schedule(); + } +} + +void start_kernel(char *fdt) +{ + fdt_base = fdt; + + irq_init(); + uart_init(); + initramfs_init(); + mm_init(); + timer_init(); + task_init(); + scheduler_init(); + kthread_early_init(); + fs_init(); + kthread_init(); + + uart_printf("[*] fdt base: %x\r\n", fdt_base); + uart_printf("[*] Kernel start!\r\n"); + + // TODO: Remove shell? + // kthread_create(shell); + + // TODO: Add argv & envp + // First user program + sched_new_user_prog("/initramfs/vfs2.img"); + + // Enable interrupt from Auxiliary peripherals + irq1_enable(29); + + enable_interrupt(); + + idle(); +} \ No newline at end of file diff --git a/lab8/src/kernel/mini_uart.c b/lab8/src/kernel/mini_uart.c new file mode 100644 index 000000000..383e044f5 --- /dev/null +++ b/lab8/src/kernel/mini_uart.c @@ -0,0 +1,373 @@ +// Ref: https://github.com/s-matyukevich/raspberry-pi-os/blob/master/src/lesson01/src/mini_uart.c +#include +#include +#include +#include + +#define SIGN 1 + +#define BUFSIZE 0x100 + +static void uart_irq_handler(void *); +static void uart_irq_fini(void); + +// UART asynchronous/synchronous mode +// 0: Synchronous mode +// 1: Asynchronous mode +static int uart_sync_mode; + +// UART read / write function pointer +typedef char (*recvfp)(void); +typedef void (*sendfp)(char); + +recvfp uart_recv_fp; +sendfp uart_send_fp; + +// Data structure for async RW +static char r_ringbuf[BUFSIZE]; +static char w_ringbuf[BUFSIZE]; +static int r_head, r_tail; +static int w_head, w_tail; + +static char uart_asyn_recv(void) +{ + uint32 ier; + char tmp; + + // Enable R interrupt + ier = get32(PA2VA(AUX_MU_IER_REG)); + ier = ier | 0x01; + put32(PA2VA(AUX_MU_IER_REG), ier); + + while (r_head == r_tail) {} + + tmp = r_ringbuf[r_head]; + r_head = (r_head + 1) % BUFSIZE; + + return tmp; +} + +static void uart_asyn_send(char c) +{ + uint32 ier; + + while (w_head == (w_tail + 1) % BUFSIZE) { + } + + w_ringbuf[w_tail] = c; + w_tail = (w_tail + 1) % BUFSIZE; + + // Enable W interrupt + ier = get32(PA2VA(AUX_MU_IER_REG)); + ier = ier | 0x02; + put32(PA2VA(AUX_MU_IER_REG), ier); +} + +static char uart_sync_recv(void) +{ + while (!(get32(PA2VA(AUX_MU_LSR_REG)) & 0x01)) {}; + + return (get32(PA2VA(AUX_MU_IO_REG)) & 0xFF); +} + +static void uart_sync_send(char c) +{ + while (!(get32(PA2VA(AUX_MU_LSR_REG)) & 0x20)) {}; + + put32(PA2VA(AUX_MU_IO_REG), c); +} + +char uart_recv(void) +{ + return (uart_recv_fp)(); +} + +void uart_send(char c) +{ + (uart_send_fp)(c); +} + +void uart_recvn(char *buff, int n) +{ + while (n--) { + *buff++ = (uart_recv_fp)(); + } +} + +uint32 uart_recv_uint(void) +{ + char buf[4]; + + for (int i = 0; i < 4; ++i) { + buf[i] = (uart_recv_fp)(); + } + + return *((uint32*)buf); +} + +uint32 uart_recvline(char *buff, int maxlen) +{ + uint32 cnt = 0; + + // Reserve space for NULL byte + maxlen--; + + while (maxlen) { + char c = (uart_recv_fp)(); + + if (c == '\r') { + // TODO: what if c == '\0'? + break; + } + + (uart_send_fp)(c); + *buff = c; + buff++; + cnt += 1; + maxlen -= 1; + } + + *buff = 0; + + return cnt; +} + +void uart_sendn(const char *str, int n) +{ + while (n--) { + (uart_send_fp)(*str++); + } +} + +static void uart_send_string(sendfp _send_fp, const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + (_send_fp)(str[i]); + } +} + +// Ref: https://elixir.bootlin.com/linux/v3.5/source/arch/x86/boot/printf.c#L43 +/* + * @num: output number + * @base: 10 or 16 + */ +static void uart_send_num(sendfp _send_fp, int64 num, int base, int type) +{ + static const char digits[16] = "0123456789ABCDEF"; + char tmp[66]; + int i; + + if (type & SIGN) { + if (num < 0) { + (_send_fp)('-'); + } + } + + i = 0; + + if (num == 0) { + tmp[i++] = '0'; + } else { + while (num != 0) { + uint8 r = (uint64)num % base; + num = (uint64)num / base; + tmp[i++] = digits[r]; + } + } + + while (--i >= 0) { + (_send_fp)(tmp[i]); + } +} + +// Ref: https://elixir.bootlin.com/linux/v3.5/source/arch/x86/boot/printf.c#L115 +static void _uart_printf(sendfp _send_fp, const char *fmt, va_list args) +{ + const char *s; + char c; + uint64 num; + char width; + + for (; *fmt; ++fmt) { + if (*fmt != '%') { + (_send_fp)(*fmt); + continue; + } + + ++fmt; + + // Get width + width = 0; + if (fmt[0] == 'l' && fmt[1] == 'l') { + width = 1; + fmt += 2; + } + + switch (*fmt) { + case 'c': + c = va_arg(args, uint32) & 0xff; + (_send_fp)(c); + continue; + case 'd': + if (width) { + num = va_arg(args, int64); + } else { + num = va_arg(args, int32); + } + uart_send_num(_send_fp, num, 10, SIGN); + continue; + case 's': + s = va_arg(args, char *); + uart_send_string(_send_fp, s); + continue; + case 'x': + if (width) { + num = va_arg(args, uint64); + } else { + num = va_arg(args, uint32); + } + uart_send_num(_send_fp, num, 16, 0); + continue; + } + } +} + +void uart_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + _uart_printf(uart_send_fp, fmt, args); + + va_end(args); +} + +void uart_sync_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + _uart_printf(uart_sync_send, fmt, args); + + va_end(args); +} + +void uart_sync_vprintf(const char *fmt, va_list args) +{ + _uart_printf(uart_sync_send, fmt, args); +} + +void uart_init(void) +{ + unsigned int selector; + + selector = get32(PA2VA(GPFSEL1)); + selector &= ~(7 << 12); // Clean gpio14 + selector |= 2 << 12; // Set alt5 for gpio14 + selector &= ~(7 << 15); // Clean gpio15 + selector |= 2 << 15; // Set alt5 for gpio15 + put32(PA2VA(GPFSEL1), selector); + + put32(PA2VA(GPPUD), 0); + delay(150); + put32(PA2VA(GPPUDCLK0), (1 << 14) | (1 << 15)); + delay(150); + put32(PA2VA(GPPUDCLK0), 0); + + put32(PA2VA(AUX_ENABLES), 1); // Enable mini uart (this also enables access to its registers) + put32(PA2VA(AUX_MU_CNTL_REG), 0); // Disable auto flow control and disable receiver and transmitter (for now) + put32(PA2VA(AUX_MU_IER_REG), 0); // Disable receive and transmit interrupts + put32(PA2VA(AUX_MU_LCR_REG), 3); // Enable 8 bit mode + put32(PA2VA(AUX_MU_MCR_REG), 0); // Set RTS line to be always high + put32(PA2VA(AUX_MU_BAUD_REG), 270); // Set baud rate to 115200 + put32(PA2VA(AUX_MU_IIR_REG), 6); // Clear the Rx/Tx FIFO + put32(PA2VA(AUX_MU_CNTL_REG), 3); // Finally, enable transmitter and receiver + + // UART start from synchronous mode + uart_sync_mode = 0; + uart_recv_fp = uart_sync_recv; + uart_send_fp = uart_sync_send; +} + +int uart_irq_check(void) +{ + uint32 iir = get32(PA2VA(AUX_MU_IIR_REG)); + + if (iir & 0x01) { + // No interrupt + return 0; + } + + // Disable RW interrupt + put32(PA2VA(AUX_MU_IER_REG), 0); + if (irq_run_task(uart_irq_handler, NULL, uart_irq_fini, 1)) { + put32(PA2VA(AUX_MU_IER_REG), 0x03); + } + + return 1; +} + +static void uart_irq_handler(void *_) +{ + uint32 iir = get32(PA2VA(AUX_MU_IIR_REG)); + + if (iir & 0x02) { + // Transmit holding register empty + if (w_head != w_tail) { + put32(PA2VA(AUX_MU_IO_REG), w_ringbuf[w_head]); + w_head = (w_head + 1) % BUFSIZE; + } + } else if (iir & 0x04) { + // Receiver holds valid byte + if (r_head != (r_tail + 1) % BUFSIZE) { + r_ringbuf[r_tail] = get32(PA2VA(AUX_MU_IO_REG)) & 0xFF; + r_tail = (r_tail + 1) % BUFSIZE; + } + } +} + +static void uart_irq_fini(void) +{ + uint32 ier = get32(PA2VA(AUX_MU_IER_REG)); + ier = ier & ~(0x03); + + // Set RW interrupt + if (r_head != (r_tail + 1) % BUFSIZE) { + ier = ier | 0x01; + } + + if (w_head != w_tail) { + ier = ier | 0x02; + } + + put32(PA2VA(AUX_MU_IER_REG), ier); +} + +int uart_switch_mode(void) +{ + uart_sync_mode = !uart_sync_mode; + uint32 ier = get32(PA2VA(AUX_MU_IER_REG)); + ier = ier & ~(0x03); + + if (uart_sync_mode == 0) { + // Synchronous mode + uart_recv_fp = uart_sync_recv; + uart_send_fp = uart_sync_send; + + // Disable RW interrupt + put32(PA2VA(AUX_MU_IER_REG), ier); + } else { + // Asynchronous mode + uart_recv_fp = uart_asyn_recv; + uart_send_fp = uart_asyn_send; + + // Clear the Rx/Tx FIFO + put32(PA2VA(AUX_MU_IIR_REG), 6); + + // Enable R interrupt + ier = ier | 0x01; + put32(PA2VA(AUX_MU_IER_REG), ier); + } + + return uart_sync_mode; +} \ No newline at end of file diff --git a/lab8/src/kernel/mm/early_alloc.c b/lab8/src/kernel/mm/early_alloc.c new file mode 100644 index 000000000..8494a9d1d --- /dev/null +++ b/lab8/src/kernel/mm/early_alloc.c @@ -0,0 +1,26 @@ +#include +#include +#include + +static char *cur = EARLY_MEM_BASE; + +void *early_malloc(size_t size) +{ + char *tmp; + + size = ALIGN(size, 4); + + if ((uint64)cur + size > (uint64)EARLY_MEM_END) { + uart_printf("[!] No enough space!\r\n"); + return NULL; + } + + tmp = cur; + cur += size; + +#ifdef MM_DEBUG + uart_printf("[*] Early allocate: %llx ~ %llx\r\n", tmp, cur - 1); +#endif + + return tmp; +} \ No newline at end of file diff --git a/lab8/src/kernel/mm/mm.c b/lab8/src/kernel/mm/mm.c new file mode 100644 index 000000000..62002b75c --- /dev/null +++ b/lab8/src/kernel/mm/mm.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include +#include +#include +#include + +/* From linker.ld */ +extern char _stack_top; + +static uint64 memory_end; +static uint32 memory_node; + +// Load 64-bit number (big-endian) +static uint64 ld64(char *start) +{ + uint64 ret = 0; + uint32 i = 8; + + while (i--) { + ret <<= 8; + ret += (uint8)(*start++); + } + + return ret; +} + +static int memory_fdt_parser(int level, char *cur, char *dt_strings) +{ + struct fdt_node_header *nodehdr = (struct fdt_node_header *)cur; + struct fdt_property *prop; + + uint32 tag = fdtn_tag(nodehdr); + + switch (tag) { + case FDT_PROP: + if (!memory_node) { + break; + } + prop = (struct fdt_property *)nodehdr; + if (!strcmp("reg", dt_strings + fdtp_nameoff(prop))) { + memory_end = ld64(prop->data); + return 1; + } + break; + case FDT_BEGIN_NODE: + if (!strcmp("memory@0", nodehdr->name)) { + memory_node = 1; + } + break; + case FDT_END_NODE: + memory_node = 0; + break; + case FDT_NOP: + case FDT_END: + break; + } + + return 0; +} + +void mm_init(void) +{ + parse_dtb(fdt_base, memory_fdt_parser); + + page_allocator_early_init((void *)PA2VA(0), (void *)PA2VA(memory_end)); + sc_early_init(); + + // Spin tables for multicore boot & Booting page tables + mem_reserve((void *)PA2VA(0), (void *)PA2VA(0x4000)); + + // Kernel image in the physical memory + mem_reserve(_start, &_stack_top); + + // Initramfs + mem_reserve(initramfs_base, initramfs_end); + + // TODO: Devicetree + + // early_malloc + mem_reserve(EARLY_MEM_BASE, EARLY_MEM_END); + + /* + * page_allocator_init() might output some debug information via mini-uart. + * uart_init() needs to be called before calling page_allocator_init(). + */ + page_allocator_init(); + sc_init(); + +#ifdef MM_DEBUG + page_allocator_test(); + sc_test(); +#endif +} + +void *kmalloc(int size) +{ + uint32 daif; + void *ret; + + daif = save_and_disable_interrupt(); + + if (size <= PAGE_SIZE) { + // Use the Small Chunk allocator + ret = sc_alloc(size); + } else { + // Use the Buddy System allocator + int page_cnt = ALIGN(size, PAGE_SIZE) / PAGE_SIZE; + + ret = alloc_pages(page_cnt); + } + + restore_interrupt(daif); + + return ret; +} + +void kfree(void *ptr) +{ + uint32 daif; + + daif = save_and_disable_interrupt(); + + if (!sc_free(ptr)) { + /* + * The chunk pointed to by ptr is managed by the Small Chunk + * allocator. + */ + goto _KFREE_END; + } + + free_page(ptr); + +_KFREE_END: + + restore_interrupt(daif); +} \ No newline at end of file diff --git a/lab8/src/kernel/mm/page_alloc.c b/lab8/src/kernel/mm/page_alloc.c new file mode 100644 index 000000000..710c1444a --- /dev/null +++ b/lab8/src/kernel/mm/page_alloc.c @@ -0,0 +1,291 @@ +/* + * Implementation of Buddy System. + */ + +// TODO: Consider critical section + +#include +#include +#include +#include +#include +#include + +#define FREELIST_CNT 16 + +typedef struct { + uint8 exp:7; + uint8 allocated:1; +} frame_ent; + +typedef struct { + /* Linked to next free frame_hdr */ + struct list_head list; +} frame_hdr; + +uint64 buddy_base; +uint64 buddy_end; + +frame_ent *frame_ents; +uint32 frame_ents_size; + +struct list_head freelists[FREELIST_CNT]; + +/* + * Convert number of pages to the corresponding idx (or say exp) of freelists + * + * num -> size -> exp + * 0b1 -> 1 -> 0 + * 0b11 -> 4 -> 2 + * 0b110 -> 8 -> 3 + * 0b10000 -> 16 -> 4 + * 0b10001 -> 32 -> 5 + */ +static inline int num2exp(int num) +{ + return fls(num - 1); +} + +static inline int is_valid_page(void *page) +{ + if (buddy_base > (uint64)page || + (uint64)page >= buddy_end || + (uint64)page & (PAGE_SIZE - 1)) { + return 0; + } + + return 1; +} + +void page_allocator_early_init(void *start, void *end) +{ + buddy_base = (uint64)start; + buddy_end = (uint64)end; + + frame_ents_size = (buddy_end - buddy_base) / PAGE_SIZE; + + frame_ents = early_malloc(sizeof(frame_ent) * frame_ents_size); + + for (int i = 0; i < frame_ents_size; ++i) { + frame_ents[i].exp = 0; + frame_ents[i].allocated = 0; + } + +#ifdef MM_DEBUG + uart_sync_printf("[*] init buddy (%llx ~ %llx)\r\n", buddy_base, buddy_end); +#endif +} + +void mem_reserve(void *start, void *end) +{ + start = (void *)((uint64)start & ~(PAGE_SIZE - 1)); + end = (void *)ALIGN((uint64)end, PAGE_SIZE); + + for (; start < end; start = (void *)((uint64)start + PAGE_SIZE)) { + int idx = addr2idx(start); + + frame_ents[idx].allocated = 1; + +#ifdef MM_DEBUG + uart_sync_printf("[*] preserve page idx %d (%llx)\r\n", idx, start); +#endif + } +} + +void page_allocator_init(void) +{ + for (int i = 0; i < FREELIST_CNT; ++i) { + INIT_LIST_HEAD(&freelists[i]); + } + + // Merge buddys from bottom to top + for (int exp = 0, idx; exp + 1 < FREELIST_CNT; exp++) { + idx = 0; + + while (1) { + int buddy_idx; + + buddy_idx = idx ^ (1 << exp); + + if (buddy_idx >= frame_ents_size) { + break; + } + + if (!frame_ents[idx].allocated && + frame_ents[idx].exp == exp && + !frame_ents[buddy_idx].allocated && + frame_ents[buddy_idx].exp == exp) { + frame_ents[idx].exp = exp + 1; + } + + idx += (1 << (exp + 1)); + + if (idx >= frame_ents_size) { + break; + } + } + } + + // Update freelists + for (int idx = 0, exp; idx < frame_ents_size; idx += (1 << exp)) { + exp = frame_ents[idx].exp; + + if (!frame_ents[idx].allocated) { + frame_hdr *hdr; + + hdr = idx2addr(idx); + list_add_tail(&hdr->list, &freelists[exp]); + +#ifdef MM_DEBUG + uart_sync_printf("[*] page init, idx %d belong to exp %d\r\n", + idx, exp); +#endif + } + } +} + +void *alloc_pages(int num) +{ + frame_hdr *hdr; + int idx, topexp, exp; + +#ifdef MM_DEBUG + uart_sync_printf("[*] alloc_pages %d pages\r\n", num); +#endif + + if (!num) { + return NULL; + } + + exp = num2exp(num); + + if (exp >= FREELIST_CNT) { + return NULL; + } + + for (topexp = exp; topexp < FREELIST_CNT; topexp++) { + if (!list_empty(&freelists[topexp])) { + break; + } + } + + if (topexp == FREELIST_CNT) { + return NULL; + } + + // Allocate + hdr = list_first_entry(&freelists[topexp], frame_hdr, list); + idx = addr2idx(hdr); + + list_del(&hdr->list); + + // Expand + while (topexp != exp) { + frame_hdr *buddy_hdr; + int buddy_idx; + + topexp -= 1; + buddy_idx = idx ^ (1 << topexp); + + frame_ents[buddy_idx].exp = topexp; + frame_ents[buddy_idx].allocated = 0; + + buddy_hdr = idx2addr(buddy_idx); + list_add(&buddy_hdr->list, &freelists[topexp]); + +#ifdef MM_DEBUG + uart_sync_printf("[*] Expand to idx (%d, %d) to exp (%d)\r\n", + idx, buddy_idx, topexp); +#endif + } + + frame_ents[idx].exp = exp; + frame_ents[idx].allocated = 1; + +#ifdef MM_DEBUG + uart_sync_printf("[*] Allocate idx %d exp %d\r\n", + idx, exp); +#endif + + return (void *)hdr; +} + +void *alloc_page(void) +{ + return alloc_pages(1); +} + +static inline void _free_page(frame_hdr *page) +{ + int idx, buddy_idx, exp; + + idx = addr2idx(page); + exp = frame_ents[idx].exp; + + frame_ents[idx].allocated = 0; + list_add(&page->list, &freelists[exp]); + + buddy_idx = idx ^ (1 << exp); + + // Merge buddy + while (exp + 1 < FREELIST_CNT && + !frame_ents[buddy_idx].allocated && + frame_ents[buddy_idx].exp == exp) { +#ifdef MM_DEBUG + uart_sync_printf("[*] merge idx (%d, %d) to exp (%d)\r\n", + idx, buddy_idx, exp + 1); +#endif + + frame_hdr *hdr; + + exp += 1; + + hdr = idx2addr(idx); + list_del(&hdr->list); + + hdr = idx2addr(buddy_idx); + list_del(&hdr->list); + + idx = idx & buddy_idx; + hdr = idx2addr(idx); + + frame_ents[idx].exp = exp; + list_add(&hdr->list, &freelists[exp]); + + buddy_idx = idx ^ (1 << exp); + } +} + +void free_page(void *page) +{ + if (!is_valid_page(page)) { + return; + } + +#ifdef MM_DEBUG + uart_sync_printf("[*] free_page idx %d\r\n", addr2idx(page)); +#endif + + _free_page((frame_hdr *)page); +} + +#ifdef MM_DEBUG +void page_allocator_test(void) +{ + char *ptr1 = alloc_pages(2); + char *ptr2 = alloc_pages(2); + char *ptr3 = alloc_pages(2); + char *ptr4 = alloc_pages(2); + + free_page(ptr3); + + char *ptr5 = alloc_pages(1); // Split ptr3 + char *ptr6 = alloc_pages(1); + + free_page(ptr4); + free_page(ptr2); + free_page(ptr1); // Merge with ptr2 + free_page(ptr5); + free_page(ptr6); // Merge with ptr5, then merge with ptr4, then merge with ptr1 +} +#endif \ No newline at end of file diff --git a/lab8/src/kernel/mm/sc_alloc.c b/lab8/src/kernel/mm/sc_alloc.c new file mode 100644 index 000000000..d50526ed2 --- /dev/null +++ b/lab8/src/kernel/mm/sc_alloc.c @@ -0,0 +1,192 @@ +/* + * Implementation of Small Chunk allocator. + */ + +// TODO: Consider critical section + +#include +#include +#include +#include +#include +#include + +uint32 sc_sizes[] = { + 0x10, // Minimum size cannot be less than 0x10 (sizeof(sc_hdr)) + 0x20, + 0x30, + 0x40, + 0x60, + 0x80, + 0xc0, + 0x100, + 0x400, + 0x1000 // Maximum size cannot be larger than 0x1000 (PAGE_SIZE) +}; + +typedef struct { + uint8 size_idx:7; + uint8 splitted:1; +} sc_frame_ent; + +typedef struct { + /* Link to next free chunk */ + struct list_head list; +} sc_hdr; + +sc_frame_ent *sc_frame_ents; + +struct list_head sc_freelists[ARRAY_SIZE(sc_sizes)]; + +static uint8 find_size_idx(int size) +{ + if (size <= 0x10) return 0; + if (size <= 0x20) return 1; + if (size <= 0x30) return 2; + if (size <= 0x40) return 3; + if (size <= 0x60) return 4; + if (size <= 0x80) return 5; + if (size <= 0xc0) return 6; + if (size <= 0x100) return 7; + if (size <= 0x400) return 8; + if (size <= 0x1000) return 9; + /* Never reach */ + return -1; +} + +void sc_early_init(void) +{ + sc_frame_ents = early_malloc(sizeof(sc_frame_ent) * frame_ents_size); + + for (int i = 0; i < frame_ents_size; ++i) { + sc_frame_ents[i].splitted = 0; + } +} + +void sc_init(void) +{ + for (int i = 0; i < ARRAY_SIZE(sc_sizes); ++i) { + INIT_LIST_HEAD(&sc_freelists[i]); + } +} + +void *sc_alloc(int size) +{ + sc_hdr *hdr; + uint8 size_idx; + + size_idx = find_size_idx(size); + + if (list_empty(&sc_freelists[size_idx])) { + // Allocate a page and split it into small chunks + void *page; + int frame_idx; + + page = alloc_page(); + + if (!page) { + return NULL; + } + + frame_idx = addr2idx(page); + sc_frame_ents[frame_idx].size_idx = size_idx; + sc_frame_ents[frame_idx].splitted = 1; + + for (int i = 0; + i + sc_sizes[size_idx] <= PAGE_SIZE; + i += sc_sizes[size_idx]) { + hdr = (sc_hdr *)((char *)page + i); + list_add_tail(&hdr->list, &sc_freelists[size_idx]); + } + +#ifdef MM_DEBUG + uart_sync_printf("[sc] Create chunks (page: %d; size: %d)\r\n", + frame_idx, sc_sizes[size_idx]); +#endif + } + + hdr = list_first_entry(&sc_freelists[size_idx], sc_hdr, list); + list_del(&hdr->list); + +#ifdef MM_DEBUG + uart_sync_printf("[sc] Allocate chunks %llx (request: %d; chunksize: %d)\r\n", + hdr, + size, + sc_sizes[size_idx]); +#endif + + return hdr; +} + +int sc_free(void *sc) +{ + sc_hdr *hdr; + int frame_idx, size_idx; + + frame_idx = addr2idx(sc); + + if (!sc_frame_ents[frame_idx].splitted) { + /* This frame isn't managed by the Small Chunk allocator */ + return -1; + } + + size_idx = sc_frame_ents[frame_idx].size_idx; + + hdr = (sc_hdr *)sc; + list_add(&hdr->list, &sc_freelists[size_idx]); + +#ifdef MM_DEBUG + uart_sync_printf("[sc] Free chunks %llx(size: %d)\r\n", + sc, + sc_sizes[size_idx]); +#endif + + return 0; +} + +#ifdef MM_DEBUG +void sc_test(void) +{ + char *ptr1 = sc_alloc(0x18); // A; Allocate a page and create 0x20 chunks + char *ptr2 = sc_alloc(0x19); // B + char *ptr3 = sc_alloc(0x1a); // C + + sc_free(ptr1); // 0x20 freelist: A + sc_free(ptr3); // 0x20 freelist: C -> A + + char *ptr4 = sc_alloc(0x17); // C; 0x20 freelist: A + + sc_free(ptr2); // 0x20 freelist: B -> A + + char *ptr5 = sc_alloc(0x17); // B; 0x20 freelist: A + char *ptr6 = sc_alloc(0x17); // A; 0x20 freelist: + + sc_free(ptr4); + sc_free(ptr5); + sc_free(ptr6); + + ptr1 = sc_alloc(0x3f0); // A; Allocate a page and create 0x400 chunks + ptr2 = sc_alloc(0x3f0); // B + ptr3 = sc_alloc(0x3f0); // C + ptr4 = sc_alloc(0x3f0); // D + ptr5 = sc_alloc(0x3f0); // E; Allocate a page and create 0x400 chunks + + sc_free(ptr1); + sc_free(ptr2); + sc_free(ptr3); + sc_free(ptr5); + sc_free(ptr4); + + ptr1 = sc_alloc(0x3f0); // D + ptr2 = sc_alloc(0x3f0); // E + ptr3 = sc_alloc(0x3f0); // C + ptr4 = sc_alloc(0x3f0); // B + ptr5 = sc_alloc(0x3f0); // A + + sc_free(ptr1); + sc_free(ptr2); + sc_free(ptr3); + sc_free(ptr5); + sc_free(ptr4); +} +#endif \ No newline at end of file diff --git a/lab8/src/kernel/mmu.c b/lab8/src/kernel/mmu.c new file mode 100644 index 000000000..38727340e --- /dev/null +++ b/lab8/src/kernel/mmu.c @@ -0,0 +1,546 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16)) +#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30)) +#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB) + +#define MAIR_DEVICE_nGnRnE 0b00000000 +#define MAIR_NORMAL_NOCACHE 0b01000100 +#define MAIR_IDX_DEVICE_nGnRnE 0 +#define MAIR_IDX_NORMAL_NOCACHE 1 + +#define PD_TABLE 0b11 +#define PD_BLOCK 0b01 +#define PD_ACCESS (1 << 10) +#define PD_PXN ((uint64)1 << 53) +#define PD_NSTABLE ((uint64)1 << 63) +#define PD_UXNTABLE ((uint64)1 << 60) +#define PD_MAIR_DEVICE_IDX (MAIR_IDX_DEVICE_nGnRnE << 2) +#define PD_MAIR_NORMAL_IDX (MAIR_IDX_NORMAL_NOCACHE << 2) +// Block Entry +#define PD_BE PD_ACCESS | PD_BLOCK +// Level 3 Block Entry +#define PD_L3BE PD_ACCESS | PD_TABLE + +#define BOOT_PGD ((pd_t *)0x1000) +#define BOOT_PUD ((pd_t *)0x2000) +#define BOOT_PMD ((pd_t *)0x3000) + +static void segmentation_fault(void) +{ + uart_sync_printf("[Segmentation fault]: Kill Process\r\n"); + exit_user_prog(); + + // Never reach +} + +static vm_area_t *vma_create(void *va, uint64 size, uint64 flag, void *addr) +{ + vm_area_t *vma; + + vma = kmalloc(sizeof(vm_area_t)); + size = ALIGN(size, PAGE_SIZE); + + vma->va_begin = (uint64)va; + vma->va_end = (uint64)va + size; + vma->flag = flag; + + if (vma->flag & VMA_ANON) { + vma->kva = 0; + } else if (vma->flag & VMA_PA) { + vma->kva = PA2VA(addr); + } else if (vma->flag & VMA_KVA) { + vma->kva = (uint64)addr; + } else { + // Unexpected + panic("vma_create flag error"); + } + + return vma; +} + +static void clone_uva_region(uint64 uva_begin, uint64 uva_end, + pd_t *pt, uint64 flag) +{ + for (uint64 addr = uva_begin; addr < uva_end; addr += PAGE_SIZE) { + void *new_kva; + uint64 par; + + // try to get the PA of UVA + asm volatile ( + "at s1e0r, %0" + :: "r" (addr) + ); + + par = read_sysreg(PAR_EL1); + + if (PAR_FAILED(par)) { + // VA to PA conversion aborted + continue; + } + + // convert PA to KVA + par = PA2VA(PAR_PA(par)); + + // Allocate a page and copy content to this page + new_kva = kmalloc(PAGE_SIZE); + memncpy(new_kva, (void *)par, PAGE_SIZE); + + // map @new_kva into @pt + pt_map(pt, (void *)addr, PAGE_SIZE, (void *)VA2PA(new_kva), flag); + } +} + +static vm_area_t *vma_clone(vm_area_t *vma, pd_t *page_table) +{ + vm_area_t *new_vma; + + new_vma = kmalloc(sizeof(vm_area_t)); + + new_vma->va_begin = vma->va_begin; + new_vma->va_end = vma->va_end; + new_vma->flag = vma->flag; + + if (vma->flag & VMA_ANON) { + clone_uva_region(vma->va_begin, vma->va_end, page_table, vma->flag); + new_vma->kva = 0; + } else if (vma->flag & VMA_PA) { + new_vma->kva = vma->kva; + } else if (vma->flag & VMA_KVA) { + void *new_kva; + + new_kva = kmalloc(vma->va_end - vma->va_begin); + memncpy(new_kva, (void *)vma->kva, vma->va_end - vma->va_begin); + + new_vma->kva = (uint64)new_kva; + } else { + // Unexpected + panic("vma_clone flag error"); + } + + return new_vma; +} + +static void free_uva_region(uint64 uva_begin, uint64 uva_end) +{ + for (uint64 addr = uva_begin; addr < uva_end; addr += PAGE_SIZE) { + uint64 par; + + // try to get the PA of UVA + asm volatile ( + "at s1e0r, %0" + :: "r" (addr) + ); + + par = read_sysreg(PAR_EL1); + + if (PAR_FAILED(par)) { + // VA to PA conversion aborted + continue; + } + + // convert PA to KVA + par = PA2VA(PAR_PA(par)); + + // free KVA + kfree((void *)par); + } +} + +static void vma_free(vm_area_t *vma) +{ + if (vma->kva && vma->flag & VMA_KVA) { + kfree((void *)vma->kva); + } else if (vma->flag & VMA_ANON) { + free_uva_region(vma->va_begin, vma->va_end); + } else if (!(vma->flag & VMA_PA)){ + // Unexpected + panic("vma_free flag error"); + } + + kfree(vma); +} + +static vm_area_t *vma_find(vm_area_meta_t *vma_meta, uint64 addr) +{ + vm_area_t *vma; + + list_for_each_entry(vma, &vma_meta->vma, list) { + if (vma->va_begin <= addr && addr < vma->va_end) { + return vma; + } + } + + return NULL; +} + +void mmu_init(void) +{ + uint32 sctlr_el1; + + // Set Translation Control Register + write_sysreg(TCR_EL1, TCR_CONFIG_DEFAULT); + + // Set Memory Attribute Indirection Register + write_sysreg(MAIR_EL1, + (MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | + (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8))); + + // Set Identity Paging + // 0x00000000 ~ 0x3f000000: Normal + // 0x3f000000 ~ 0x40000000: Device + // 0x40000000 ~ 0x80000000: Device + BOOT_PGD[0] = (uint64)BOOT_PUD | PD_NSTABLE | PD_UXNTABLE | PD_TABLE; + + BOOT_PUD[0] = (uint64)BOOT_PMD | PD_TABLE; + BOOT_PUD[1] = 0x40000000 | PD_MAIR_DEVICE_IDX | PD_BE; + + for (int i = 0; i < 504; ++i) { + BOOT_PMD[i] = (i * (1 << 21)) | PD_MAIR_NORMAL_IDX | PD_BE; + } + + for (int i = 504; i < 512; ++i) { + BOOT_PMD[i] = (i * (1 << 21)) | PD_MAIR_DEVICE_IDX | PD_BE; + } + + write_sysreg(TTBR0_EL1, BOOT_PGD); + write_sysreg(TTBR1_EL1, BOOT_PGD); + + // Enable MMU + sctlr_el1 = read_sysreg(SCTLR_EL1); + write_sysreg(SCTLR_EL1, sctlr_el1 | 1); +} + +pd_t *pt_create(void) +{ + pd_t *pt = kmalloc(PAGE_TABLE_SIZE); + + for (int i = 0; i < PAGE_TABLE_SIZE / sizeof(pt[0]); ++i) { + pt[i] = 0; + } + + return pt; +} + +void pt_free(pd_t *pt) +{ + // TODO +} + +static void _pt_map(pd_t *pt, void *va, void *pa, uint64 flag) +{ + pd_t pd; + int idx; + + // 47 ~ 39, 38 ~ 30, 29 ~ 21, 20 ~ 12 + for (int layer = 3; layer > 0; --layer) { + idx = ((uint64)va >> (12 + 9 * layer)) & 0b111111111; + pd = pt[idx]; + + if (!(pd & 1)) { + // Invalid entry + pd_t *tmp = pt_create(); + pt[idx] = VA2PA(tmp) | PD_TABLE; + pt = tmp; + continue; + } + + // Must be a table entry + pt = (pd_t *)PA2VA(pd & ~((uint64)0xfff)); + } + + idx = ((uint64)va >> 12) & 0b111111111; + pd = pt[idx]; + + if (!(pd & 1)) { + // Invalid entry + // Access permissions + uint64 ap; + uint64 uxn; + + if (flag & PT_R) { + if (flag & PT_W) { + ap = 0b01; + } else { + ap = 0b11; + } + } else { + ap = 0b00; + } + + if (flag & PT_X) { + uxn = 0; + } else { + uxn = 1; + } + + pt[idx] = (uint64)pa | (uxn << 54) | PD_PXN | + PD_MAIR_NORMAL_IDX | (ap << 6) | PD_L3BE; + } + + // TODO: Already mapping, do nothing? +} + +void pt_map(pd_t *pt, void *va, uint64 size, void *pa, uint64 flag) +{ + if ((uint64)va & (PAGE_SIZE - 1)) { + return; + } + + if ((uint64)pa & (PAGE_SIZE - 1)) { + return; + } + + size = ALIGN(size, PAGE_SIZE); + + for (uint64 i = 0; i < size; i += PAGE_SIZE) { + _pt_map(pt, (void *)((uint64)va + i), (void *)((uint64)pa + i), flag); + } +} + +vm_area_meta_t *vma_meta_create(void) +{ + vm_area_meta_t *vma_meta; + + vma_meta = kmalloc(sizeof(vm_area_meta_t)); + INIT_LIST_HEAD(&vma_meta->vma); + + return vma_meta; +} + +void vma_meta_free(vm_area_meta_t *vma_meta, pd_t *page_table) +{ + uint64 old_page_table; + vm_area_t *vma, *safe; + + old_page_table = get_page_table(); + set_page_table(page_table); + + preempt_disable(); + + list_for_each_entry_safe(vma, safe, &vma_meta->vma, list) { + vma_free(vma); + } + + preempt_enable(); + + kfree(vma_meta); + + set_page_table(old_page_table); +} + +void vma_meta_copy(vm_area_meta_t *to, vm_area_meta_t *from, pd_t *page_table) +{ + uint64 old_page_table; + vm_area_t *vma, *new_vma; + + old_page_table = get_page_table(); + set_page_table(page_table); + + preempt_disable(); + + list_for_each_entry(vma, &from->vma, list) { + new_vma = vma_clone(vma, (pd_t *)old_page_table); + + list_add_tail(&new_vma->list, &to->vma); + } + + preempt_enable(); + + set_page_table(old_page_table); +} + +void vma_map(vm_area_meta_t *vma_meta, void *va, uint64 size, + uint64 flag, void *addr) +{ + vm_area_t *vma; + int cnt = 0; + + if (flag & VMA_PA) cnt++; + if (flag & VMA_KVA) cnt++; + if (flag & VMA_ANON) cnt++; + + if (cnt != 1) { + return; + } + + if ((uint64)va & (PAGE_SIZE - 1)) { + return; + } + + vma = vma_find(vma_meta, (uint64)va); + if (vma) { + return; + } + + vma = vma_find(vma_meta, (uint64)va + size - 1); + if (vma) { + return; + } + + vma = vma_create(va, size, flag, addr); + + list_add_tail(&vma->list, &vma_meta->vma); +} + +static void do_page_fault(esr_el1_t *esr) +{ + uint64 far; + uint64 va; + uint64 fault_perm; + vm_area_t *vma; + + far = read_sysreg(FAR_EL1); + + vma = vma_find(current->address_space, far); + + if (!vma) { + segmentation_fault(); + // Never reach + } + + // Check permission + if (esr->ec == EC_IA_LE) { + // Execute abort + fault_perm = VMA_X; + } else if (ISS_WnR(esr)) { + // Write abort + fault_perm = VMA_W; + } else { + // Read abort + fault_perm = VMA_R; + } + + if (!(vma->flag & fault_perm)) { + goto PAGE_FAULT_INVALID; + } + + va = far & ~(PAGE_SIZE - 1); + + if (vma->kva) { + uint64 offset; + + offset = va - vma->va_begin; + + pt_map(current->page_table, (void *)va, PAGE_SIZE, + (void *)VA2PA(vma->kva + offset), vma->flag); + } else if (vma->flag & VMA_ANON) { + void *kva = kmalloc(PAGE_SIZE); + + memzero(kva, PAGE_SIZE); + + pt_map(current->page_table, (void *)va, PAGE_SIZE, + (void *)VA2PA(kva), vma->flag); + } else { + // Unexpected result + goto PAGE_FAULT_INVALID; + } + + return; + +PAGE_FAULT_INVALID: + segmentation_fault(); + + // Never reach +} + +void mem_abort(esr_el1_t *esr) +{ + int fsc; +#ifdef DEMANDING_PAGE_DEBUG + uint64 addr; + + addr = read_sysreg(FAR_EL1); +#endif + + fsc = ISS_FSC(esr); + + switch (fsc) { + case FSC_TF_L0: + case FSC_TF_L1: + case FSC_TF_L2: + case FSC_TF_L3: +#ifdef DEMANDING_PAGE_DEBUG + uart_sync_printf("[Translation fault]: 0x%llx\r\n", addr); +#endif + do_page_fault(esr); + break; + default: + segmentation_fault(); + + // Never reach + } +} + +void syscall_mmap(trapframe *frame, void *addr, size_t len, int prot, + int flags, int fd, int file_offset) +{ + vm_area_t *vma; + int mapflag; + + // do some initial work + len = ALIGN(len, PAGE_SIZE); + + if (addr == NULL) { + addr = (void *)0x550000000000; + } + + while (1) { + if ((uint64)addr > 0x0000ffffffffffff) { + frame->x0 = 0; + return; + } + + vma = vma_find(current->address_space, (uint64)addr); + if (vma) { + addr = (void *)((uint64)addr + 0x10000000); + continue; + } + + vma = vma_find(current->address_space, (uint64)addr + len - 1); + if (vma) { + addr = (void *)((uint64)addr + 0x10000000); + continue; + } + + break; + } + + mapflag = 0; + + if (prot & PROT_READ) mapflag |= VMA_R; + if (prot & PROT_WRITE) mapflag |= VMA_W; + if (prot & PROT_EXEC) mapflag |= VMA_X; + + if (flags & MAP_POPULATE) { + void *kva; + + mapflag |= VMA_KVA; + + kva = kmalloc(len); + memzero(kva, len); + + vma_map(current->address_space, addr, len, mapflag, kva); + + pt_map(current->page_table, addr, len, (void *)VA2PA(kva), mapflag); + } else if (flags & MAP_ANONYMOUS) { + mapflag |= VMA_ANON; + + vma_map(current->address_space, addr, len, mapflag, NULL); + } else { + // Unexpected. + frame->x0 = 0; + return; + } + + frame->x0 = (uint64)addr; +} \ No newline at end of file diff --git a/lab8/src/kernel/mode_switch.c b/lab8/src/kernel/mode_switch.c new file mode 100644 index 000000000..eb516daa4 --- /dev/null +++ b/lab8/src/kernel/mode_switch.c @@ -0,0 +1,12 @@ +#include +#include +#include + +void exit_to_user_mode(trapframe regs) +{ + enable_interrupt(); + + handle_signal(®s); + + disable_interrupt(); +} \ No newline at end of file diff --git a/lab8/src/kernel/panic.c b/lab8/src/kernel/panic.c new file mode 100644 index 000000000..0c814cfb0 --- /dev/null +++ b/lab8/src/kernel/panic.c @@ -0,0 +1,20 @@ +#include +#include + +void panic(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + uart_sync_printf("\r\n[Kernel Panic] \r\n"); + + uart_sync_vprintf(fmt, args); + va_end(args); + + uart_sync_printf("\r\n"); + + // TODO: Show more information + + // Never return + while (1) {} +} \ No newline at end of file diff --git a/lab8/src/kernel/preempt.c b/lab8/src/kernel/preempt.c new file mode 100644 index 000000000..5132698f5 --- /dev/null +++ b/lab8/src/kernel/preempt.c @@ -0,0 +1,25 @@ +#include +#include +#include + +void preempt_disable(void) +{ + uint32 daif; + + daif = save_and_disable_interrupt(); + + current->preempt += 1; + + restore_interrupt(daif); +} + +void preempt_enable(void) +{ + uint32 daif; + + daif = save_and_disable_interrupt(); + + current->preempt -= 1; + + restore_interrupt(daif); +} \ No newline at end of file diff --git a/lab8/src/kernel/rpi3.c b/lab8/src/kernel/rpi3.c new file mode 100644 index 000000000..b9dbc0b4e --- /dev/null +++ b/lab8/src/kernel/rpi3.c @@ -0,0 +1,87 @@ +// Ref: +// https://github.com/bztsrc/raspi3-tutorial/blob/master/04_mailboxes/mbox.h +// https://github.com/raspberrypi/firmware/wiki/Mailboxes +// https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes +#include +#include +#include + +/* Mailbox registers */ +#define MAILBOX_BASE PA2VA(PERIPHERALS_BASE + 0xb880) +#define MAILBOX_READ MAILBOX_BASE +#define MAILBOX_STATUS MAILBOX_BASE + 0x18 +#define MAILBOX_WRITE MAILBOX_BASE + 0x20 + +/* Tags */ +#define GET_BOARD_REVISION 0x00010002 +#define GET_ARM_MEMORY 0x00010005 + +/* Others */ +#define MAILBOX_EMPTY 0x40000000 +#define MAILBOX_FULL 0x80000000 + +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 + +// Aligned buffer +static unsigned int __attribute__((aligned(0x10))) mailbox[16]; + +void mailbox_call(unsigned char channel, unsigned int *mb) +{ + // Write the data (shifted into the upper 28 bits) combined with + // the channel (in the lower four bits) to the write register. + unsigned int r = (((unsigned long)mb) & ~0xf) | channel; + + // Check if Mailbox 0 status register’s full flag is set. + while ((get32(MAILBOX_STATUS) & MAILBOX_FULL)) {}; + + // If not, then you can write to Mailbox 1 Read/Write register. + put32(MAILBOX_WRITE, r); + + while (1) { + // Check if Mailbox 0 status register’s empty flag is set. + while ((get32(MAILBOX_STATUS) & MAILBOX_EMPTY)) {}; + + // If not, then you can read from Mailbox 0 Read/Write register. + // Check if the value is the same as you wrote in step 1. + if (r == get32(MAILBOX_READ)) + return; + } +} + +// It should be 0xa020d3 for rpi3 b+ +unsigned int get_board_revision(void) +{ + mailbox[0] = 7 * 4; // Buffer size in bytes + mailbox[1] = MBOX_REQUEST_CODE; + // Tags begin + mailbox[2] = GET_BOARD_REVISION; // Tag identifier + mailbox[3] = 4; // Value buffer size in bytes + mailbox[4] = MBOX_TAG_REQUEST; // Request/response codes + mailbox[5] = 0; // Optional value buffer + // Tags end + mailbox[6] = MBOX_END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // Message passing procedure call + + return mailbox[5]; +} + +void get_arm_memory(struct arm_memory_info *info) +{ + mailbox[0] = 8 * 4; // Buffer size in bytes + mailbox[1] = MBOX_REQUEST_CODE; + // Tags begin + mailbox[2] = GET_ARM_MEMORY; // Tag identifier + mailbox[3] = 8; // Value buffer size in bytes + mailbox[4] = MBOX_TAG_REQUEST; // Request/response codes + mailbox[5] = 0; // Optional value buffer + mailbox[6] = 0; // Optional value buffer + // Tags end + mailbox[7] = MBOX_END_TAG; + + mailbox_call(MAILBOX_CH_PROP, mailbox); // Message passing procedure call + + info->baseaddr = mailbox[5]; + info->size = mailbox[6]; +} diff --git a/lab8/src/kernel/sched.S b/lab8/src/kernel/sched.S new file mode 100644 index 000000000..c099ab1ca --- /dev/null +++ b/lab8/src/kernel/sched.S @@ -0,0 +1,33 @@ +.globl switch_to +switch_to: + stp x19, x20, [x0, 16 * 0] + stp x21, x22, [x0, 16 * 1] + stp x23, x24, [x0, 16 * 2] + stp x25, x26, [x0, 16 * 3] + stp x27, x28, [x0, 16 * 4] + stp fp, lr, [x0, 16 * 5] + mov x9, sp + str x9, [x0, 16 * 6] + + ldp x19, x20, [x1, 16 * 0] + ldp x21, x22, [x1, 16 * 1] + ldp x23, x24, [x1, 16 * 2] + ldp x25, x26, [x1, 16 * 3] + ldp x27, x28, [x1, 16 * 4] + ldp fp, lr, [x1, 16 * 5] + ldr x9, [x1, 16 * 6] + mov sp, x9 + + // set_current + msr tpidr_el1, x1 + + // Switch page table 0 + ldr x9, [x1, 8 * 13] + and x9, x9, #0x0000ffffffffffff + dsb ish // ensure write has completed + msr ttbr0_el1, x9 // switch translation based address. + tlbi vmalle1is // invalidate all TLB entries + dsb ish // ensure completion of TLB invalidatation + isb // clear pipeline + + ret diff --git a/lab8/src/kernel/sched.c b/lab8/src/kernel/sched.c new file mode 100644 index 000000000..bf3817374 --- /dev/null +++ b/lab8/src/kernel/sched.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +#include + +#define SCHEDULER_TIMER_HZ 32 +#define SCHEDULER_WATERMARK 1 + +static struct list_head run_queue; + +static uint32 schedule_ticks; + +static void timer_schdule_tick(void *_) +{ + schedule_tick(); + + timer_add_proc_freq(timer_schdule_tick, NULL, SCHEDULER_TIMER_HZ); +} + +void scheduler_init(void) +{ + INIT_LIST_HEAD(&run_queue); + + timer_add_proc_freq(timer_schdule_tick, NULL, SCHEDULER_TIMER_HZ); +} + +void schedule(void) +{ + uint64 daif; + task_struct *task; + + daif = save_and_disable_interrupt(); + + task = list_first_entry(&run_queue, task_struct, list); + + list_del(&task->list); + list_add_tail(&task->list, &run_queue); + + current->need_resched = 0; + + restore_interrupt(daif); + + // Set registers. Set current to task + switch_to(current, task); +} + +void schedule_tick(void) +{ + schedule_ticks += 1; + + if (schedule_ticks >= SCHEDULER_WATERMARK) { + schedule_ticks = 0; + + current->need_resched = 1; + } +} + +void sched_add_task(task_struct *task) +{ + preempt_disable(); + + task->status = TASK_RUNNING; + + list_add_tail(&task->list, &run_queue); + + preempt_enable(); +} + +void sched_del_task(task_struct *task) +{ + preempt_disable(); + + list_del(&task->list); + + preempt_enable(); +} \ No newline at end of file diff --git a/lab8/src/kernel/sdhost.c b/lab8/src/kernel/sdhost.c new file mode 100644 index 000000000..4daa5797d --- /dev/null +++ b/lab8/src/kernel/sdhost.c @@ -0,0 +1,234 @@ +#include +#include +#include + +// SD card command +#define GO_IDLE_STATE 0 +#define SEND_OP_CMD 1 +#define ALL_SEND_CID 2 +#define SEND_RELATIVE_ADDR 3 +#define SELECT_CARD 7 +#define SEND_IF_COND 8 +#define VOLTAGE_CHECK_PATTERN 0x1aa +#define STOP_TRANSMISSION 12 +#define SET_BLOCKLEN 16 +#define READ_SINGLE_BLOCK 17 +#define WRITE_SINGLE_BLOCK 24 +#define SD_APP_OP_COND 41 +#define SDCARD_3_3V (1 << 21) +#define SDCARD_ISHCS (1 << 30) +#define SDCARD_READY (1 << 31) +#define APP_CMD 55 + +// sdhost +#define SDHOST_BASE PA2VA(PERIPHERALS_BASE + 0x202000) +#define SDHOST_CMD (SDHOST_BASE + 0) +#define SDHOST_READ 0x40 +#define SDHOST_WRITE 0x80 +#define SDHOST_LONG_RESPONSE 0x200 +#define SDHOST_NO_REPONSE 0x400 +#define SDHOST_BUSY 0x800 +#define SDHOST_NEW_CMD 0x8000 +#define SDHOST_ARG (SDHOST_BASE + 0x4) +#define SDHOST_TOUT (SDHOST_BASE + 0x8) +#define SDHOST_TOUT_DEFAULT 0xf00000 +#define SDHOST_CDIV (SDHOST_BASE + 0xc) +#define SDHOST_CDIV_MAXDIV 0x7ff +#define SDHOST_CDIV_DEFAULT 0x148 +#define SDHOST_RESP0 (SDHOST_BASE + 0x10) +#define SDHOST_RESP1 (SDHOST_BASE + 0x14) +#define SDHOST_RESP2 (SDHOST_BASE + 0x18) +#define SDHOST_RESP3 (SDHOST_BASE + 0x1c) +#define SDHOST_HSTS (SDHOST_BASE + 0x20) +#define SDHOST_HSTS_MASK (0x7f8) +#define SDHOST_HSTS_ERR_MASK (0xf8) +#define SDHOST_HSTS_DATA (1 << 0) +#define SDHOST_PWR (SDHOST_BASE + 0x30) +#define SDHOST_DBG (SDHOST_BASE + 0x34) +#define SDHOST_DBG_FSM_DATA 1 +#define SDHOST_DBG_FSM_MASK 0xf +#define SDHOST_DBG_MASK (0x1f << 14 | 0x1f << 9) +#define SDHOST_DBG_FIFO (0x4 << 14 | 0x4 << 9) +#define SDHOST_CFG (SDHOST_BASE + 0x38) +#define SDHOST_CFG_DATA_EN (1 << 4) +#define SDHOST_CFG_SLOW (1 << 3) +#define SDHOST_CFG_INTBUS (1 << 1) +#define SDHOST_SIZE (SDHOST_BASE + 0x3c) +#define SDHOST_DATA (SDHOST_BASE + 0x40) +#define SDHOST_CNT (SDHOST_BASE + 0x50) + +static int is_hcs; // high capcacity(SDHC) + +static void pin_setup(void) +{ + put32(PA2VA(GPFSEL4), 0x24000000); + put32(PA2VA(GPFSEL5), 0x924); + put32(PA2VA(GPPUD), 0); + delay(15000); + put32(PA2VA(GPPUDCLK1), 0xffffffff); + delay(15000); + put32(PA2VA(GPPUDCLK1), 0); +} + +static void sdhost_setup(void) +{ + unsigned int tmp; + put32(SDHOST_PWR, 0); + put32(SDHOST_CMD, 0); + put32(SDHOST_ARG, 0); + put32(SDHOST_TOUT, SDHOST_TOUT_DEFAULT); + put32(SDHOST_CDIV, 0); + put32(SDHOST_HSTS, SDHOST_HSTS_MASK); + put32(SDHOST_CFG, 0); + put32(SDHOST_CNT, 0); + put32(SDHOST_SIZE, 0); + tmp = get32(SDHOST_DBG); + tmp &= ~SDHOST_DBG_MASK; + tmp |= SDHOST_DBG_FIFO; + put32(SDHOST_DBG, tmp); + delay(250000); + put32(SDHOST_PWR, 1); + delay(250000); + put32(SDHOST_CFG, SDHOST_CFG_SLOW | SDHOST_CFG_INTBUS | SDHOST_CFG_DATA_EN); + put32(SDHOST_CDIV, SDHOST_CDIV_DEFAULT); +} + +static int wait_sd(void) +{ + int cnt = 1000000; + unsigned int cmd; + do { + if (cnt == 0) { + return -1; + } + cmd = get32(SDHOST_CMD); + --cnt; + } while (cmd & SDHOST_NEW_CMD); + return 0; +} + +static int sd_cmd(unsigned cmd, unsigned int arg) +{ + put32(SDHOST_ARG, arg); + put32(SDHOST_CMD, cmd | SDHOST_NEW_CMD); + return wait_sd(); +} + +static int sdcard_setup(void) +{ + unsigned int tmp; + sd_cmd(GO_IDLE_STATE | SDHOST_NO_REPONSE, 0); + sd_cmd(SEND_IF_COND, VOLTAGE_CHECK_PATTERN); + tmp = get32(SDHOST_RESP0); + if (tmp != VOLTAGE_CHECK_PATTERN) { + return -1; + } + while (1) { + if (sd_cmd(APP_CMD, 0) == -1) { + // MMC card or invalid card status + // currently not support + continue; + } + sd_cmd(SD_APP_OP_COND, SDCARD_3_3V | SDCARD_ISHCS); + tmp = get32(SDHOST_RESP0); + if (tmp & SDCARD_READY) { + break; + } + delay(1000000); + } + + is_hcs = tmp & SDCARD_ISHCS; + sd_cmd(ALL_SEND_CID | SDHOST_LONG_RESPONSE, 0); + sd_cmd(SEND_RELATIVE_ADDR, 0); + tmp = get32(SDHOST_RESP0); + sd_cmd(SELECT_CARD, tmp); + sd_cmd(SET_BLOCKLEN, BLOCK_SIZE); + return 0; +} + +static int wait_fifo(void) +{ + int cnt = 1000000; + unsigned int hsts; + do { + if (cnt == 0) { + return -1; + } + hsts = get32(SDHOST_HSTS); + --cnt; + } while ((hsts & SDHOST_HSTS_DATA) == 0); + return 0; +} + +static void set_block(int size, int cnt) +{ + put32(SDHOST_SIZE, size); + put32(SDHOST_CNT, cnt); +} + +static void wait_finish(void) +{ + unsigned int dbg; + do { + dbg = get32(SDHOST_DBG); + } while ((dbg & SDHOST_DBG_FSM_MASK) != SDHOST_HSTS_DATA); +} + +void sd_readblock(int block_idx, void *buf) +{ + unsigned int *buf_u = (unsigned int *)buf; + int succ = 0; + if (!is_hcs) { + block_idx <<= 9; + } + do { + unsigned int hsts; + set_block(BLOCK_SIZE, 1); + sd_cmd(READ_SINGLE_BLOCK | SDHOST_READ, block_idx); + for (int i = 0; i < 128; ++i) { + wait_fifo(); + buf_u[i] = get32(SDHOST_DATA); + } + hsts = get32(SDHOST_HSTS); + if (hsts & SDHOST_HSTS_ERR_MASK) { + put32(SDHOST_HSTS, SDHOST_HSTS_ERR_MASK); + sd_cmd(STOP_TRANSMISSION | SDHOST_BUSY, 0); + } else { + succ = 1; + } + } while(!succ); + wait_finish(); +} + +void sd_writeblock(int block_idx, const void *buf) +{ + const unsigned int *buf_u = (const unsigned int *)buf; + int succ = 0; + if (!is_hcs) { + block_idx <<= 9; + } + do { + unsigned int hsts; + set_block(BLOCK_SIZE, 1); + sd_cmd(WRITE_SINGLE_BLOCK | SDHOST_WRITE, block_idx); + for (int i = 0; i < 128; ++i) { + wait_fifo(); + put32(SDHOST_DATA, buf_u[i]); + } + hsts = get32(SDHOST_HSTS); + if (hsts & SDHOST_HSTS_ERR_MASK) { + put32(SDHOST_HSTS, SDHOST_HSTS_ERR_MASK); + sd_cmd(STOP_TRANSMISSION | SDHOST_BUSY, 0); + } else { + succ = 1; + } + } while(!succ); + wait_finish(); +} + +void sd_init(void) +{ + pin_setup(); + sdhost_setup(); + sdcard_setup(); +} \ No newline at end of file diff --git a/lab8/src/kernel/signal.c b/lab8/src/kernel/signal.c new file mode 100644 index 000000000..ed9bab02b --- /dev/null +++ b/lab8/src/kernel/signal.c @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// TODO: implement SIGSTOP & SIGCONT kernel handler + +/* Kernel defined sighandler_t */ +#define SIG_DFL (sighandler_t)0 +#define SIG_IGN (sighandler_t)1 + +// SIG_DFL +static void sig_termiante(int); + +// SIG_IGN +static void sig_ignore(int); + +static void sig_termiante(int _) +{ + exit_user_prog(); + + // Never reach +} + +static void sig_ignore(int _) +{ + return; +} + +void sigreturn(void) SECTION_TUS; +void sigreturn(void) +{ + asm volatile( + "mov x8, " MC2STR(SCNUM_SIGRETURN) "\n" + "svc 0\n" + ); +} + +/* + * Try to get the pending signal of current task. + */ +static struct signal_t *signal_try_get(void) +{ + if (list_empty(¤t->signal->list)) { + return NULL; + } + + return list_first_entry(¤t->signal->list, struct signal_t, list); +} + +static void signal_add(uint32 signum, struct signal_head_t *head) +{ + struct signal_t *signal; + + signal = kmalloc(sizeof(struct signal_t)); + + signal->signum = signum; + + list_add(&signal->list, &head->list); +} + +static void signal_del(struct signal_t *signal) +{ + list_del(&signal->list); + kfree(signal); +} + +static void save_context(void *user_sp, trapframe *frame) +{ + memncpy(user_sp, (char *)frame, sizeof(trapframe)); +} + +struct signal_head_t *signal_head_create(void) +{ + struct signal_head_t *head; + + head = kmalloc(sizeof(struct signal_head_t)); + + INIT_LIST_HEAD(&head->list); + + return head; +} + +void signal_head_free(struct signal_head_t *head) +{ + struct signal_t *signal, *safe; + + list_for_each_entry_safe(signal, safe, &head->list, list) { + signal_del(signal); + } + + kfree(head); +} + +void signal_head_reset(struct signal_head_t *head) +{ + struct signal_t *signal, *safe; + + list_for_each_entry_safe(signal, safe, &head->list, list) { + signal_del(signal); + } +} + +void handle_signal(trapframe *frame) +{ + struct signal_t *signal; + struct sigaction_t *sigaction; + + preempt_disable(); + + signal = signal_try_get(); + + preempt_enable(); + + if (signal == NULL) { + return; + } + + sigaction = ¤t->sighand->sigactions[signal->signum]; + + if (sigaction->kernel_hand) { + sigaction->sighand(signal->signum); + } else { + char *user_sp; + uint32 reserve_size; + + // Reserve space on user stack + reserve_size = sizeof(trapframe); + user_sp = frame->sp_el0 - ALIGN(reserve_size, 0x10); + + // Save cpu context onto user stack + save_context(user_sp, frame); + + // Set user sp + frame->sp_el0 = user_sp; + + // Set parameter of handler + frame->x0 = signal->signum; + + // Set user pc to handler + frame->elr_el1 = sigaction->sighand; + + // Set user lr to sigreturn + frame->x30 = TUS2VA(sigreturn); + } + + signal_del(signal); +} + +struct sighand_t *sighand_create(void) +{ + struct sighand_t *sighand; + + sighand = kmalloc(sizeof(struct sighand_t)); + + for (int i = 1; i < NSIG; ++i) { + sighand->sigactions[i].kernel_hand = 1; + sighand->sigactions[i].sighand = sig_ignore; + } + + sighand->sigactions[SIGKILL].sighand = sig_termiante; + + return sighand; +} + +void sighand_free(struct sighand_t *sighand) +{ + kfree(sighand); +} + +void sighand_reset(struct sighand_t *sighand) +{ + for (int i = 1; i < NSIG; ++i) { + sighand->sigactions[i].kernel_hand = 1; + sighand->sigactions[i].sighand = sig_ignore; + } + + sighand->sigactions[SIGKILL].sighand = sig_termiante; +} + +static inline void _sighand_copy(struct sigaction_t *to, + struct sigaction_t *from) +{ + to->kernel_hand = from->kernel_hand; + to->sighand = from->sighand; +} + +/* Copy current signal handler to @sighand */ +void sighand_copy(struct sighand_t *sighand) +{ + struct sighand_t *currhand; + + currhand = current->sighand; + + for (int i = 1; i < NSIG; ++i) { + _sighand_copy(&sighand->sigactions[i], &currhand->sigactions[i]); + } +} + +void syscall_signal(trapframe *_, uint32 signal, void (*handler)(int)) +{ + struct sigaction_t *sigaction; + + // Check if signal is valid + if (signal >= NSIG) { + return; + } + + sigaction = ¤t->sighand->sigactions[signal]; + + if (handler == SIG_DFL) { + sigaction->kernel_hand = 1; + sigaction->sighand = sig_termiante; + } else if (handler == SIG_IGN) { + sigaction->kernel_hand = 1; + sigaction->sighand = sig_ignore; + } else { + sigaction->kernel_hand = 0; + sigaction->sighand = handler; + } +} + +void syscall_kill(trapframe *_, int pid, int signal) +{ + task_struct *task; + + preempt_disable(); + + task = task_get_by_tid(pid); + + if (!task || task->status != TASK_RUNNING) { + goto SYSCALL_KILL_END; + } + + signal_add((uint32)signal, task->signal); + +SYSCALL_KILL_END: + preempt_enable(); +} + +// restore context +void syscall_sigreturn(trapframe *frame) +{ + trapframe *user_sp; + + user_sp = frame->sp_el0; + + memncpy((char *)frame, (char *)user_sp, sizeof(trapframe)); +} \ No newline at end of file diff --git a/lab8/src/kernel/syscall.c b/lab8/src/kernel/syscall.c new file mode 100644 index 000000000..0699cf132 --- /dev/null +++ b/lab8/src/kernel/syscall.c @@ -0,0 +1,292 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KSTACK_VARIABLE(x) \ + (void *)((uint64)x - \ + (uint64)current->kernel_stack + \ + (uint64)child->kernel_stack) + +typedef void (*syscall_funcp)(); + +void syscall_getpid(trapframe *_); +void syscall_uart_read(trapframe *_, char buf[], size_t size); +void syscall_uart_write(trapframe *_, const char buf[], size_t size); +void syscall_exec(trapframe *_, const char *name, char *const argv[]); +void syscall_fork(trapframe *_); +void syscall_exit(trapframe *_); +void syscall_mbox_call(trapframe *_, unsigned char ch, unsigned int *mbox); +void syscall_kill_pid(trapframe *_, int pid); +void syscall_show_info(trapframe *_); + +syscall_funcp syscall_table[] = { + (syscall_funcp) syscall_getpid, // 0 + (syscall_funcp) syscall_uart_read, + (syscall_funcp) syscall_uart_write, + (syscall_funcp) syscall_exec, + (syscall_funcp) syscall_fork, // 4 + (syscall_funcp) syscall_exit, + (syscall_funcp) syscall_mbox_call, + (syscall_funcp) syscall_kill_pid, + (syscall_funcp) syscall_signal, // 8 + (syscall_funcp) syscall_kill, + (syscall_funcp) syscall_mmap, + (syscall_funcp) syscall_open, + (syscall_funcp) syscall_close, // 12 + (syscall_funcp) syscall_write, + (syscall_funcp) syscall_read, + (syscall_funcp) syscall_mkdir, + (syscall_funcp) syscall_mount, // 16 + (syscall_funcp) syscall_chdir, + (syscall_funcp) syscall_lseek64, + (syscall_funcp) syscall_ioctl, + (syscall_funcp) syscall_sync, // 20 + (syscall_funcp) syscall_sigreturn, + (syscall_funcp) syscall_show_info, +}; + +void syscall_handler(trapframe *regs) +{ + uint64 syscall_num; + + syscall_num = regs->x8; + + if (syscall_num > ARRAY_SIZE(syscall_table)) { + // Invalid syscall + return; + } + + enable_interrupt(); + + (syscall_table[syscall_num])(regs, + regs->x0, + regs->x1, + regs->x2, + regs->x3, + regs->x4, + regs->x5); + + disable_interrupt(); +} + +void syscall_getpid(trapframe *frame) +{ + frame->x0 = current->tid; +} + +void syscall_uart_read(trapframe *_, char buf[], size_t size) +{ + uart_recvn(buf, size); +} + +void syscall_uart_write(trapframe *_, const char buf[], size_t size) +{ + uart_sendn(buf, size); +} + +// TODO: Passing argv +void syscall_exec(trapframe *_, const char *name, char *const argv[]) +{ + void *data; + char *kernel_sp; + int datalen, adj_datalen; + struct file f; + int ret; + + ret = vfs_open(name, 0, &f); + + if (ret < 0) { + return; + } + + datalen = f.vnode->v_ops->getsize(f.vnode); + + if (datalen < 0) { + return; + } + + adj_datalen = ALIGN(datalen, PAGE_SIZE); + + data = kmalloc(adj_datalen); + + memzero(data, adj_datalen); + + ret = vfs_read(&f, data, datalen); + + if (ret < 0) { + kfree(data); + return; + } + + vfs_close(&f); + + // Use origin kernel stack + + // TODO: Clear user stack + + kernel_sp = (char *)current->kernel_stack + STACK_SIZE - 0x10; + + // Reset signal + signal_head_reset(current->signal); + sighand_reset(current->sighand); + + // Reset address_space & page table + task_reset_mm(current); + + task_init_map(current); + + // 0x000000000000 ~ : rwx: Code + vma_map(current->address_space, (void *)0, adj_datalen, + VMA_R | VMA_W | VMA_X | VMA_KVA, data); + + set_page_table(current->page_table); + + exec_user_prog((void *)0, (char *)0xffffffffeff0, kernel_sp); +} + +static inline void copy_regs(struct pt_regs *regs) +{ + regs->x19 = current->regs.x19; + regs->x20 = current->regs.x20; + regs->x21 = current->regs.x21; + regs->x22 = current->regs.x22; + regs->x23 = current->regs.x23; + regs->x24 = current->regs.x24; + regs->x25 = current->regs.x25; + regs->x26 = current->regs.x26; + regs->x27 = current->regs.x27; + regs->x28 = current->regs.x28; +} + +void syscall_fork(trapframe *frame) +{ + task_struct *child; + trapframe *child_frame; + + child = task_create(); + + child->kernel_stack = kmalloc(STACK_SIZE); + memncpy(child->kernel_stack, current->kernel_stack, STACK_SIZE); + + // TODO: Implement copy on write + + // Copy address_space + vma_meta_copy(child->address_space, + current->address_space, + current->page_table); + + // Copy signal handler + sighand_copy(child->sighand); + + // Save registers + SAVE_REGS(current); + + // Copy registers + copy_regs(&child->regs); + + // Copy stack related registers + child->regs.fp = KSTACK_VARIABLE(current->regs.fp); + child->regs.sp = KSTACK_VARIABLE(current->regs.sp); + + // https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html + child->regs.lr = &&SYSCALL_FORK_END; + + // Adjust child trapframe + child_frame = KSTACK_VARIABLE(frame); + + child_frame->x0 = 0; + + sched_add_task(child); + + // Set return value + frame->x0 = child->tid; + +SYSCALL_FORK_END: + + asm volatile("nop"); +} + +void syscall_exit(trapframe *_) +{ + exit_user_prog(); + + // Never reach +} + +/* + * TODO: map the return addres of mailbox_call + */ +void syscall_mbox_call(trapframe *_, unsigned char ch, unsigned int *mbox) +{ + int mbox_size; + char *kmbox; + + mbox_size = (int)mbox[0]; + + if (mbox_size <= 0) + return; + + kmbox = kmalloc(mbox_size); + + memncpy(kmbox, (char *)mbox, mbox_size); + + mailbox_call(ch, (unsigned int *)kmbox); + + memncpy((char *)mbox, kmbox, mbox_size); + + kfree(kmbox); +} + +void syscall_kill_pid(trapframe *_, int pid) +{ + task_struct *task; + + if (current->tid == pid) { + exit_user_prog(); + + // Never reach + return; + } + + preempt_disable(); + + task = task_get_by_tid(pid); + + if (!task || task->status != TASK_RUNNING) { + goto SYSCALL_KILL_PID_END; + } + + list_del(&task->list); + kthread_add_wait_queue(task); + +SYSCALL_KILL_PID_END: + preempt_enable(); +} + +// Print the content of spsr_el1, elr_el1 and esr_el1 +void syscall_show_info(trapframe *_) +{ + uint64 spsr_el1; + uint64 elr_el1; + uint64 esr_el1; + + spsr_el1 = read_sysreg(spsr_el1); + elr_el1 = read_sysreg(elr_el1); + esr_el1 = read_sysreg(esr_el1); + + uart_printf("[TEST] spsr_el1: %llx; elr_el1: %llx; esr_el1: %llx\r\n", + spsr_el1, elr_el1, esr_el1); +} \ No newline at end of file diff --git a/lab8/src/kernel/task.c b/lab8/src/kernel/task.c new file mode 100644 index 000000000..95fdfec40 --- /dev/null +++ b/lab8/src/kernel/task.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include + +// TODO: Use rbtree to manage tasks +static struct list_head task_queue; + +// TODO: recycle usable tid +uint32 max_tid; + +static uint32 alloc_tid(void) +{ + uint32 tid; + + tid = max_tid; + max_tid += 1; + + return tid; +} + +void task_init(void) +{ + INIT_LIST_HEAD(&task_queue); +} + +task_struct *task_create(void) +{ + task_struct *task; + struct signal_head_t *signal; + struct sighand_t *sighand; + pd_t *page_table; + vm_area_meta_t *as; + + task = kmalloc(sizeof(task_struct)); + signal = signal_head_create(); + sighand = sighand_create(); + page_table = pt_create(); + as = vma_meta_create(); + + task->address_space = as; + task->kernel_stack = NULL; + task->page_table = page_table; + INIT_LIST_HEAD(&task->list); + list_add_tail(&task->task_list, &task_queue); + task->status = TASK_NEW; + task->need_resched = 0; + task->tid = alloc_tid(); + task->preempt = 0; + + task->signal = signal; + task->sighand = sighand; + + task->work_dir = rootmount->root; + + vfs_open("/dev/uart", 0, &task->fds[0]); + vfs_open("/dev/uart", 0, &task->fds[1]); + vfs_open("/dev/uart", 0, &task->fds[2]); + + task->maxfd = 2; + + return task; +} + +void task_free(task_struct *task) +{ + if (task->kernel_stack) + kfree(task->kernel_stack); + + list_del(&task->task_list); + + signal_head_free(task->signal); + sighand_free(task->sighand); + + vma_meta_free(task->address_space, task->page_table); + pt_free(task->page_table); + + // TODO: release tid + + for (int i = 0; i <= task->maxfd; ++i) { + if (task->fds[i].vnode != NULL) { + vfs_close(&task->fds[i]); + } + } + + kfree(task); +} + +task_struct *task_get_by_tid(uint32 tid) +{ + task_struct *task; + + list_for_each_entry(task, &task_queue, task_list) { + if (task->tid == tid) { + return task; + } + } + + return NULL; +} + +void task_init_map(task_struct *task) +{ + // TODO: map the return addres of mailbox_call + vma_map(task->address_space, (void *)0x3c000000, 0x03000000, + VMA_R | VMA_W | VMA_PA, (void *)0x3c000000); + + vma_map(task->address_space, (void *)0x7f0000000000, TEXT_USER_SHARED_LEN, + VMA_R | VMA_X | VMA_PA, (void *)VA2PA(TEXT_USER_SHARED_BASE)); + + vma_map(task->address_space, (void *)0xffffffffb000, STACK_SIZE, + VMA_R | VMA_W | VMA_ANON, NULL); +} + +void task_reset_mm(task_struct *task) +{ + vma_meta_free(task->address_space, task->page_table); + pt_free(task->page_table); + + task->page_table = pt_create(); + task->address_space = vma_meta_create(); +} \ No newline at end of file diff --git a/lab8/src/kernel/timer.S b/lab8/src/kernel/timer.S new file mode 100644 index 000000000..a3d9a4fb4 --- /dev/null +++ b/lab8/src/kernel/timer.S @@ -0,0 +1,18 @@ +#define CORE0_TIMER_IRQ_CTRL 0x40000040 + +.globl enable_core0_timer +enable_core0_timer: + // Enable cntp timer (EL1 physical timer) + mov x0, 1 + msr cntp_ctl_el0, x0 + + // Set expired time + mrs x0, cntfrq_el0 + msr cntp_tval_el0, x0 + + // Unmask timer interrupt (Enable nCNTPNSIRQ IRQ control) + mov x0, 0x02 + ldr x1, =CORE0_TIMER_IRQ_CTRL + str w0, [x1] + + ret \ No newline at end of file diff --git a/lab8/src/kernel/timer.c b/lab8/src/kernel/timer.c new file mode 100644 index 000000000..79f603226 --- /dev/null +++ b/lab8/src/kernel/timer.c @@ -0,0 +1,314 @@ +#include +#include +#include +#include +#include +#include + +#define CORE0_TIMER_IRQ_CTRL 0x40000040 +#define CORE0_IRQ_SOURCE 0x40000060 + +#define TIMER_PROC_NUM 32 + +static void timer_irq_handler(void *); +static void timer_irq_fini(void); + +typedef struct { + // cb(args) + void (*cb)(void *); + void *args; + uint32 remain_time; + struct list_head list; +} timer_proc; + +typedef struct { + struct list_head head; + int size; +} timer_meta; + +/* Used to store procudures that will be called after a period of time. */ +timer_proc t_procs[TIMER_PROC_NUM]; + +/* Metadata of t_procs. + * The linked list is sorted by remain_time. + */ +timer_meta t_meta; + +/* This variable has 32 bits, n-th bit stands for the status of t_procs[n]. + * If n-th bit is 1, it means t_procs[n] is available. + * If n-th bit is 0, it means t_procs[n] is unavailable. + */ +uint32 t_status; + +/* When setting a timer, this variable will store the interval. + * It is 0 when timer is not set. + */ +uint32 t_interval; + +int timer_show_enable; +uint64 timer_boot_cnt; + +static void timer_enable() +{ + // Enable core0 cntp timer + put32(PA2VA(CORE0_TIMER_IRQ_CTRL), 2); +} + +static void timer_disable() +{ + // Disable core0 cntp timer + put32(PA2VA(CORE0_TIMER_IRQ_CTRL), 0); +} + +static timer_proc *tp_alloc() +{ + uint32 daif; + uint32 idx; + + daif = save_and_disable_interrupt(); + + idx = ffs(t_status); + + if (idx == 0) { + restore_interrupt(daif); + + return NULL; + } + + t_status &= ~(1 << (idx - 1)); + + restore_interrupt(daif); + + return &t_procs[idx - 1]; +} + +static void tp_release(timer_proc *tp) +{ + if (!tp) { + return; + } + + uint32 idx = get_elem_idx(tp, t_procs); + + t_status |= (1 << idx); +} + +/* + * Need to disable interrupt before calling this function. + */ +static void timer_update_remain_time() +{ + timer_proc *iter; + int32 cntp_tval_el0; + uint32 diff; + + if (!t_meta.size) { + return; + } + + cntp_tval_el0 = read_sysreg(cntp_tval_el0); + diff = t_interval - cntp_tval_el0; + t_interval = cntp_tval_el0; + + list_for_each_entry(iter, &t_meta.head, list) { + if (diff > iter->remain_time) { + iter->remain_time = 0; + } else { + iter->remain_time -= diff; + } + } +} + +/* + * Return 1 if @tp was inserted at the first position, otherwise return 0. + */ +static int tp_insert(timer_proc *tp) +{ + uint32 daif; + timer_proc *iter; + int first; + + daif = save_and_disable_interrupt(); + + // Update remain_time + timer_update_remain_time(); + + // Insert tp + first = 1; + list_for_each_entry(iter, &t_meta.head, list) { + if (tp->remain_time < iter->remain_time) { + break; + } + first = 0; + } + + list_add_tail(&tp->list, &iter->list); + + t_meta.size += 1; + + restore_interrupt(daif); + + return first; +} + +/* + * Set timer + */ +static void timer_set() +{ + uint32 daif; + timer_proc *tp; + + daif = save_and_disable_interrupt(); + + if (!t_meta.size) { + restore_interrupt(daif); + + return; + } + + tp = list_first_entry(&t_meta.head, timer_proc, list); + + // Set timer + t_interval = tp->remain_time; + write_sysreg(cntp_tval_el0, t_interval); + + restore_interrupt(daif); +} + +static void timer_set_boot_cnt() +{ + timer_boot_cnt = read_sysreg(cntpct_el0); +} + +static void timer_show_boot_time(void *_) +{ + if (timer_show_enable) { + uint32 cntfrq_el0 = read_sysreg(cntfrq_el0); + uint64 cntpct_el0 = read_sysreg(cntpct_el0); + uart_printf("[Boot time: %lld seconds...]\r\n", + (cntpct_el0 - timer_boot_cnt) / cntfrq_el0); + } + + timer_add_proc_after(timer_show_boot_time, NULL, 2); +} + +void timer_init() +{ + uint64 cntkctl_el1; + + timer_set_boot_cnt(); + + INIT_LIST_HEAD(&t_meta.head); + t_meta.size = 0; + + t_interval = 0; + t_status = 0xffffffff; + + // Allow EL0 to access timer + cntkctl_el1 = read_sysreg(CNTKCTL_EL1); + cntkctl_el1 |= 1; + write_sysreg(CNTKCTL_EL1, cntkctl_el1); + + timer_add_proc_after(timer_show_boot_time, NULL, 2); +} + +int timer_irq_check() +{ + uint32 core0_irq_src = get32(PA2VA(CORE0_IRQ_SOURCE)); + + if (!(core0_irq_src & 0x02)) { + return 0; + } + + timer_disable(); + if (irq_run_task(timer_irq_handler, NULL, timer_irq_fini, 0)) { + timer_enable(); + } + + return 1; +} + +static void timer_irq_handler(void *_) +{ + timer_proc *tp; + + if (!t_meta.size) { + return; + } + + // Set next timer before calling any functions which may interrupt + tp = list_first_entry(&t_meta.head, timer_proc, list); + + list_del(&tp->list); + t_meta.size -= 1; + + timer_update_remain_time(); + timer_set(); + + // Execute the callback function + (tp->cb)(tp->args); + tp_release(tp); +} + +static void timer_irq_fini(void) +{ + timer_enable(); +} + +void timer_switch_info() +{ + timer_show_enable = !timer_show_enable; +} + +static void timer_add_proc(timer_proc *tp) +{ + int need_update; + + need_update = tp_insert(tp); + + if (need_update) { + timer_set(); + timer_enable(); + } +} + +void timer_add_proc_after(void (*proc)(void *), void *args, uint32 after) +{ + timer_proc *tp; + uint32 cntfrq_el0; + + tp = tp_alloc(); + + if (!tp) { + return; + } + + cntfrq_el0 = read_sysreg(cntfrq_el0); + + tp->cb = proc; + tp->args = args; + tp->remain_time = after * cntfrq_el0; + + timer_add_proc(tp); +} + +void timer_add_proc_freq(void (*proc)(void *), void *args, uint32 freq) +{ + timer_proc *tp; + uint32 cntfrq_el0; + + tp = tp_alloc(); + + if (!tp) { + return; + } + + cntfrq_el0 = read_sysreg(cntfrq_el0); + + tp->cb = proc; + tp->args = args; + tp->remain_time = cntfrq_el0 / freq; + + timer_add_proc(tp); +} \ No newline at end of file diff --git a/lab8/src/kernel/waitqueue.c b/lab8/src/kernel/waitqueue.c new file mode 100644 index 000000000..9e2a69484 --- /dev/null +++ b/lab8/src/kernel/waitqueue.c @@ -0,0 +1,50 @@ +#include +#include +#include + +wait_queue_head *wq_create(void) +{ + wait_queue_head *head; + + head = kmalloc(sizeof(wait_queue_head)); + + INIT_LIST_HEAD(&head->list); + + return head; +} + +int wq_empty(wait_queue_head *head) +{ + return list_empty(&head->list); +} + +void wq_add_task(task_struct *task, wait_queue_head *head) +{ + preempt_disable(); + + list_add_tail(&task->list, &head->list); + + preempt_enable(); +} + +void wq_del_task(task_struct *task) +{ + preempt_disable(); + + list_del(&task->list); + + preempt_enable(); +} + +task_struct *wq_get_first_task(wait_queue_head *head) +{ + task_struct *task; + + preempt_disable(); + + task = list_first_entry(&head->list, task_struct, list); + + preempt_enable(); + + return task; +} \ No newline at end of file diff --git a/lab8/src/lib/string.c b/lab8/src/lib/string.c new file mode 100644 index 000000000..76ed9586a --- /dev/null +++ b/lab8/src/lib/string.c @@ -0,0 +1,146 @@ +#include + +int strcmp(const char *str1, const char *str2) +{ + char c1, c2; + + while ((c1 = *str1++) == (c2 = *str2++) && c1 && c2) {}; + + return c1 - c2; +} + +int strncmp(const char *str1, const char *str2, int n) +{ + char c1, c2; + + if (n <= 0) + return 0; + + while ((c1 = *str1++) == (c2 = *str2++) && c1 && c2 && --n > 0) {}; + + return n ? c1 - c2 : 0; +} + +int strcasecmp(const char *s1, const char *s2) +{ + char c1, c2; + + while (1) { + c1 = *s1++; + c2 = *s2++; + + if (!c1 || !c2) { + break; + } + + if ('A' <= c1 && c1 <= 'Z') { + c1 |= 0x20; + } + + if ('A' <= c2 && c2 <= 'Z') { + c2 |= 0x20; + } + + if (c1 != c2) { + break; + } + } + + return c1 - c2; +} + +int strlen(const char *str) +{ + int ret = 0; + + while (*str++) { + ret += 1; + } + + return ret; +} + +int strcpy(char *dst, const char *src) +{ + int ret = 0; + + while (*src) { + *dst = *src; + dst++; + src++; + ret++; + } + + *dst = '\0'; + + return ret; +} + +char *strcat(char *dest, const char *src) +{ + char *t; + + t = dest; + + while (*t) { + t++; + } + + while (*src) { + *t = *src; + t++; + src++; + } + + *t = '\0'; + + return dest; +} + +char *strncat(char *dest, const char *src, int n) +{ + char *t; + + t = dest; + + while (*t) { + t++; + } + + while (n > 0 && *src) { + *t = *src; + t++; + src++; + n--; + } + + *t = '\0'; + + return dest; +} + +int atoi(const char *str) +{ + int i = 0, tmp = 0; + + while (*str) { + if ('0' > *str || *str > '9') { + return 0; + } + + i *= 10; + + tmp = i + (*str - '0'); + + if (tmp < i) { + // Maybe overflow + return 0; + } + + i = tmp; + + str++; + } + + return i; +} diff --git a/lab8/src/lib/utils.S b/lab8/src/lib/utils.S new file mode 100644 index 000000000..34aa2d825 --- /dev/null +++ b/lab8/src/lib/utils.S @@ -0,0 +1,47 @@ +.globl put32 +put32: + str w1, [x0] + ret + +.globl get32 +get32: + ldr w0, [x0] + ret + +.globl delay +delay: + subs x0, x0, #1 + bne delay + ret + +.globl memzero +memzero: + str xzr, [x0], #8 + subs x1, x1, #8 + b.gt memzero + ret + +.globl memncpy +memncpy: + b memncpy_1_cmp +memncpy_1: + ldrb w3, [x1], #1 + strb w3, [x0], #1 + subs x2, x2, #1 +memncpy_1_cmp: + cmp x2, 1 + bge memncpy_1 +memncpy_ok: + ret + +.globl memset +memset: + b memset_1_cmp +memset_1: + strb w1, [x0], #1 + subs x2, x2, #1 +memset_1_cmp: + cmp x2, 1 + bge memset_1 +memset_ok: + ret \ No newline at end of file diff --git a/lab8/tools/buildimg.sh b/lab8/tools/buildimg.sh new file mode 100644 index 000000000..e36fd7f21 --- /dev/null +++ b/lab8/tools/buildimg.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# $1: bootloader.img +# $2: target.img (which will be dd to sd-card) +# $3: initramfs.cpio + +echo "[*] Mount $2 to ./mnt ..." +mkdir -p mnt + +# sudo losetup --partscan --show --find test.img +LOOPBACK=`sudo losetup --partscan --show --find $2` + +echo "[*] Create loopback" ${LOOPBACK} + +# "$LOOPBACK" is some string like "/dev/loop0" +echo ${LOOPBACK} | grep --quiet "/dev/loop" + +if [ $? = 1 ] +then + echo "[!] losetup failed!" + exit 1 +fi + +# sudo mkfs.vfat -F 32 /dev/loop0p1 +sudo mkfs.vfat -F 32 ${LOOPBACK}p1 + +# sudo mount /dev/loop0p1 mnt +sudo mount ${LOOPBACK}p1 mnt + +echo "[*] Copy the necessary files to $2 ..." +sudo cp -r img/* mnt + +echo "[*] Copy booting image $1 to $2 ..." +sudo cp $1 mnt/bootloader.img + +# echo "[*] Copy kernel image prebuild/kernel8.img to $2 ..." +# sudo cp prebuild/kernel8.img mnt/kernel8.img + +echo "[*] Copy initrmafs.cpio $3 to $2 ..." +sudo cp $3 mnt/initramfs.cpio + +echo "[*] Umount $2 ..." +sudo umount mnt + +# sudo losetup -d /dev/loop0 +sudo losetup -d ${LOOPBACK} + +echo "[*] Use following command to write $2 to your SD card:" +echo "\t" "dd if=./$2 of=/dev/" +echo "[*] Use following command to check your SD card device:" +echo "\t" "lsblk" \ No newline at end of file diff --git a/lab8/tools/createimg.sh b/lab8/tools/createimg.sh new file mode 100644 index 000000000..aa3ee33bd --- /dev/null +++ b/lab8/tools/createimg.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +truncate -s 50M $1 + +# fdisk test.img +( +echo o # Create a new empty DOS partition table +echo n # Add a new partition +echo p # Primary partition +echo 1 # Partition number +echo # First sector (Accept default: 1) +echo # Last sector (Accept default: varies) +echo t # Change partition type +echo c # Master Boot Record primary partitions type:LBA +echo w # Write changes +) | sudo fdisk $1 + +# sudo losetup --partscan --show --find test.img +LOOPBACK=`sudo losetup --partscan --show --find $1` + +# "$LOOPBACK" is some string like "/dev/loop0" +echo ${LOOPBACK} | grep --quiet "/dev/loop" + +if [ $? = 1 ] +then + echo "[!] losetup failed!" + exit 1 +fi + +# sudo mkfs.vfat -F 32 /dev/loop0p1 +sudo mkfs.vfat -F 32 ${LOOPBACK}p1 + +# sudo losetup -d /dev/loop0 +sudo losetup -d ${LOOPBACK} \ No newline at end of file diff --git a/lab8/tools/loadkernel.py b/lab8/tools/loadkernel.py new file mode 100644 index 000000000..2569cb600 --- /dev/null +++ b/lab8/tools/loadkernel.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import sys +import argparse +import struct +import serial +import time + +def pty_mode(args): + with open(args.filepath, 'rb') as f: + kernel = f.read() + + with open(args.devpath, 'wb', buffering = 0) as f: + f.write(struct.pack('

    egBGC2dK}72Z^1?_1!lC_8(8_n|NJY6 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%0DKe?Cn)PgbgS{^1Gv_LzRvc3 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