Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 31 → Rev 32

/SPARTAN/trunk/include/func.h
37,6 → 37,4
 
extern int strcmp(char *src, char *dst);
 
extern __address __u32_search(__address src, int cnt, __u32 x);
 
#endif
/SPARTAN/trunk/include/arch.h
41,6 → 41,7
 
extern void arch_pre_mm_init(void);
extern void arch_post_mm_init(void);
extern void arch_late_init(void);
extern void calibrate_delay_loop(void);
 
extern pri_t cpu_priority_high(void);
/SPARTAN/trunk/src/main/kinit.c
85,9 → 85,12
/*
* Now that all CPUs are up, we can report what we've found.
*/
for (i = 0; i < config.cpu_count; i++)
for (i = 0; i < config.cpu_count; i++) {
if (cpus[i].active)
cpu_print_report(&cpus[i]);
else
printf("cpu%d: not active\n", i);
}
 
#ifdef __SMP__
if (config.cpu_count > 1) {
/SPARTAN/trunk/src/main/main.c
115,9 → 115,7
printf("%L: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n",
config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024);
 
#ifdef __SMP__
mp_init(); /* Multiprocessor */
#endif /* __SMP__ */
arch_late_init();
printf("config.cpu_count=%d\n", config.cpu_count);
 
/SPARTAN/trunk/src/lib/func.c
59,15 → 59,3
}
return 1;
}
 
__address __u32_search(__address src, int cnt, __u32 x)
{
__u32 *base = (__u32 *) src;
int i;
for (i=0; i<=cnt-sizeof(__u32); i++)
if (base[i] == x)
return (__address) &base[i];
 
return 0;
}
/SPARTAN/trunk/src/mm/tlb.c
54,7 → 54,7
tlb_invalidate(0); /* TODO: use valid ASID */
busy_wait:
for (i = 0; i<config.cpu_active; i++)
for (i = 0; i<config.cpu_count; i++)
if (cpus[i].tlb_active)
goto busy_wait;
}
/SPARTAN/trunk/arch/mips/src/mips.c
53,3 → 53,7
void arch_post_mm_init(void)
{
}
 
void arch_late_init(void)
{
}
/SPARTAN/trunk/arch/ia32/include/acpi/acpi.h
73,4 → 73,6
 
extern void acpi_init(void);
 
static int rsdp_check(__u8 *rsdp);
 
#endif /* __ACPI_H__ */
/SPARTAN/trunk/arch/ia32/src/ia32.c
85,7 → 85,16
{
if (config.cpu_active == 1) {
ega_init(); /* video */
}
}
 
void arch_late_init()
{
if (config.cpu_active == 1) {
#ifdef __SMP__
acpi_init();
mp_init();
#endif /* __SMP__ */
}
}
 
/SPARTAN/trunk/arch/ia32/src/smp/mp.c
128,59 → 128,34
 
void mp_init(void)
{
__address addr, frame;
int cnt, n;
__u8 *addr[2] = { NULL, (__u8 *) 0xf0000 };
int i, j, length[2] = { 1024, 64*1024 };
 
/*
* EBDA can be undefined. In that case addr would be 0.
* Find MP Floating Pointer Structure
* 1a. search first 1K of EBDA
* 1b. if EBDA is undefined, search last 1K of base memory
* 2. search 64K starting at 0xf0000
*/
addr = ebda;
if (addr) {
cnt = 1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
 
addr[0] = (__u8 *) (ebda ? ebda : 639 * 1024);
for (i = 0; i < 2; i++) {
for (j = 0; j < length[i]; j += 16) {
if (*((__u32 *) &addr[i][j]) == FS_SIGNATURE && mp_fs_check(&addr[i][j])) {
fs = (struct __mpfs *) &addr[i][j];
goto fs_found;
addr++;
cnt--;
}
}
}
else {
/*
* Second place where the MP Floating Pointer Structure may live is the last
* kilobyte of base memory.
*/
addr = 639*1024;
cnt = 1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
goto fs_found;
addr++;
cnt--;
}
}
 
/*
* As the last resort, MP Floating Pointer Structure is searched in the BIOS
* ROM.
*/
addr = 0xf0000;
cnt = 64*1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
goto fs_found;
addr++;
cnt--;
}
 
return;
fs_found:
printf("%L: MP Floating Pointer Structure\n", addr);
printf("%L: MP Floating Pointer Structure\n", fs);
 
fs = (struct __mpfs *) addr;
frame_not_free((__address) fs);
 
if (fs->config_type == 0 && fs->configuration_table) {
if (fs->mpfib2 >> 7) {
printf("mp_init: PIC mode not supported\n");
/SPARTAN/trunk/arch/ia32/src/acpi/acpi.c
27,9 → 27,58
*/
 
#include <arch/acpi/acpi.h>
#include <arch/bios/bios.h>
 
#define RSDP_SIGNATURE "RSD PTR "
#define RSDP_REVISION_OFFS 15
 
struct acpi_rsdp *acpi_rsdp = NULL;
 
int rsdp_check(__u8 *rsdp) {
struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
__u8 sum = 0;
int i;
for (i=0; i<20; i++)
sum += rsdp[i];
if (sum)
return 0; /* bad checksum */
 
if (r->revision == 0)
return 1; /* ACPI 1.0 */
for (; i<r->length; i++)
sum += rsdp[i];
return !sum;
}
 
void acpi_init(void)
{
__u8 *addr[2] = { NULL, (__u8 *) 0xe0000 };
int i, j, length[2] = { 1024, 128*1024 };
__u64 *sig = (__u64 *) RSDP_SIGNATURE;
 
/*
* Find Root System Description Pointer
* 1. search first 1K of EBDA
* 2. search 128K starting at 0xe0000
*/
 
addr[0] = (__u8 *) ebda;
for (i = (ebda ? 0 : 1); i < 2; i++) {
for (j = 0; j < length[i]; j += 16) {
if (*((__u64 *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) {
acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
goto rsdp_found;
}
}
}
 
return;
 
rsdp_found:
printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);
}