cregit-Linux how code gets into the kernel

Release 4.16 drivers/firmware/google/memconsole-x86-legacy.c

/*
 * memconsole-x86-legacy.c
 *
 * EBDA specific parts of the memory based BIOS console.
 *
 * Copyright 2017 Google Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License v2.0 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/dmi.h>
#include <linux/mm.h>
#include <asm/bios_ebda.h>
#include <linux/acpi.h>

#include "memconsole.h"


#define BIOS_MEMCONSOLE_V1_MAGIC	0xDEADBABE

#define BIOS_MEMCONSOLE_V2_MAGIC	(('M')|('C'<<8)|('O'<<16)|('N'<<24))


struct biosmemcon_ebda {
	
u32 signature;
	
union {
		
struct {
			
u8  enabled;
			
u32 buffer_addr;
			
u16 start;
			
u16 end;
			
u16 num_chars;
			
u8  wrapped;
		
} __packed v1;
		
struct {
			
u32 buffer_addr;
			/* Misdocumented as number of pages! */
			
u16 num_bytes;
			
u16 start;
			
u16 end;
		
} __packed v2;
	};

} __packed;


static char *memconsole_baseaddr;

static size_t memconsole_length;


static ssize_t memconsole_read(char *buf, loff_t pos, size_t count) { return memory_read_from_buffer(buf, count, &pos, memconsole_baseaddr, memconsole_length); }

Contributors

PersonTokensPropCommitsCommitProp
Julius Werner31100.00%1100.00%
Total31100.00%1100.00%


static void found_v1_header(struct biosmemcon_ebda *hdr) { pr_info("memconsole: BIOS console v1 EBDA structure found at %p\n", hdr); pr_info("memconsole: BIOS console buffer at 0x%.8x, start = %d, end = %d, num = %d\n", hdr->v1.buffer_addr, hdr->v1.start, hdr->v1.end, hdr->v1.num_chars); memconsole_baseaddr = phys_to_virt(hdr->v1.buffer_addr); memconsole_length = hdr->v1.num_chars; memconsole_setup(memconsole_read); }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande6287.32%150.00%
Julius Werner912.68%150.00%
Total71100.00%2100.00%


static void found_v2_header(struct biosmemcon_ebda *hdr) { pr_info("memconsole: BIOS console v2 EBDA structure found at %p\n", hdr); pr_info("memconsole: BIOS console buffer at 0x%.8x, start = %d, end = %d, num_bytes = %d\n", hdr->v2.buffer_addr, hdr->v2.start, hdr->v2.end, hdr->v2.num_bytes); memconsole_baseaddr = phys_to_virt(hdr->v2.buffer_addr + hdr->v2.start); memconsole_length = hdr->v2.end - hdr->v2.start; memconsole_setup(memconsole_read); }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande7489.16%150.00%
Julius Werner910.84%150.00%
Total83100.00%2100.00%

/* * Search through the EBDA for the BIOS Memory Console, and * set the global variables to point to it. Return true if found. */
static bool memconsole_ebda_init(void) { unsigned int address; size_t length, cur; address = get_bios_ebda(); if (!address) { pr_info("memconsole: BIOS EBDA non-existent.\n"); return false; } /* EBDA length is byte 0 of EBDA (in KB) */ length = *(u8 *)phys_to_virt(address); length <<= 10; /* convert to bytes */ /* * Search through EBDA for BIOS memory console structure * note: signature is not necessarily dword-aligned */ for (cur = 0; cur < length; cur++) { struct biosmemcon_ebda *hdr = phys_to_virt(address + cur); /* memconsole v1 */ if (hdr->signature == BIOS_MEMCONSOLE_V1_MAGIC) { found_v1_header(hdr); return true; } /* memconsole v2 */ if (hdr->signature == BIOS_MEMCONSOLE_V2_MAGIC) { found_v2_header(hdr); return true; } } pr_info("memconsole: BIOS console EBDA structure not found!\n"); return false; }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande129100.00%1100.00%
Total129100.00%1100.00%

static const struct dmi_system_id memconsole_dmi_table[] __initconst = { { .ident = "Google Board", .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "Google, Inc."), }, }, {} }; MODULE_DEVICE_TABLE(dmi, memconsole_dmi_table);
static bool __init memconsole_find(void) { if (!dmi_check_system(memconsole_dmi_table)) return false; return memconsole_ebda_init(); }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande24100.00%1100.00%
Total24100.00%1100.00%


static int __init memconsole_x86_init(void) { if (!memconsole_find()) return -ENODEV; return memconsole_sysfs_init(); }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande23100.00%1100.00%
Total23100.00%1100.00%


static void __exit memconsole_x86_exit(void) { memconsole_exit(); }

Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande12100.00%1100.00%
Total12100.00%1100.00%

module_init(memconsole_x86_init); module_exit(memconsole_x86_exit); MODULE_AUTHOR("Google, Inc."); MODULE_LICENSE("GPL");

Overall Contributors

PersonTokensPropCommitsCommitProp
Thierry Escande46788.61%133.33%
Julius Werner5811.01%133.33%
Christoph Hellwig20.38%133.33%
Total527100.00%3100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.