diff --git a/.gitignore b/.gitignore index 11e6adb9..b80ccf1a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ *.log *.swp *.DS_Store -*.swp tags Makefile include/metalsvm/config.h diff --git a/drivers/char/socket.c b/drivers/char/socket.c index 71133413..e2b24756 100755 --- a/drivers/char/socket.c +++ b/drivers/char/socket.c @@ -104,12 +104,12 @@ int socket_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; - new_node->open = &socket_open; - new_node->close = &socket_close; - new_node->read = &socket_read; + new_node->type = FS_CHARDEVICE; + new_node->open = &socket_open; + new_node->close = &socket_close; + new_node->read = &socket_read; new_node->write = &socket_write; - spinlock_init(&new_node->lock); + spinlock_init(&new_node->lock); blist= &node->block_list; do { diff --git a/drivers/char/stdio.c b/drivers/char/stdio.c index 32ac4755..3289be19 100644 --- a/drivers/char/stdio.c +++ b/drivers/char/stdio.c @@ -55,6 +55,7 @@ static int null_close(fildes_t* file) static ssize_t stdio_read(fildes_t* file, uint8_t* buffer, size_t size) { +#ifdef CONFIG_KEYBOARD kb_buffer.buffer = kmalloc(size * sizeof(char)); kb_buffer.maxsize = size; kb_buffer.size = 0; @@ -72,6 +73,9 @@ static ssize_t stdio_read(fildes_t* file, uint8_t* buffer, size_t size) //kprintf("Size: %i, offset: %i, buffer: %s", size, buffer, offset); file->offset += size; return size; +#else + return 0; +#endif } /* Write Function of a stdio device */ @@ -111,12 +115,12 @@ int null_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; - new_node->open = &null_open; - new_node->close = &null_close; - new_node->read = &null_read; + new_node->type = FS_CHARDEVICE; + new_node->open = &null_open; + new_node->close = &null_close; + new_node->read = &null_read; new_node->write = &null_write; - spinlock_init(&new_node->lock); + spinlock_init(&new_node->lock); blist= &node->block_list; do { @@ -170,12 +174,12 @@ int stdin_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; - new_node->open = &null_open; - new_node->close = &null_close; - new_node->read = &stdio_read; + new_node->type = FS_CHARDEVICE; + new_node->open = &null_open; + new_node->close = &null_close; + new_node->read = &stdio_read; new_node->write = &null_write; - spinlock_init(&new_node->lock); + spinlock_init(&new_node->lock); blist= &node->block_list; do { @@ -229,12 +233,12 @@ int stdout_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; - new_node->open = &null_open; - new_node->close = &null_close; - new_node->read = &null_read; + new_node->type = FS_CHARDEVICE; + new_node->open = &null_open; + new_node->close = &null_close; + new_node->read = &null_read; new_node->write = &stdio_write; - spinlock_init(&new_node->lock); + spinlock_init(&new_node->lock); blist= &node->block_list; do { @@ -288,12 +292,12 @@ int stderr_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; - new_node->open = &null_open; - new_node->close = &null_close; - new_node->read = &null_read; + new_node->type = FS_CHARDEVICE; + new_node->open = &null_open; + new_node->close = &null_close; + new_node->read = &null_read; new_node->write = &stdio_write; - spinlock_init(&new_node->lock); + spinlock_init(&new_node->lock); blist= &node->block_list; do { diff --git a/drivers/net/rckemac.c b/drivers/net/rckemac.c index 77659309..8f22e0a5 100644 --- a/drivers/net/rckemac.c +++ b/drivers/net/rckemac.c @@ -227,6 +227,7 @@ static err_t rckemacif_output(struct netif* netif, struct pbuf* p) rckemacif->tx_write_offset = 1; packets = CLINE_PACKETS(p->tot_len + 2); + //LWIP_DEBUGF(NETIF_DEBUG, ("TX packets: %d\n", packets)); read_offset = read_emac(rckemacif->num_emac, EMAC_TX_CONTROL+EMAC_TX_BUFFER_READ_OFFSET, rckemacif->core); #if 1 @@ -335,7 +336,7 @@ static void rckemacif_input(struct netif* netif, struct pbuf* p) err_t err; /* points to packet payload, which starts with an Ethernet header */ - ethhdr = p->payload; + ethhdr = (struct eth_hdr *) p->payload; switch (htons(ethhdr->type)) { /* IP or ARP packet? */ @@ -364,7 +365,7 @@ static void rckemacif_rx_handler(struct netif* netif, unsigned int write_offset) unsigned short read_offset = rckemacif->rx_read_offset; volatile void *addr = NULL; uint16_t i, length = 0; - struct pbuf *p; + struct pbuf *p = NULL; struct pbuf* q; if (write_offset > rckemacif->rx_buffer_max) { @@ -476,7 +477,6 @@ out: #if ETH_PAD_SIZE pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ #endif - rckemacif_input(netif, p); LINK_STATS_INC(link.recv); } else { LWIP_DEBUGF(NETIF_DEBUG, ("rckemacif_rx_inthandler: not enough memory!\n")); @@ -490,6 +490,11 @@ rxDone: write_emac(rckemacif->num_emac, EMAC_RX_CONTROL + EMAC_RX_BUFFER_READ_OFFSET, rckemacif->core, read_offset); rckemacif->rx_read_offset = read_offset; + if (p) { + rckemacif_input(netif, p); + p = NULL; + } + if (read_offset != write_offset) goto again; } diff --git a/fs/initrd.c b/fs/initrd.c index 09719171..33d1eceb 100644 --- a/fs/initrd.c +++ b/fs/initrd.c @@ -212,7 +212,7 @@ static int initrd_open(fildes_t* file, const char* name) } if (file->node->type == FS_DIRECTORY) { - if (!file->flags & O_CREAT) + if (!(file->flags & O_CREAT)) return -ENOENT; uint32_t i, j; diff --git a/include/metalsvm/syscall.h b/include/metalsvm/syscall.h index 70c6ff4c..04390311 100644 --- a/include/metalsvm/syscall.h +++ b/include/metalsvm/syscall.h @@ -74,6 +74,12 @@ extern "C" { #define __NR_recv 21 #define __NR_send 22 #define __NR_socket 23 +#define __NR_getsockopt 24 +#define __NR_setsockopt 25 +#define __NR_gethostbyname 26 +#define __NR_sendto 27 +#define __NR_recvfrom 28 +#define __NR_select 29 #ifdef __cplusplus } diff --git a/kernel/netio.c b/kernel/netio.c index 7dc053a7..d377745e 100644 --- a/kernel/netio.c +++ b/kernel/netio.c @@ -47,7 +47,6 @@ typedef struct static int nPort = DEFAULTPORT; static const int sobufsize = 131072; static struct in_addr addr_local; -static int bTimeOver = 0; static int send_data(int socket, void *buffer, size_t size, int flags) { @@ -139,7 +138,7 @@ static int TCPServer(void* arg) if ((err = bind(server, (struct sockaddr *) &sa_server, sizeof(sa_server))) < 0) { kprintf("bind failed: %d\n", err); - close(server); + closesocket(server); kfree(cBuffer, TMAXSIZE); return -1; } @@ -147,7 +146,7 @@ static int TCPServer(void* arg) if ((err = listen(server, 2)) != 0) { kprintf("listen failed: %d\n", err); - close(server); + closesocket(server); kfree(cBuffer, TMAXSIZE); return -1; } @@ -240,11 +239,10 @@ static int TCPServer(void* arg) nByte += rc; } - kputs("B"); nData += ctl.data; - } while(((rdtsc()-start)/(uint64_t)freq) < 6000000ULL /*= 6s */); + end = rdtsc(); + } while((end-start)/freq < 6000000ULL /* = 6s */); -kputs("AAAA"); cBuffer[0] = 1; if (send_data(client, cBuffer, ctl.data, 0)) @@ -258,13 +256,13 @@ kputs("AAAA"); kprintf("\nDone.\n"); - close(client); + closesocket(client); if (rc < 0) break; } - close(server); + closesocket(server); kfree(cBuffer, TMAXSIZE); return 0; diff --git a/kernel/tasks.c b/kernel/tasks.c index 53186cbe..60c8e412 100644 --- a/kernel/tasks.c +++ b/kernel/tasks.c @@ -507,13 +507,12 @@ static int load_task(load_args_t* largs) elf_header_t header; elf_program_header_t prog_header; //elf_section_header_t sec_header; - ///!!! kfree is missing! + ///!!! kfree is missing! fildes_t *file = kmalloc(sizeof(fildes_t)); file->offset = 0; file->flags = 0; //TODO: init the hole fildes_t struct! - vfs_node_t* node; task_t* curr_task = per_core(current_task); int err; @@ -524,7 +523,7 @@ static int load_task(load_args_t* largs) if (!file->node) return -EINVAL; - read_fs(file, (uint8_t*)&header, sizeof(elf_header_t)); + err = read_fs(file, (uint8_t*)&header, sizeof(elf_header_t)); if (err < 0) { kprintf("read_fs failed: %d\n", err); return err; diff --git a/kernel/tests.c b/kernel/tests.c index 4666c8a0..232d8748 100644 --- a/kernel/tests.c +++ b/kernel/tests.c @@ -404,14 +404,14 @@ void* client_task(void* e) int test_init(void) { - char* argv[] = {"/bin/mshell", NULL}; -// char* argv[] = {"/bin/tests", NULL}; +// char* argv[] = {"/bin/mshell", NULL}; + char* argv[] = {"/bin/tests", NULL}; // char* server_argv[] = {"/bin/server", "6789", NULL}; // char* client_argv[] = {"/bin/client", "127.0.0.1", "6789", NULL}; - //sem_init(&producing, 1); - //sem_init(&consuming, 0); - //mailbox_int32_init(&mbox); + sem_init(&producing, 1); + sem_init(&consuming, 0); + mailbox_int32_init(&mbox); #if defined(CONFIG_LWIP) && defined(CONFIG_ROCKCREEK) @@ -426,16 +426,17 @@ int test_init(void) // create_kernel_task(NULL,client_task,NULL); #endif - //create_kernel_task(NULL, foo, "Hello from foo1", NORMAL_PRIO); - //create_kernel_task(NULL, join_test, NULL, NORMAL_PRIO); - + create_kernel_task(NULL, foo, "Hello from foo1", NORMAL_PRIO); + create_kernel_task(NULL, join_test, NULL, NORMAL_PRIO); //create_kernel_task(NULL, producer, , NORMAL_PRIO); //create_kernel_task(NULL, consumer, NULL, NORMAL_PRIO); //create_kernel_task(NULL, mail_ping, NULL, NORMAL_PRIO); //create_kernel_task(NULL, mail_noise, NULL, NORMAL_PRIO); //create_kernel_task(NULL, svm_test, NULL, NORMAL_PRIO); //create_user_task(NULL, "/bin/hello", argv); - create_user_task(NULL, "/bin/mshell", argv); + create_user_task(NULL, "/bin/tests", argv); + //create_user_task(NULL, "/bin/jacobi", argv); + //create_user_task(NULL, "/bin/mshell", argv); //create_user_task(NULL, "/bin/jacobi", argv); //create_user_task(NULL, "/bin/server", server_argv); //sleep(5); diff --git a/lwip/src/arch/sys_arch.c b/lwip/src/arch/sys_arch.c index 5b90bf66..486d2faa 100644 --- a/lwip/src/arch/sys_arch.c +++ b/lwip/src/arch/sys_arch.c @@ -19,9 +19,9 @@ #include #include +#include "lwip/opt.h" #include "lwip/debug.h" #include "lwip/sys.h" -#include "lwip/opt.h" #include "lwip/stats.h" #ifndef TRUE @@ -87,7 +87,7 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, sys_thread_t tmp; err = create_kernel_task(&tmp, thread, arg, prio); - LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_new: create_kernel_task %d, id = %u", err, tmp)); + LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_new: create_kernel_task %d, id = %u\n", err, tmp)); return tmp; } @@ -196,6 +196,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* mbox, void** msg) */ err_t sys_mbox_new(sys_mbox_t* mbox, int size) { + LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_new: create mailbox with the minimum size: %d\n", size)); + mbox->valid = TRUE; return mailbox_ptr_init(&mbox->mailbox); } @@ -216,7 +218,9 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) int err; err = mailbox_ptr_trypost(&mbox->mailbox, msg); - //LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_trypost: %d"\n, err)); + if (err != 0) { + LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_trypost: %d\n", err)); + } return err; } diff --git a/lwip/src/include/lwipopts.h b/lwip/src/include/lwipopts.h index d21fe32c..9e9b36e8 100644 --- a/lwip/src/include/lwipopts.h +++ b/lwip/src/include/lwipopts.h @@ -37,7 +37,11 @@ /** * LWIP_DHCP==1: Enable DHCP module. */ +#ifdef CONFIG_ROCKCREEK +#define LWIP_DHCP 0 +#else #define LWIP_DHCP 1 +#endif /** * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. @@ -68,7 +72,7 @@ * when opening a connection. For the transmit size, this MSS sets * an upper limit on the MSS advertised by the remote host. */ -#define TCP_MSS 1460 +#define TCP_MSS 1440 /** * TCP_SND_BUF: TCP sender buffer space (bytes). diff --git a/newlib/examples/hello.c b/newlib/examples/hello.c index 0a112970..99b6b5e4 100644 --- a/newlib/examples/hello.c +++ b/newlib/examples/hello.c @@ -22,6 +22,8 @@ #include #include #include +#undef errno +extern int errno; /*file descriptor init*/ #define NR_OPEN 10 @@ -43,12 +45,13 @@ int main(int argc, char** argv) { char* teststr = malloc(sizeof(char)*100); - int testfile = open("/bin/test2", O_CREAT | O_EXCL, "wr"); - write(testfile, "hello in new file '/bin/test2'", 30); + int testfile = open("/bin/test.txt", O_CREAT | O_EXCL, "wr"); + write(testfile, "hello in new file '/bin/test.txt'", 30); lseek(testfile, 0, SEEK_SET); read(testfile, teststr, 100); close(testfile); - printf("Gelesen aus neuer Datei: %s", teststr); + + printf("read from new file: %s\n", teststr); return errno; } diff --git a/newlib/examples/mshell.c b/newlib/examples/mshell.c index 38c62947..c19de0c5 100644 --- a/newlib/examples/mshell.c +++ b/newlib/examples/mshell.c @@ -1,6 +1,19 @@ /* * Copyright 2011 Marian Ohligs, Chair for Operating Systems, * RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ #include @@ -10,6 +23,8 @@ #include #include #include +#undef errno +extern int errno; void showlogo() { printf("\n\n"); diff --git a/newlib/examples/test b/newlib/examples/test deleted file mode 100644 index e7cf92e9..00000000 --- a/newlib/examples/test +++ /dev/null @@ -1,3 +0,0 @@ -test -hallo -huso diff --git a/newlib/src/libgloss/metalsvm/syscall.h b/newlib/src/libgloss/metalsvm/syscall.h index 5bd58118..26acb507 100644 --- a/newlib/src/libgloss/metalsvm/syscall.h +++ b/newlib/src/libgloss/metalsvm/syscall.h @@ -63,6 +63,12 @@ extern "C" { #define __NR_recv 21 #define __NR_send 22 #define __NR_socket 23 +#define __NR_getsockopt 24 +#define __NR_setsockopt 25 +#define __NR_gethostbyname 26 +#define __NR_sendto 27 +#define __NR_recvfrom 28 +#define __NR_select 29 #define _STR(token) #token #define _SYSCALLSTR(x) "int $" _STR(x) " " diff --git a/tools/Makefile b/tools/Makefile index ee97610b..b47cc898 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -7,7 +7,7 @@ LDFLGAS = DEFINES= NASM = nasm NASMFLAGS = -fbin -EXECFILES = $(shell find ../newlib/examples -perm -u+r+x -type f) ../newlib/examples/test +EXECFILES = $(shell find ../newlib/examples -perm -u+r+x -type f) # other implicit rules %.o : %.c