Compiles with GCC
[akaros.git] / kern / src / multiboot.c
1 #ifdef __SHARC__
2 #pragma nosharc
3 #endif
4
5 #include <multiboot.h>
6 #include <ros/common.h>
7 #include <arch/mmu.h>
8 #include <arch/arch.h>
9 #include <ros/memlayout.h>
10 #include <stdio.h>
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 in the system
18 physaddr_t maxaddrpa;  // Maximum addressable physical address
19 void *SNT maxaddrpa_ptr;
20 size_t npages;         // Total number of physical memory pages
21 size_t naddrpages;        // Number of addressable physical memory pages
22
23 static size_t basemem;  // Amount of base memory (in bytes)
24 static size_t extmem;   // Amount of extended memory (in bytes)
25
26 void
27 multiboot_detect_memory(multiboot_info_t *mbi)
28 {
29         // Tells us how many kilobytes there are
30         basemem = ROUNDDOWN(mbi->mem_lower*1024, PGSIZE);
31         extmem = ROUNDDOWN(mbi->mem_upper*1024, PGSIZE);
32
33         // Calculate the maximum physical address based on whether
34         // or not there is any extended memory.  See comment in <inc/memlayout.h>
35         if (extmem)
36                 maxpa = EXTPHYSMEM + extmem;
37         else
38                 maxpa = basemem;
39
40         npages = maxpa / PGSIZE;
41
42         // IOAPIC - KERNBASE is the max amount of virtual addresses we can use
43         // for the physical memory mapping (aka - the KERNBASE mapping)
44         maxaddrpa = MIN(maxpa, IOAPIC_BASE - KERNBASE);
45         maxaddrpa_ptr = (void *SNT)maxaddrpa;
46
47         naddrpages = maxaddrpa / PGSIZE;
48
49         cprintf("Physical memory: %dK available, ", (int)(maxpa/1024));
50         cprintf("base = %dK, extended = %dK\n", (int)(basemem/1024), (int)(extmem/1024));
51         printk("Maximum directly addressable physical memory: %dK\n", (int)(maxaddrpa/1024));
52 }
53
54 void
55 multiboot_print_memory_map(multiboot_info_t *mbi) {
56         const char *NTS memory_type[] = {"", "FREE", "RESERVED", "UNDEFINED", "UNDEFINED4"};
57
58
59         if(CHECK_FLAG(mbi->flags, 6)) {
60                 memory_map_t *SNT mmap_b =
61                         (memory_map_t *SNT)(mbi->mmap_addr + KERNBASE);
62                 memory_map_t *SNT mmap_e =
63                         (memory_map_t *SNT)(mbi->mmap_addr + KERNBASE + mbi->mmap_length);
64                 memory_map_t *BND(mmap_b, mmap_e) mmap = TC(mmap_b);
65
66                 cprintf ("mmap_addr = 0x%x, mmap_length = 0x%x\n", (unsigned long)mbi->mmap_addr,
67                            (unsigned long)mbi->mmap_length);
68
69                 while(mmap < mmap_e) {
70                         cprintf ("base = 0x%08x%08x, length = 0x%08x%08x, type = %s\n",
71                                 (unsigned) mmap->base_addr_high,
72                                 (unsigned) mmap->base_addr_low,
73                                 (unsigned) mmap->length_high,
74                                 (unsigned) mmap->length_low,
75                                 (unsigned) memory_type[mmap->type]);
76                         mmap = (memory_map_t *BND(mmap_b,mmap_e))((char *BND(mmap_b,mmap_e))mmap + mmap->size + sizeof(mmap->size));
77                 }
78         }
79 }
80