Skip to content

Commit

Permalink
powerpc/prom_init: Pass linux_banner to firmware via option vector 7
Browse files Browse the repository at this point in the history
Pass the value of linux_banner to firmware via option vector 7.

Option vector 7 is described in "LoPAR" Linux on Power Architecture
Reference v2.9, in table B.7 on page 824:

  An ASCII character formatted null terminated string that describes
  the client operating system. The string shall be human readable and
  may be displayed on the console.

The string can be up to 256 bytes total, including the nul terminator.

linux_banner contains lots of information, and should make it possible
to identify the exact kernel version that is running:

  const char linux_banner[] =
  "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
  LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";

For example:
  Linux version 4.15.0-144-generic (buildd@bos02-ppc64el-018) (gcc
  version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #148-Ubuntu SMP Sat May 8
  02:32:13 UTC 2021 (Ubuntu 4.15.0-144.148-generic 4.15.18)

It's also printed at boot to the console/dmesg, which should make it
possible to correlate what firmware receives with the console/dmesg on
the machine.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210621064938.2021419-2-mpe@ellerman.id.au
  • Loading branch information
Michael Ellerman committed Jun 24, 2021
1 parent f47d5a4 commit ffaacd9
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions arch/powerpc/kernel/prom_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <linux/initrd.h>
#include <linux/bitops.h>
#include <linux/pgtable.h>
#include <linux/printk.h>
#include <asm/prom.h>
#include <asm/rtas.h>
#include <asm/page.h>
Expand Down Expand Up @@ -944,6 +945,10 @@ struct option_vector6 {
u8 os_name;
} __packed;

struct option_vector7 {
u8 os_id[256];
} __packed;

struct ibm_arch_vec {
struct { u32 mask, val; } pvrs[14];

Expand All @@ -966,6 +971,9 @@ struct ibm_arch_vec {

u8 vec6_len;
struct option_vector6 vec6;

u8 vec7_len;
struct option_vector7 vec7;
} __packed;

static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = {
Expand Down Expand Up @@ -1112,6 +1120,9 @@ static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = {
.secondary_pteg = 0,
.os_name = OV6_LINUX,
},

/* option vector 7: OS Identification */
.vec7_len = VECTOR_LENGTH(sizeof(struct option_vector7)),
};

static struct ibm_arch_vec __prombss ibm_architecture_vec ____cacheline_aligned;
Expand Down Expand Up @@ -1340,6 +1351,8 @@ static void __init prom_check_platform_support(void)
memcpy(&ibm_architecture_vec, &ibm_architecture_vec_template,
sizeof(ibm_architecture_vec));

prom_strscpy_pad(ibm_architecture_vec.vec7.os_id, linux_banner, 256);

if (prop_len > 1) {
int i;
u8 vec[8];
Expand Down

0 comments on commit ffaacd9

Please sign in to comment.