mirror of
https://github.com/tailix/kernel.git
synced 2025-04-14 17:33:13 -04:00
tmp
This commit is contained in:
parent
6290d80b25
commit
40dd65e007
2 changed files with 423 additions and 5 deletions
153
arch/main.c
153
arch/main.c
|
@ -38,23 +38,166 @@ void main(unsigned int multiboot_magic, unsigned long multiboot_info)
|
|||
}
|
||||
|
||||
#include "console.h"
|
||||
#include "multiboot2.h"
|
||||
|
||||
#define COLUMNS 80
|
||||
#define LINES 24
|
||||
#define ATTRIBUTE 7
|
||||
#define VIDEO 0xB8000
|
||||
|
||||
static int xpos;
|
||||
static int ypos;
|
||||
|
||||
static volatile unsigned char *video;
|
||||
|
||||
static void itoa(char *buf, int base, int d);
|
||||
static void printf(const char *format, ...);
|
||||
|
||||
void print_multiboot2_info(unsigned long addr)
|
||||
{
|
||||
struct multiboot_tag *tag;
|
||||
unsigned size;
|
||||
|
||||
logger_info("Multiboot 2 info:");
|
||||
|
||||
if (addr & 7)
|
||||
{
|
||||
printf ("Unaligned mbi: 0x%x\n", addr);
|
||||
return;
|
||||
}
|
||||
size = *(unsigned *) addr;
|
||||
printf ("Announced mbi size 0x%x\n", size);
|
||||
for (tag = (struct multiboot_tag *) (addr + 8);
|
||||
tag->type != MULTIBOOT_TAG_TYPE_END;
|
||||
tag = (struct multiboot_tag *) ((multiboot_uint8_t *) tag
|
||||
+ ((tag->size + 7) & ~7)))
|
||||
{
|
||||
printf ("Tag 0x%x, Size 0x%x\n", tag->type, tag->size);
|
||||
switch (tag->type)
|
||||
{
|
||||
case MULTIBOOT_TAG_TYPE_CMDLINE:
|
||||
printf ("Command line = %s\n",
|
||||
((struct multiboot_tag_string *) tag)->string);
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
|
||||
printf ("Boot loader name = %s\n",
|
||||
((struct multiboot_tag_string *) tag)->string);
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_MODULE:
|
||||
printf ("Module at 0x%x-0x%x. Command line %s\n",
|
||||
((struct multiboot_tag_module *) tag)->mod_start,
|
||||
((struct multiboot_tag_module *) tag)->mod_end,
|
||||
((struct multiboot_tag_module *) tag)->cmdline);
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
|
||||
printf ("mem_lower = %uKB, mem_upper = %uKB\n",
|
||||
((struct multiboot_tag_basic_meminfo *) tag)->mem_lower,
|
||||
((struct multiboot_tag_basic_meminfo *) tag)->mem_upper);
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_BOOTDEV:
|
||||
printf ("Boot device 0x%x,%u,%u\n",
|
||||
((struct multiboot_tag_bootdev *) tag)->biosdev,
|
||||
((struct multiboot_tag_bootdev *) tag)->slice,
|
||||
((struct multiboot_tag_bootdev *) tag)->part);
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_MMAP:
|
||||
{
|
||||
multiboot_memory_map_t *mmap;
|
||||
printf ("mmap\n");
|
||||
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;
|
||||
(multiboot_uint8_t *) mmap
|
||||
< (multiboot_uint8_t *) tag + tag->size;
|
||||
mmap = (multiboot_memory_map_t *)
|
||||
((unsigned long) mmap
|
||||
+ ((struct multiboot_tag_mmap *) tag)->entry_size))
|
||||
printf (" base_addr = 0x%x%x,"
|
||||
" length = 0x%x%x, type = 0x%x\n",
|
||||
(unsigned) (mmap->addr >> 32),
|
||||
(unsigned) (mmap->addr & 0xffffffff),
|
||||
(unsigned) (mmap->len >> 32),
|
||||
(unsigned) (mmap->len & 0xffffffff),
|
||||
(unsigned) mmap->type);
|
||||
}
|
||||
break;
|
||||
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
|
||||
{
|
||||
multiboot_uint32_t color;
|
||||
unsigned i;
|
||||
struct multiboot_tag_framebuffer *tagfb
|
||||
= (struct multiboot_tag_framebuffer *) tag;
|
||||
void *fb = (void *) (unsigned long) tagfb->common.framebuffer_addr;
|
||||
switch (tagfb->common.framebuffer_type)
|
||||
{
|
||||
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
|
||||
{
|
||||
unsigned best_distance, distance;
|
||||
struct multiboot_color *palette;
|
||||
palette = tagfb->framebuffer_palette;
|
||||
color = 0;
|
||||
best_distance = 4*256*256;
|
||||
for (i = 0; i < tagfb->framebuffer_palette_num_colors; i++)
|
||||
{
|
||||
distance = (0xff - palette[i].blue)
|
||||
* (0xff - palette[i].blue)
|
||||
+ palette[i].red * palette[i].red
|
||||
+ palette[i].green * palette[i].green;
|
||||
if (distance < best_distance)
|
||||
{
|
||||
color = i;
|
||||
best_distance = distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
|
||||
color = ((1 << tagfb->framebuffer_blue_mask_size) - 1)
|
||||
<< tagfb->framebuffer_blue_field_position;
|
||||
break;
|
||||
case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
|
||||
color = '\\' | 0x0100;
|
||||
break;
|
||||
default:
|
||||
color = 0xffffffff;
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < tagfb->common.framebuffer_width
|
||||
&& i < tagfb->common.framebuffer_height; i++)
|
||||
{
|
||||
switch (tagfb->common.framebuffer_bpp)
|
||||
{
|
||||
case 8:
|
||||
{
|
||||
multiboot_uint8_t *pixel = fb
|
||||
+ tagfb->common.framebuffer_pitch * i + i;
|
||||
*pixel = color;
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
case 16:
|
||||
{
|
||||
multiboot_uint16_t *pixel
|
||||
= fb + tagfb->common.framebuffer_pitch * i + 2 * i;
|
||||
*pixel = color;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
{
|
||||
multiboot_uint32_t *pixel
|
||||
= fb + tagfb->common.framebuffer_pitch * i + 3 * i;
|
||||
*pixel = (color & 0xffffff) | (*pixel & 0xff000000);
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
{
|
||||
multiboot_uint32_t *pixel
|
||||
= fb + tagfb->common.framebuffer_pitch * i + 4 * i;
|
||||
*pixel = color;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tag = (struct multiboot_tag *) ((multiboot_uint8_t *) tag
|
||||
+ ((tag->size + 7) & ~7));
|
||||
printf ("Total mbi size 0x%x\n", (unsigned) tag - addr);
|
||||
}
|
||||
|
||||
void itoa(char *buf, int base, int d)
|
||||
|
|
275
arch/multiboot2.h
Normal file
275
arch/multiboot2.h
Normal file
|
@ -0,0 +1,275 @@
|
|||
#ifndef MULTIBOOT_HEADER
|
||||
#define MULTIBOOT_HEADER 1
|
||||
|
||||
/*
|
||||
* How many bytes from the start of the file we search for the header.
|
||||
* */
|
||||
#define MULTIBOOT_SEARCH 32768
|
||||
#define MULTIBOOT_HEADER_ALIGN 8
|
||||
/*
|
||||
* The magic field should contain this.
|
||||
* */
|
||||
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
|
||||
/*
|
||||
* This should be in %eax.
|
||||
* */
|
||||
#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
|
||||
/*
|
||||
* Alignment of multiboot modules.
|
||||
* */
|
||||
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||
/*
|
||||
* Alignment of the multiboot info structure.
|
||||
* */
|
||||
#define MULTIBOOT_INFO_ALIGN 0x00000008
|
||||
/*
|
||||
* Flags set in the ’flags’ member of the multiboot header.
|
||||
* */
|
||||
#define MULTIBOOT_TAG_ALIGN 8
|
||||
#define MULTIBOOT_TAG_TYPE_END 0
|
||||
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
|
||||
#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
|
||||
#define MULTIBOOT_TAG_TYPE_MODULE 3
|
||||
#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
|
||||
#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
|
||||
#define MULTIBOOT_TAG_TYPE_MMAP 6
|
||||
#define MULTIBOOT_TAG_TYPE_VBE 7
|
||||
#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
|
||||
#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
|
||||
#define MULTIBOOT_TAG_TYPE_APM 10
|
||||
#define MULTIBOOT_HEADER_TAG_END 0
|
||||
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
|
||||
#define MULTIBOOT_HEADER_TAG_ADDRESS 2
|
||||
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
|
||||
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
|
||||
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
|
||||
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
|
||||
#define MULTIBOOT_ARCHITECTURE_I386 0
|
||||
#define MULTIBOOT_ARCHITECTURE_MIPS32 4
|
||||
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
|
||||
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
|
||||
#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
|
||||
#ifndef ASM_FILE
|
||||
typedef unsigned char multiboot_uint8_t;
|
||||
typedef unsigned short multiboot_uint16_t;
|
||||
typedef unsigned int multiboot_uint32_t;
|
||||
typedef unsigned long long multiboot_uint64_t;
|
||||
struct multiboot_header
|
||||
{
|
||||
/*
|
||||
* Must be MULTIBOOT
|
||||
* MAGIC - see above.
|
||||
* */
|
||||
multiboot_uint32_t magic;
|
||||
/*
|
||||
* ISA
|
||||
* */
|
||||
multiboot_uint32_t architecture;
|
||||
/*
|
||||
* Total header length.
|
||||
* */
|
||||
multiboot_uint32_t header_length;
|
||||
/*
|
||||
* The above fields plus this one must equal 0 mod 2
|
||||
* ^
|
||||
* 32.
|
||||
* */
|
||||
multiboot_uint32_t checksum;
|
||||
};
|
||||
struct multiboot_header_tag
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
};
|
||||
struct multiboot_header_tag_information_request
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t requests[0];
|
||||
};
|
||||
struct multiboot_header_tag_address
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t header_addr;
|
||||
multiboot_uint32_t load_addr;
|
||||
multiboot_uint32_t load_end_addr;
|
||||
multiboot_uint32_t bss_end_addr;
|
||||
};
|
||||
struct multiboot_header_tag_entry_address
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t entry_addr;
|
||||
};
|
||||
struct multiboot_header_tag_console_flags
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t console_flags;
|
||||
};
|
||||
struct multiboot_header_tag_framebuffer
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t width;
|
||||
multiboot_uint32_t height;
|
||||
multiboot_uint32_t depth;
|
||||
};
|
||||
struct multiboot_header_tag_module_align
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t width;
|
||||
multiboot_uint32_t height;
|
||||
multiboot_uint32_t depth;
|
||||
};
|
||||
struct multiboot_color
|
||||
{
|
||||
multiboot_uint8_t red;
|
||||
multiboot_uint8_t green;
|
||||
multiboot_uint8_t blue;
|
||||
};
|
||||
struct multiboot_mmap_entry
|
||||
{
|
||||
multiboot_uint64_t addr;
|
||||
multiboot_uint64_t len;
|
||||
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
||||
#define MULTIBOOT_MEMORY_RESERVED 2
|
||||
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
||||
#define MULTIBOOT_MEMORY_NVS 4
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t zero;
|
||||
} __attribute__((packed));
|
||||
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
||||
struct multiboot_tag
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
};
|
||||
struct multiboot_tag_string
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
char string[0];
|
||||
};
|
||||
struct multiboot_tag_module
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t mod_start;
|
||||
multiboot_uint32_t mod_end;
|
||||
char cmdline[0];
|
||||
};
|
||||
struct multiboot_tag_basic_meminfo
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t mem_lower;
|
||||
multiboot_uint32_t mem_upper;
|
||||
};
|
||||
struct multiboot_tag_bootdev
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t biosdev;
|
||||
multiboot_uint32_t slice;
|
||||
multiboot_uint32_t part;
|
||||
};
|
||||
struct multiboot_tag_mmap
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t entry_size;
|
||||
multiboot_uint32_t entry_version;
|
||||
struct multiboot_mmap_entry entries[0];
|
||||
};
|
||||
struct multiboot_vbe_info_block
|
||||
{
|
||||
multiboot_uint8_t external_specification[512];
|
||||
};
|
||||
struct multiboot_vbe_mode_info_block
|
||||
{
|
||||
multiboot_uint8_t external_specification[256];
|
||||
};
|
||||
struct multiboot_tag_vbe
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint16_t vbe_mode;
|
||||
multiboot_uint16_t vbe_interface_seg;
|
||||
multiboot_uint16_t vbe_interface_off;
|
||||
multiboot_uint16_t vbe_interface_len;
|
||||
struct multiboot_vbe_info_block vbe_control_info;
|
||||
struct multiboot_vbe_mode_info_block vbe_mode_info;
|
||||
};
|
||||
struct multiboot_tag_framebuffer_common
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint64_t framebuffer_addr;
|
||||
multiboot_uint32_t framebuffer_pitch;
|
||||
multiboot_uint32_t framebuffer_width;
|
||||
multiboot_uint32_t framebuffer_height;
|
||||
multiboot_uint8_t framebuffer_bpp;
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
||||
multiboot_uint8_t framebuffer_type;
|
||||
multiboot_uint16_t reserved;
|
||||
};
|
||||
struct multiboot_tag_framebuffer
|
||||
{
|
||||
struct multiboot_tag_framebuffer_common common;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||
struct multiboot_color framebuffer_palette[0];
|
||||
};
|
||||
struct
|
||||
{
|
||||
multiboot_uint8_t framebuffer_red_field_position;
|
||||
multiboot_uint8_t framebuffer_red_mask_size;
|
||||
multiboot_uint8_t framebuffer_green_field_position;
|
||||
multiboot_uint8_t framebuffer_green_mask_size;
|
||||
multiboot_uint8_t framebuffer_blue_field_position;
|
||||
multiboot_uint8_t framebuffer_blue_mask_size;
|
||||
};
|
||||
};
|
||||
};
|
||||
struct multiboot_tag_elf_sections
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t num;
|
||||
multiboot_uint32_t entsize;
|
||||
multiboot_uint32_t shndx;
|
||||
char sections[0];
|
||||
};
|
||||
struct multiboot_tag_apm
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint16_t version;
|
||||
multiboot_uint16_t cseg;
|
||||
multiboot_uint32_t offset;
|
||||
multiboot_uint16_t cseg_16;
|
||||
multiboot_uint16_t dseg;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint16_t cseg_len;
|
||||
multiboot_uint16_t cseg_16_len;
|
||||
multiboot_uint16_t dseg_len;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Add table
Reference in a new issue