Rev 1085 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
/*
* Copyright (C) 2000 Paolo Gai
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/*
* CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2002-09-02 09:37:45 $
*/
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/cbs.h"
#include "modules/dummy.h"
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include "modules/nopm.h"
#include "drivers/keyb.h"
#include <trace/trace.h>
#include <trace/queues.h>
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
/*+ sysyem tick in us +*/
#define TICK 1000
/*+ RR tick in us +*/
#define RRTICK 10000
TIME __kernel_register_levels__
(void *arg
)
{
struct multiboot_info
*mb
= (struct multiboot_info
*)arg
;
extern int __register_sub_init_prologue
(void);
extern int __register_sub_init
(void);
__register_sub_init_prologue
();
EDF_register_level
(EDF_ENABLE_ALL
);
RR_register_level
(RRTICK
, RR_MAIN_YES
, mb
);
CBS_register_level
(CBS_ENABLE_ALL
, 0);
dummy_register_level
();
SEM_register_module
();
CABS_register_module
();
PI_register_module
();
PC_register_module
();
NPP_register_module
();
SRP_register_module
();
NOP_register_module
();
NOPM_register_module
();
__register_sub_init
();
return TICK
;
}
TASK __init__
(void *arg
)
{
struct multiboot_info
*mb
= (struct multiboot_info
*)arg
;
KEYB_PARMS keyb
= BASE_KEYB
;
extern int __bdev_sub_init
(void);
extern int __fs_sub_init
(void);
extern void ctrlc_exit
(KEY_EVT
*k
);
HARTPORT_init
();
keyb_def_ctrlC
(keyb
, ctrlc_exit
);
KEYB_init
(&keyb
);
__bdev_sub_init
();
__fs_sub_init
();
__call_main__
(mb
);
return (void *)0;
}
#define PSCANSCHED 1
#define NOTRACE
int __register_sub_init_prologue
(void)
{
#ifndef NOTRACE
int id
;
TRC_init_phase1
(NULL
);
trc_register_fixed_queue
();
id
=trc_create_queue
(TRC_FIXED_QUEUE
,NULL
);
trc_trace_class
(TRC_CLASS_USER
);
trc_assign_class_to_queue
(TRC_CLASS_USER
,id
);
#endif
return 0;
}
int __register_sub_init
(void)
{
#if defined(EDFSCHED)
extern void BD_EDF_register_module
(void);
BD_EDF_register_module
();
#elif defined(PSCANSCHED)
extern void BD_PSCAN_register_module
(void);
BD_PSCAN_register_module
();
#endif
return 0;
}
dev_t root_device
=-1;
dev_t temp_device
=-1;
int choose_root_callback
(dev_t dev
,u_int8_t fs
)
{
if (fs
==FS_MSDOS
) return dev
;
return -1;
}
int choose_temp_callback
(__dev_t dev
,__uint8_t fs
)
{
static int flag
=0;
if (fs
==FS_MSDOS
) {
if (flag
) return dev
;
flag
=1;
}
return -1;
}
int __bdev_sub_init
(void)
{
BDEV_PARMS bdev
=BASE_BDEV
;
bdev_def_showinfo
(bdev
,FALSE
);
bdev_init
(&bdev
);
root_device
=bdev_scan_devices
(choose_root_callback
);
if (root_device
<0) {
cprintf
("can't find root device to mount on /!!!\n");
sys_end
();
return -1;
}
/*
temp_device=bdev_scan_devices(choose_temp_callback);
if (temp_device<0) {
cprintf("can't find a filesystem to mount on /TEMP!!!\n");
}
*/
return 0;
}
int __fs_sub_init
(void)
{
extern int libc_initialize
(void);
FILESYSTEM_PARMS fs
=BASE_FILESYSTEM
;
struct mount_opts opts
;
// int res;
filesystem_def_rootdevice
(fs
,root_device
);
filesystem_def_fs
(fs
,FS_MSDOS
);
filesystem_def_showinfo
(fs
,FALSE
);
filesystem_def_options
(fs
,opts
);
memset(&opts
,0,sizeof(struct mount_opts
));
opts.
flags=MOUNT_FLAG_RW
;
filesystem_init
(&fs
);
/*
if (temp_device>=0) {
memset(&opts,0,sizeof(struct mount_opts));
opts.flags=MOUNT_FLAG_RW;
res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
if (res!=0) {
cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
} else
cprintf("mounted /TEMP rw\n");
}
*/
libc_initialize
();
#ifndef NOTRACE
TRC_init_phase2
();
#endif
return 0;
}
void ctrlc_exit
(KEY_EVT
*k
)
{
extern void dump_sem_table
(void);
extern void dump_nop_table
(void);
#ifndef NOGRX
grx_close
();
#endif
cprintf
("CTRL-C pressed!\n");
sys_end
();
}