Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
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");
}
Esempio n. 4
0
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;
}
Esempio n. 5
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);
}
Esempio n. 6
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> ");   /* 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;
}
Esempio n. 7
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;
}
Esempio n. 8
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;
}
Esempio n. 9
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;
}
Esempio n. 10
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;
}
Esempio n. 11
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;
}
Esempio n. 12
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;
}
Esempio n. 13
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;
}
Esempio n. 14
0
File: dram.c Progetto: katono/kozos
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;
}
Esempio n. 15
0
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");
    }
}
Esempio n. 16
0
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(); /* ここで,ロードしたプログラムに処理を渡す */
        /* ここには返ってこない */
    }
}
Esempio n. 17
0
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;
}
Esempio n. 18
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;
}
Esempio n. 19
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;
}
Esempio n. 20
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;
}
Esempio n. 21
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;
}
Esempio n. 22
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();
}
Esempio n. 23
0
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;
}
Esempio n. 24
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 */
        }
    }
}
Esempio n. 25
0
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;
}
Esempio n. 26
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;
}
Esempio n. 27
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;
}