fixed sparc atomics; added sparc newlib
[akaros.git] / kern / src / multiboot.c
1 #include <multiboot.h>
2 #include <arch/types.h>
3 #include <arch/mmu.h>
4 #include <arch/arch.h>
5 #include <ros/memlayout.h>
6 #include <stdio.h>
7
8 #ifdef __DEPUTY__
9 #pragma nodeputy
10 #endif
11
12 #ifdef __i386__
13 #include <arch/apic.h>
14 #endif
15
16 // These variables are set by i386_detect_memory()
17 physaddr_t maxpa;// Maximum physical address
18 physaddr_t maxaddrpa;    // Maximum directly addressable physical address
19 size_t npage;   // Amount of physical memory (in pages)
20 size_t naddrpage;       // Amount of addressable physical memory (in pages)
21 static size_t basemem;  // Amount of base memory (in bytes)
22 static size_t extmem;   // Amount of extended memory (in bytes)
23
24 void
25 multiboot_detect_memory(multiboot_info_t *mbi)
26 {
27         // Tells us how many kilobytes there are
28         basemem = ROUNDDOWN(mbi->mem_lower*1024, PGSIZE);
29         extmem = ROUNDDOWN(mbi->mem_upper*1024, PGSIZE);
30
31         // Calculate the maximum physical address based on whether
32         // or not there is any extended memory.  See comment in <inc/memlayout.h>
33         if (extmem)
34                 maxpa = EXTPHYSMEM + extmem;
35         else
36                 maxpa = basemem;
37
38         npage = maxpa / PGSIZE;
39
40         // IOAPIC - KERNBASE is the max amount of virtual addresses we can use
41         // for the physical memory mapping (aka - the KERNBASE mapping)
42         maxaddrpa = MIN(maxpa, IOAPIC_BASE - KERNBASE);
43
44         naddrpage = maxaddrpa / PGSIZE;
45
46         cprintf("Physical memory: %dK available, ", (int)(maxpa/1024));
47         cprintf("base = %dK, extended = %dK\n", (int)(basemem/1024), (int)(extmem/1024));
48         printk("Maximum directly addressable physical memory: %dK\n", (int)(maxaddrpa/1024));
49 }
50
51 void
52 multiboot_print_memory_map(multiboot_info_t *mbi) {
53         const char* memory_type[] = {"", "FREE", "RESERVED", "UNDEFINED", "UNDEFINED4"};
54
55
56         if(CHECK_FLAG(mbi->flags, 6)) {
57                 cprintf ("mmap_addr = 0x%x, mmap_length = 0x%x\n", (unsigned long)mbi->mmap_addr,
58                            (unsigned long)mbi->mmap_length);
59
60                 memory_map_t* mmap = (memory_map_t*) ((uint32_t)mbi->mmap_addr + KERNBASE);
61                 while((uint32_t)mmap < ((uint32_t)mbi->mmap_addr + KERNBASE) + mbi->mmap_length) {
62                         cprintf ("base = 0x%08x%08x, length = 0x%08x%08x, type = %s\n",
63                                 (unsigned) mmap->base_addr_high,
64                                 (unsigned) mmap->base_addr_low,
65                                 (unsigned) mmap->length_high,
66                                 (unsigned) mmap->length_low,
67                                 (unsigned) memory_type[mmap->type]);
68                         mmap = (memory_map_t*) ((uint32_t) mmap + mmap->size + sizeof (mmap->size));
69                 }
70         }
71 }
72