static int icmp_recv(struct netbuf *pkt) { struct icmp_header *icmphdr; icmphdr = (struct icmp_header *)pkt->top; /* 正式にはコンソールドライバタスクに依頼する必要があるが,とりあえず */ puts("ICMP received: "); putxval(pkt->option.common.ipaddr.addr, 8); puts(" "); putxval(icmphdr->type, 2); puts(" "); putxval(icmphdr->code, 2); puts(" "); putxval(ntoh2(icmphdr->checksum), 4); puts("\n"); switch (icmphdr->type) { case ICMP_TYPE_REPLY: break; case ICMP_TYPE_REQUEST: icmp_sendpkt(pkt->option.common.ipaddr.addr, ICMP_TYPE_REPLY, icmphdr->code, ntoh2(icmphdr->param.id), ntoh2(icmphdr->param.sequence_number), pkt->size - sizeof(struct icmp_header), (char *)icmphdr + sizeof(*icmphdr)); break; } return 0; }
/* メモリの16進ダンプ出力 */ static int dump(char *buf, long size) { long i; long j; if (size < 0) { puts("no data.\n"); return -1; } for (i = 0; i < size; i++) { if((i & 0xf) == 0) { putxval((uint32)&buf[i],8); puts(" : "); } putxval(buf[i], 2); if ((i & 0xf) == 15) { puts("\n"); } else { if ((i & 0xf) == 7) puts(" "); puts(" "); } if( i / 0x100 == 0 ) { for( j = 0; j < 100000; j++ ) { ; } } } puts(" << dump end >>\n"); return 0; }
static void printval(void) { puts("global_data : "); putxval(global_data, 0); puts("\n"); puts("global_bss : "); putxval(global_bss, 0); puts("\n"); puts("static_data : "); putxval(static_data, 0); puts("\n"); puts("static_bss : "); putxval(static_bss, 0); puts("\n"); }
int test10_1_main(int argc, char *argv[]) { char *p1, *p2; int i, j; puts("test10_1 started.\n"); for (i = 4; i <= 56; i += 4) { p1 = kz_kmalloc(i); p2 = kz_kmalloc(i); for (j = 0; j < i - 1; j++) { p1[j] = 'a'; p2[j] = 'b'; } p1[j] = '\0'; p2[j] = '\0'; putxval((unsigned long)p1, 8); puts(" "); puts(p1); puts("\n"); putxval((unsigned long)p2, 8); puts(" "); puts(p2); puts("\n"); kz_kmfree(p1); kz_kmfree(p2); } puts("test10_1 exit.\n"); return 0; }
void dump_start( void ) { puts("os size: 0x"); putxval(size, 0); puts("\nstored os address: 0x"); putxval( (uint32)loadbuf, 8); puts("\n"); dump(loadbuf, size); }
int main(void) { static char buf[16]; static long size = -1; static unsigned char *loadbuf = NULL; char *entry_point; void (*f)(void); extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */ INTR_DISABLE; /* 割込み無効にする */ init(); puts("kzload (kozos boot loader) started.\n"); while (1) { puts("kzload> "); /* prompt */ gets(buf); if(!strcmp(buf, "load")) { /* XMODEMでのファイルのダウンロード */ loadbuf = (char *)(&buffer_start); size = xmodem_recv(loadbuf); wait(); /* 転送アプリが終了し端末アプリに制御が戻るまで待ち合わせる */ if(size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if(!strcmp(buf, "dump")) { /* メモリの16進ダンプ出力 */ puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if(!strcmp(buf, "run")) { /* ELF形式ファイルの実行 */ entry_point = elf_load(loadbuf); if(!entry_point) { puts("run error!\n"); } else { puts("starting from entry point: "); putxval((unsigned long)entry_point, 0); puts("\n"); f = (void (*)(void))entry_point; /* ロードしたプログラムに処理を渡す */ f(); /* ここには返ってこない */ } } else { puts("unknown command.\n"); } } return 0; }
int main(){ serial_init_device(SERIAL_DEFAULT_DEVICE); puts("Hello World\n"); putxval(value, 0); puts("\n"); value = 20; putxval(value, 0); puts("\n"); while(1){ } return 0; }
int main(void) { static char buf[16]; static long size = -1; static unsigned char *loadbuf = NULL; char *entry_point; void (*f)(void); extern int buffer_start; INTR_DISABLE; init(); puts("kzload (kozos boot loader) started.\n"); while (1) { puts("kzload> "); gets(buf); if (!strcmp(buf, "load")) { loadbuf = (char *)&buffer_start; size = xmodem_recv(loadbuf); wait(); if (size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if (!strcmp(buf, "dump")) { puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if (!strcmp(buf, "run")) { entry_point = elf_load(loadbuf); if (!entry_point) { puts("run error\n"); } else { puts("starting from entry point: "); putxval((unsigned long)entry_point, 0); puts("\n"); f = (void (*)(void))entry_point; f(); /* not reach here */ } } else { puts("unknown.\n"); } } return 0; }
int main(void) { static char buf[16]; static long size = -1; static unsigned char *loadbuf = NULL; extern int buffer_start; /* This buffer is defined in the linker script */ char *entry_point; void (*f)(void); INTR_DISABLE; /* disable interruption */ init(); puts("Hello World!\n"); puts("kzload (kozos boot loader) started.\n"); while (1) { puts("kzload> "); /* display of prompt */ gets(buf); /* receipt of commands via serial */ if (!strcmp(buf, "load")) { /* file download in XMODEM */ loadbuf = (char *)(&buffer_start); size = xmodem_recv(loadbuf); wait(); /* Wait until transfer application terminates and terminal console can be controled. */ if (size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if (!strcmp(buf, "dump")) { /* hexadecimal dump of a memory */ puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if (!strcmp(buf, "run")) { /* execute ELF files */ entry_point = elf_load(loadbuf); /* load ELF files to a memory */ if (!entry_point) { puts("run error!\n"); } else { puts("starting from entry point: "); putxval((unsigned long)entry_point, 0); puts("\n"); f = (void (*)(void))entry_point; f(); /* operation is switched to the loaded program at this point */ } } else { puts("unknown.\n"); } } return 0; }
int main(void) { serial_init(SERIAL_DEFAULT_DEVICE); puts("Hello World!\n"); putxval(0x10, 0); puts("\n"); putxval(0xffff, 0); puts("\n"); while (1) ; return 0; }
int main(void) { extern int program_buffer; memset(&program_buffer, 0x00, 0x001d00); init(); puts("kzload (kozos boot loader) started.\n"); while(1){ static long program_size = -1; #define CommandSize 16 static char command_buff[CommandSize]; memset(command_buff, 0x00, CommandSize); puts("kzload> "); gets(command_buff); #define MATCH(command) (strcmp(command_buff,command) == 0) if(MATCH("load")){ // XMODEMでファイルをダウンロード memset(&program_buffer, 0x00, 0x001d00); program_size = receive_program((unsigned char*)&program_buffer); } else if(MATCH("dump")){ puts("size: "); putxval(program_size, 12); puts("\n"); dump_h((unsigned char*)&program_buffer, program_size); } else if(MATCH("run")) { const char *ep = elf_load((unsigned char*)&program_buffer); const void (*entry_point)(void) = (void(*)(void))ep; if( entry_point == NULL ){ puts("no entry_point.\n"); } else { puts("start at 0x"); putxval(entry_point, 6); puts("\n"); entry_point(); } } else { puts("unknown command.\n"); } } // end of while(1) return 0; }
static int dump( char* buf, long size ) { long i; if(size < 0) { puts("no data\n"); return -1; } for(i = 0; i < size; i++) { putxval(buf[i], 2); if((i & 0xf) == 15) { puts("\n"); } else { if((i & 0xf) == 7) { puts(" "); } puts(" "); } } puts("\n"); return 0; }
int main(void) { /* Initialize the serial device */ serial_init(SERIAL_DEFAULT_DEVICE); /* Output */ puts("Hello World!\n"); putxval(0x10, 0); puts("\n"); putxval(0xffff, 0); puts("\n"); while(1){ } return 0; }
int dram_check() { volatile uint32 *p; val_t val; puts("DRAM checking...\n"); for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) { /* putxval((unsigned long)p, 8);*/ val.u.val32[0] = (uint32)p; if (check_val((val_t *)p, &val) < 0) goto err; val.u.val32[0] = 0; if (check_val((val_t *)p, &val) < 0) goto err; val.u.val32[0] = 0xffffffffUL; if (check_val((val_t *)p, &val) < 0) goto err; } puts("\nall check OK.\n"); return 0; err: puts("\nERROR: "); putxval((unsigned long)*p, 8); puts("\n"); return -1; }
void load_start( void ) { extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */ loadbuf = (char *)(&buffer_start); size = xmodem_recv(loadbuf); wait(); /* 転送アプリが終了し端末アプリに制御が戻るまで待ち合わせる */ if (size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("os size : 0x"); putxval( size, 0 ); puts("\nstored os address: 0x"); putxval( (uint32)loadbuf, 8); puts("\nXMODEM receive succeeded.\n"); } }
void run_start( void ) { char *entry_point; void (*f)(void); entry_point = elf_load(loadbuf); /* メモリ上に展開(ロード) */ puts("entry point: "); putxval((unsigned long)entry_point, 0); if (!entry_point) { puts("\nrun error!\n"); } else { puts("\nstarting from entry point: "); putxval((unsigned long)entry_point, 0); puts("\n"); f = (void (*)(void))entry_point; f(); /* ここで,ロードしたプログラムに処理を渡す */ /* ここには返ってこない */ } }
int main( void ) { static char buf[16]; static long size = -1; static unsigned char* loadbuf = NULL; extern int buffer_start; /* buffer defined at ld.scr */ init(); puts("kzload (kozos boot loader) started.\n"); while(1) { puts("kzload> "); gets(buf); if(strcmp(buf, "load") == 0) { loadbuf = (char*)(&buffer_start); size = xmodem_recv(loadbuf); wait(); if(size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if(strcmp(buf, "dump") == 0) { puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if(strcmp(buf, "run") == 0) { elf_load(loadbuf); } else { puts("unknown.\n"); } } return 0; }
int command_main(int argc, char *argv[]) { char *p; int size; long prev_time; send_use(SERIAL_DEFAULT_DEVICE); while (1) { send_write("command> "); /* プロンプト表示 */ /* コンソールからの受信文字列を受け取る */ kz_recv(MSGBOX_ID_CONSINPUT, &size, &p); if (p == NULL) { send_write("expired.\n"); continue; } p[size] = '\0'; if (!strncmp(p, "echo", 4)) { /* echoコマンド */ send_write(p + 4); /* echoに続く文字列を出力する */ send_write("\n"); } else if (!strncmp(p, "timer", 5)) { /* timerコマンド */ send_write("timer start.\n"); send_start(1000); } else if (!strncmp(p, "ping", 4)) { /* pingコマンド */ send_write("ping start.\n"); send_icmp(); } else if (!strncmp(p, "tftp", 4)) { /* tftpコマンド */ send_write("tftp start.\n"); send_tftp(); } else if (!strncmp(p, "debug", 5)) { /* デバッガ起動 */ set_debug_traps(); force_break(); } else if (!strncmp(p, "call", 4)) { /* ダミー関数の呼び出し */ send_write(func(p + 4)); } else if (!strncmp(p, "get", 3)) { /* get */ prev_time = get_time(); putxval(prev_time, 8); puts("\n"); } else { send_write("unknown.\n"); } kz_kmfree(p); } return 0; }
// buf を bytes だけダンプする static int dump_h(unsigned char *buf, long bytes){ if(bytes < 0){ puts("no data.\n"); return -1; } int i = 0; for( i = 0; i < bytes; i++ ){ putxval(buf[i], 2); if( (i & 0xF) == 0xF ) puts("\n"); // 16バイトごとに改行 if( (i & 0xF) == 0x7 ) puts(" "); // 8バイトごとにスペース挿入 } puts("\n"); return 0; }
static int semtest2( int argc, char *argv[]) { int i; for( i = 0; i < 10000; i++ ){ kz_getsem(SEM_ID_1); source++; kz_postsem(SEM_ID_1); } kz_getsem(SEM_ID_1); puts("semtest2 end : source = "); putxval(source,0); puts("\n"); kz_postsem(SEM_ID_1); return 0; }
int semtest(void) { int cnt = 10000; puts("semtest. start : source = "); putxval(source,0); puts("\n"); kz_run(semtest1, "semtest1\n", 1, 0x100, 0, NULL); kz_run(semtest2, "semtest2\n", 1, 0x100, 0, NULL); while(cnt-->0){ ; } puts("semtest. end\n"); return 0; }
void kzmem_free(void* mem) { int i; kzmem_block* mp; kzmem_pool* p; mp = ((kzmem_block*)mem - 1); /* in front of header */ for(i=0; i<MEMORY_AREA_NUM; ++i){ p = &pool[i]; puts("kzmem_free: "); putxval(mp->size, 0); puts("\n"); if(mp->size == p->size){ mp->next = p->free; p->free = mp; return; } } kz_sysdown(); }
int main(void) { static char buf[16]; static long size = -1; static unsigned char *loadbuf = NULL; extern int buffer_start; /* リンカ・スクリプトで定義されているバッファ */ init(); puts("kzload (kozos boot loader) started.\n"); while (1) { puts("kzload> "); /* プロンプト表示 */ gets(buf); /* シリアルからのコマンド受信 */ if (!strcmp(buf, "load")) { /* XMODEMでのファイルのダウンロード */ loadbuf = (char *)(&buffer_start); size = xmodem_recv(loadbuf); wait(); /* 転送アプリが終了し端末アプリに制御が戻るまで待ち合わせる */ if (size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if (!strcmp(buf, "dump")) { /* メモリの16進ダンプ出力 */ puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if (!strcmp(buf, "run")) { /* ELF形式ファイルの実行 */ elf_load(loadbuf); /* メモリ上に展開(ロード) */ } else { puts("unknown.\n"); } } return 0; }
void* kzmem_alloc(int size) { int i; kzmem_block* mp; kzmem_pool* p; for(i=0; i<MEMORY_AREA_NUM; ++i){ p = &pool[i]; if(size <= (p->size - sizeof(kzmem_block))){ if(p->free == NULL){ kz_sysdown(); return NULL; } mp = p->free; p->free = p->free->next; mp->next = NULL; puts("kzmem_alloc: "); putxval(mp->size, 0); puts("\n"); return mp + 1; /* in back of header */ } } }
int main(void) { /* int c = 0;*/ /* int i = 0;*/ /* int data = 0;*/ /* IntVector *vec;*/ /* IntList *lst;*/ /* INTR_DISABLE;*/ init(); /* INTR_ENABLE;*/ puts("Hello, World!\n"); /* printval();*/ /* puts("overwrite variables.\n");*/ /* global_data++;*/ /* global_bss++;*/ /* static_data++;*/ /* static_bss++;*/ /* printval();*/ cmd_map(); #if 0 vec = IntVector_new(); /* lst = IntList_new();*/ while (1) { static char buf[32]; char *p; PRINTF0(">"); gets(buf, sizeof buf); p = strpbrk(buf, "\r\n"); if (p) *p = '\0'; PRINTF1("%s\n", buf); if (sw_is_on(SW1)) { led_on(LED1); i++; if (i > 100) { i = 0; if (IntVector_push_back(vec, data)) { PRINTF1("IntVector_push_back: %d", data); /* putdval(data, 0);*/ data++; PRINTF1(", IntVector_size: %d\n", IntVector_size(vec)); /* putdval(IntVector_size(vec), 0);*/ /* puts("\n");*/ } else { puts("IntVector_push_back: failed\n"); puts("IntVector_capacity: "); putdval(IntVector_capacity(vec), 0); puts(", IntVector_size: "); putdval(IntVector_size(vec), 0); puts("\n"); } } } else { led_off(LED1); } if (sw_is_on(SW2)) { if (!IntVector_empty(vec)) { puts("IntVector_back: "); putdval(*IntVector_back(vec), 0); puts(", IntVector_pop_back"); IntVector_pop_back(vec); puts("\n"); } } if (sw_is_on(SW5_8)) { led_on(LED2); } else { led_off(LED2); } if (sw_is_on(SW3)) { putxval(c++, 0); puts("\n"); } if (sw_is_on(SW4)) { putdval(c++, 0); puts("\n"); } } #endif return 0; }
int main(void) { static char buf[16]; static long size = -1; static unsigned char *loadbuf = NULL; static char *entry_point; void (*f)(void); extern int buffer_start; // バッファ領域を指すシンボル。リンカスクリプトで定義されている。 INTR_DISABLE; init(); puts("kzload (kozos boot loader) started.\n"); while (1) { puts("kzload> "); gets(buf); // シリアルからのコマンド受信。 if (!strcmp(buf, "load")) { // XMODEMでのダウンロード loadbuf = (char *)(&buffer_start); size = xmodem_recv(loadbuf); wait(); if (size < 0) { puts("\nXMODEM receive error!\n"); } else { puts("\nXMODEM receive succeeded.\n"); } } else if (!strcmp(buf, "dump")) { // メモリの16進ダンプ puts("size: "); putxval(size, 0); puts("\n"); dump(loadbuf, size); } else if (!strcmp(buf, "run")) { // ELF形式ファイルの実行 entry_point = elf_load(loadbuf); // メモリ上に展開 if (!entry_point) { puts("run error!\n"); } else { puts("starting from entry point: "); putxval((unsigned long)entry_point, 0); puts("\n"); f = (void (*)(void))entry_point; f(); // ロードしたプログラムに処理を渡す // ここには基本的に到達しない } } else { puts("unknown.\n"); } } printval(); puts("overwrite variables.\n"); global_data = 0x20; global_bss = 0x30; static_data = 0x40; static_bss = 0x50; printval(); while(1) ; return 0; }
/*! * XMODEMでの送信制御 * *bufp : 送信するログバッファポインタの先頭 * size : 送信するログサイズ * (返却値)TRUE : 成功 * (返却値)FALSE : 失敗 */ BOOL send_xmodem(UINT8 *bufp, UINT32 size) { /* * 送信データの終端のため,1つ余分にとる(サイズが128の倍数の場合) */ int cont = size / XMODEM_BLOCK_SIZE + 2; /* 送信するブロック数 */ int data = size; int data_len; /* ブロック内のデータ長 */ UINT8 recv_crd, block_number = 1; /* ブロック番号は1からスタート */ wait_xmodem(); /* 受信側のNAK待ち */ while (1) { /* 送信データ量の処理 */ if (128 < data) { data -= 128; data_len = 128; } else { data_len = data; } send_serial_byte(JIS_X_0211_SOH); /* データ送信開始の合図 */ write_xmodem_block(block_number, bufp, data_len); /* ブロック送信 */ recv_crd = recv_serial_byte(); /* 受信側から制御コードを受信 */ /* 引き続き送信する */ if (recv_crd == JIS_X_0211_ACK) { block_number++; /* 次のブロックへ */ bufp += XMODEM_BLOCK_SIZE; /* ログバッファポインタを更新 */ } /* 同じブロックの再送 */ else if (recv_crd == JIS_X_0211_NAK) { /* 処理なし(ブロック再送となる) */ } /* 中断(コンソールでCtrl-cが入力された場合) */ else if (recv_crd == JIS_X_0211_CAN) { send_serial_byte(JIS_X_0211_CAN); /* データ送信中断の合図 */ } /* ACKとNAK以外はエラーとする */ else { return FALSE; } /* 送信終了 */ if (block_number == (UINT8)cont) { send_serial_byte(JIS_X_0211_EOT); /* データ送信終了(ブロックの終了)の合図 */ recv_crd = recv_serial_byte(); /* 受信側から制御コードを受信 */ /* 受信側が正常ならば,ACKを受信 */ if (JIS_X_0211_ACK == recv_crd) { putxval((--block_number), 0); DEBUG_LEVEL1_OUTMSG(" out block number value : send_xmodem().\n"); return TRUE; } /* ACK以外をエラーとする */ else { return FALSE; } } } return FALSE; }