| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * kernel/configs.c |
|---|
| 3 | 4 | * Echo the kernel .config file used to build the kernel |
|---|
| .. | .. |
|---|
| 6 | 7 | * Copyright (C) 2002 Randy Dunlap <rdunlap@xenotime.net> |
|---|
| 7 | 8 | * Copyright (C) 2002 Al Stone <ahs3@fc.hp.com> |
|---|
| 8 | 9 | * Copyright (C) 2002 Hewlett-Packard Company |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 11 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 12 | | - * the Free Software Foundation; either version 2 of the License, or (at |
|---|
| 13 | | - * your option) any later version. |
|---|
| 14 | | - * |
|---|
| 15 | | - * This program is distributed in the hope that it will be useful, but |
|---|
| 16 | | - * WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 17 | | - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or |
|---|
| 18 | | - * NON INFRINGEMENT. See the GNU General Public License for more |
|---|
| 19 | | - * details. |
|---|
| 20 | | - * |
|---|
| 21 | | - * You should have received a copy of the GNU General Public License |
|---|
| 22 | | - * along with this program; if not, write to the Free Software |
|---|
| 23 | | - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|---|
| 24 | 10 | */ |
|---|
| 25 | 11 | |
|---|
| 26 | 12 | #include <linux/kernel.h> |
|---|
| .. | .. |
|---|
| 30 | 16 | #include <linux/init.h> |
|---|
| 31 | 17 | #include <linux/uaccess.h> |
|---|
| 32 | 18 | |
|---|
| 33 | | -/**************************************************/ |
|---|
| 34 | | -/* the actual current config file */ |
|---|
| 35 | | - |
|---|
| 36 | 19 | /* |
|---|
| 37 | | - * Define kernel_config_data and kernel_config_data_size, which contains the |
|---|
| 38 | | - * wrapped and compressed configuration file. The file is first compressed |
|---|
| 39 | | - * with gzip and then bounded by two eight byte magic numbers to allow |
|---|
| 40 | | - * extraction from a binary kernel image: |
|---|
| 41 | | - * |
|---|
| 42 | | - * IKCFG_ST |
|---|
| 43 | | - * <image> |
|---|
| 44 | | - * IKCFG_ED |
|---|
| 20 | + * "IKCFG_ST" and "IKCFG_ED" are used to extract the config data from |
|---|
| 21 | + * a binary kernel image or a module. See scripts/extract-ikconfig. |
|---|
| 45 | 22 | */ |
|---|
| 46 | | -#define MAGIC_START "IKCFG_ST" |
|---|
| 47 | | -#define MAGIC_END "IKCFG_ED" |
|---|
| 48 | | -#include "config_data.h" |
|---|
| 49 | | - |
|---|
| 50 | | - |
|---|
| 51 | | -#define MAGIC_SIZE (sizeof(MAGIC_START) - 1) |
|---|
| 52 | | -#define kernel_config_data_size \ |
|---|
| 53 | | - (sizeof(kernel_config_data) - 1 - MAGIC_SIZE * 2) |
|---|
| 23 | +asm ( |
|---|
| 24 | +" .pushsection .rodata, \"a\" \n" |
|---|
| 25 | +" .ascii \"IKCFG_ST\" \n" |
|---|
| 26 | +" .global kernel_config_data \n" |
|---|
| 27 | +"kernel_config_data: \n" |
|---|
| 28 | +" .incbin \"kernel/config_data.gz\" \n" |
|---|
| 29 | +" .global kernel_config_data_end \n" |
|---|
| 30 | +"kernel_config_data_end: \n" |
|---|
| 31 | +" .ascii \"IKCFG_ED\" \n" |
|---|
| 32 | +" .popsection \n" |
|---|
| 33 | +); |
|---|
| 54 | 34 | |
|---|
| 55 | 35 | #ifdef CONFIG_IKCONFIG_PROC |
|---|
| 36 | + |
|---|
| 37 | +extern char kernel_config_data; |
|---|
| 38 | +extern char kernel_config_data_end; |
|---|
| 56 | 39 | |
|---|
| 57 | 40 | static ssize_t |
|---|
| 58 | 41 | ikconfig_read_current(struct file *file, char __user *buf, |
|---|
| 59 | 42 | size_t len, loff_t * offset) |
|---|
| 60 | 43 | { |
|---|
| 61 | 44 | return simple_read_from_buffer(buf, len, offset, |
|---|
| 62 | | - kernel_config_data + MAGIC_SIZE, |
|---|
| 63 | | - kernel_config_data_size); |
|---|
| 45 | + &kernel_config_data, |
|---|
| 46 | + &kernel_config_data_end - |
|---|
| 47 | + &kernel_config_data); |
|---|
| 64 | 48 | } |
|---|
| 65 | 49 | |
|---|
| 66 | | -static const struct file_operations ikconfig_file_ops = { |
|---|
| 67 | | - .owner = THIS_MODULE, |
|---|
| 68 | | - .read = ikconfig_read_current, |
|---|
| 69 | | - .llseek = default_llseek, |
|---|
| 50 | +static const struct proc_ops config_gz_proc_ops = { |
|---|
| 51 | + .proc_read = ikconfig_read_current, |
|---|
| 52 | + .proc_lseek = default_llseek, |
|---|
| 70 | 53 | }; |
|---|
| 71 | 54 | |
|---|
| 72 | 55 | static int __init ikconfig_init(void) |
|---|
| .. | .. |
|---|
| 75 | 58 | |
|---|
| 76 | 59 | /* create the current config file */ |
|---|
| 77 | 60 | entry = proc_create("config.gz", S_IFREG | S_IRUGO, NULL, |
|---|
| 78 | | - &ikconfig_file_ops); |
|---|
| 61 | + &config_gz_proc_ops); |
|---|
| 79 | 62 | if (!entry) |
|---|
| 80 | 63 | return -ENOMEM; |
|---|
| 81 | 64 | |
|---|
| 82 | | - proc_set_size(entry, kernel_config_data_size); |
|---|
| 65 | + proc_set_size(entry, &kernel_config_data_end - &kernel_config_data); |
|---|
| 83 | 66 | |
|---|
| 84 | 67 | return 0; |
|---|
| 85 | 68 | } |
|---|