genode/base-fiasco/src/platform/arm/_main.cc

125 lines
2.8 KiB
C++

/**
* \brief Startup code for Fiasco/ARM
* \author Norman Feske
* \date 2007-04-30
*
* Call constructors for static objects before calling main().
*/
/*
* Copyright (C) 2007-2012 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
namespace Fiasco {
#include <l4/sys/kdebug.h>
}
/* Genode */
#include <base/crt0.h>
#include <base/env.h>
#include <base/sleep.h>
#include <base/printf.h>
namespace Genode {
/**
* Return constructed parent capability
*/
Parent_capability parent_cap()
{
Fiasco::l4_threadid_t tid = *(Fiasco::l4_threadid_t *)&_parent_cap_thread_id;
return Parent_capability(Native_capability(tid, _parent_cap_local_name));
}
}
using namespace Genode;
/***************
** C++ stuff **
***************/
/*
* This symbol must be defined when exception
* headers are defined in the linker script.
*/
extern "C" __attribute__((weak)) void *__gxx_personality_v0(void)
{
Fiasco::outstring("What a surprise! This function is really used? Sorry - not implemented\n");
return 0;
}
/**
* Resolve symbols needed by libsupc++ to make
* the linker happy.
*
* FIXME: implement us!
*/
extern "C" __attribute__((weak)) int atexit(void) {
Fiasco::outstring("atexit() called - not implemented!\n");
return 0;
};
extern "C" __attribute__((weak)) int memcmp(void) {
Fiasco::outstring("memcmp() called - not implemented!\n");
return 0;
};
extern "C" __attribute__((weak)) int strncmp(void) {
Fiasco::outstring("strncmp() called - not implemented!\n");
return 0;
};
extern int main(int argc, char **argv);
extern void init_exception_handling(); /* implemented in base/cxx */
/* FIXME no support for commandline
* ask parent for argc and argv */
static char argv0[] = { '_', 'm', 'a', 'i', 'n'};
static char *argv[1] = { argv0 };
/*
* Define 'environ' pointer that is supposed to be exported by
* the startup code and relied on by any libC. Because we have no
* UNIX environment, however, we set this pointer to NULL.
*/
__attribute__((weak)) char **environ = (char **)0;
/**
* C entry function called by the crt0 startup code
*/
extern "C" int _main()
{
/* call constructors for static objects */
void (**func)();
for (func = &_ctors_end; func != &_ctors_start; (*--func)());
/* initialize exception handling */
init_exception_handling();
/* completely map program image by touching all pages read-only */
volatile const char *beg, *end;
beg = (const char *)(((unsigned)&_prog_img_beg) & L4_PAGEMASK);
end = (const char *)&_prog_img_end;
for ( ; beg < end; beg += L4_PAGESIZE) (void)(*beg);
/* call real main function */
/* XXX no support for commandline */
int ret = main(1, argv);
/* inform parent about program exit */
env()->parent()->exit(ret);
PDBG("main() returned %d", ret);
sleep_forever();
return ret;
}