6c47bc6da35b29d0f56fc66c6304c3d396fdfe42
[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 *NTS memory_type[] = {"", "FREE", "RESERVED", "UNDEFINED", "UNDEFINED4"};
54
55
56         if(CHECK_FLAG(mbi->flags, 6)) {
57                 memory_map_t *SNT mmap_b =
58                         (memory_map_t *SNT)(mbi->mmap_addr + KERNBASE);
59                 memory_map_t *SNT mmap_e =
60                         (memory_map_t *SNT)(mbi->mmap_addr + KERNBASE + mbi->mmap_length);
61                 memory_map_t *BND(mmap_b, mmap_e) mmap = TC(mmap_b);
62
63                 cprintf ("mmap_addr = 0x%x, mmap_length = 0x%x\n", (unsigned long)mbi->mmap_addr,
64                            (unsigned long)mbi->mmap_length);
65
66                 while(mmap < mmap_e) {
67                         cprintf ("base = 0x%08x%08x, length = 0x%08x%08x, type = %s\n",
68                                 (unsigned) mmap->base_addr_high,
69                                 (unsigned) mmap->base_addr_low,
70                                 (unsigned) mmap->length_high,
71                                 (unsigned) mmap->length_low,
72                                 (unsigned) memory_type[mmap->type]);
73                         mmap = (char *)mmap + mmap->size + sizeof(mmap->size);
74                 }
75         }
76 }
77