Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 9ef1fade in mainline


Ignore:
Timestamp:
2017-07-21T19:21:59Z (3 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
3009164
Parents:
9f64c1e
Message:

Support boot_args also for multiboot2 boots

Location:
kernel
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/boot/multiboot2.S

    r9f64c1e r9ef1fade  
    5454                .word MULTIBOOT2_FLAGS_REQUIRED
    5555                .long tag_info_req_end - tag_info_req_start
     56                .long MULTIBOOT2_TAG_CMDLINE
    5657                .long MULTIBOOT2_TAG_MODULE
    5758                .long MULTIBOOT2_TAG_MEMMAP
  • kernel/arch/ia32/src/boot/multiboot2.S

    r9f64c1e r9ef1fade  
    5252                .word MULTIBOOT2_FLAGS_REQUIRED
    5353                .long tag_info_req_end - tag_info_req_start
     54                .long MULTIBOOT2_TAG_CMDLINE
    5455                .long MULTIBOOT2_TAG_MODULE
    5556                .long MULTIBOOT2_TAG_MEMMAP
  • kernel/genarch/include/genarch/multiboot/multiboot2.h

    r9f64c1e r9ef1fade  
    5252#define MULTIBOOT2_TAG_MODULE_ALIGN   6
    5353
     54#define MULTIBOOT2_TAG_CMDLINE 1
    5455#define MULTIBOOT2_TAG_MODULE  3
    5556#define MULTIBOOT2_TAG_MEMMAP  6
     
    7374        uint32_t reserved;
    7475} __attribute__((packed)) multiboot2_info_t;
     76
     77/** Multiboot2 cmdline structure */
     78typedef struct {
     79        char string[0];
     80} __attribute__((packed)) multiboot2_cmdline_t;
    7581
    7682/** Multiboot2 modules structure */
     
    138144        uint32_t size;
    139145        union {
     146                multiboot2_cmdline_t cmdline;
    140147                multiboot2_module_t module;
    141148                multiboot2_memmap_t memmap;
  • kernel/genarch/src/multiboot/multiboot2.c

    r9f64c1e r9ef1fade  
    4141
    4242#define MULTIBOOT2_TAG_ALIGN  8
     43
     44static void multiboot2_cmdline(const multiboot2_cmdline_t *module)
     45{
     46        /*
     47         * GRUB passes the command line in an escaped form.
     48         */
     49        for (size_t i = 0, j = 0;
     50            module->string[i] && j < CONFIG_BOOT_ARGUMENTS_BUFLEN;
     51            i++, j++) {
     52                if (module->string[i] == '\\') {
     53                        switch (module->string[i + 1]) {
     54                        case '\\':
     55                        case '\'':
     56                        case '\"':
     57                                i++;
     58                                break;
     59                        }
     60                }
     61                bargs[j] = module->string[i];
     62        }
     63}
    4364
    4465static void multiboot2_module(const multiboot2_module_t *module)
     
    117138        while (tag->type != MULTIBOOT2_TAG_TERMINATOR) {
    118139                switch (tag->type) {
     140                case MULTIBOOT2_TAG_CMDLINE:
     141                        multiboot2_cmdline(&tag->cmdline);
     142                        break;
    119143                case MULTIBOOT2_TAG_MODULE:
    120144                        multiboot2_module(&tag->module);
Note: See TracChangeset for help on using the changeset viewer.