From: Keith Owens <kaos@sgi.com>
To: linux-ia64@vger.kernel.org
Subject: [patch 4/4] kernel salinfo changes
Date: Thu, 30 Oct 2003 08:43:11 +0000 [thread overview]
Message-ID: <marc-linux-ia64-106750344518501@msgid-missing> (raw)
patch 4 - Not to be added to the kernel yet. This is an example of
decoding the oem data via kernel/prom.
--- 2.4.23-pre8-cset-1.1069.1.143-to-1.1108/arch/ia64/sn/kernel/mca.c Tue Aug 26 09:46:18 2003
+++ lbs/linux/arch/ia64/sn/kernel/mca.c Thu Oct 30 15:43:51 2003
@@ -36,6 +36,8 @@
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/timer.h>
+#include <linux/vmalloc.h>
+#include <asm/machvec.h>
#include <asm/mca.h>
#include <asm/sal.h>
#include <asm/sn/sn_sal.h>
@@ -53,6 +55,42 @@
struct timer_list sn_cpei_timer;
void sn_init_cpei_timer(void);
+/* Printing oemdata from mca uses data that is not passed through SAL, it is
+ * global. Only one user at a time.
+ */
+static DECLARE_MUTEX(sn_oemdata_mutex);
+static prfunc_t sn_oemdata_prfunc;
+static u8 **sn_oemdata;
+static u64 *sn_oemdata_size, sn_oemdata_bufsize;
+
+/* Called as the "printk" routine via sn_platform_plat_specific_err_print,
+ * ia64_sn_plat_specific_err_print through SAL to print_hook. It only handles
+ * a print of '"%s", buf'. buf is appended to sn_oemdata, resizing as required.
+ */
+static int
+sn_oemdata_print(const char *fmt, ...)
+{
+ va_list args;
+ char *buf;
+ int len;
+ va_start(args, fmt);
+ buf = va_arg(args, char *);
+ va_end(args);
+ len = strlen(buf);
+ while (*sn_oemdata_size + len + 1 > sn_oemdata_bufsize) {
+ u8 *newbuf = vmalloc(sn_oemdata_bufsize += 1000);
+ if (!newbuf) {
+ printk(KERN_ERR "%s: unable to extend sn_oemdata\n", __FUNCTION__);
+ return 0;
+ }
+ memcpy(newbuf, *sn_oemdata, *sn_oemdata_size);
+ vfree(*sn_oemdata);
+ *sn_oemdata = newbuf;
+ }
+ memcpy(*sn_oemdata + *sn_oemdata_size, buf, len + 1);
+ *sn_oemdata_size += len;
+ return len;
+}
/*
* print_hook
@@ -86,7 +124,7 @@
newline = (p != 0);
va_end(args);
- printk("%s", buf);
+ sn_oemdata_prfunc("%s", buf); /* args must be '%s", buf' */
return len;
}
@@ -100,7 +138,10 @@
void
ia64_sn2_platform_plat_specific_err_print(int header_len, int sect_len, u8 *p_data, prfunc_t prfunc)
{
+ down(&sn_oemdata_mutex);
+ sn_oemdata_prfunc = prfunc;
ia64_sn_plat_specific_err_print(print_hook, p_data - sect_len);
+ up(&sn_oemdata_mutex);
}
@@ -132,3 +173,41 @@
sn_cpei_timer.function = sn_cpei_timer_handler;
add_timer(&sn_cpei_timer);
}
+
+static int
+sn_platform_plat_specific_err_print(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
+{
+ sal_log_plat_specific_err_info_t *psei = (sal_log_plat_specific_err_info_t *)sect_header;
+ if (!psei->valid.oem_data)
+ return 0;
+ down(&sn_oemdata_mutex);
+ sn_oemdata = oemdata;
+ sn_oemdata_size = oemdata_size;
+ sn_oemdata_prfunc = &sn_oemdata_print;
+ ia64_sn_plat_specific_err_print(print_hook, (char *)psei);
+ up(&sn_oemdata_mutex);
+ return 0;
+}
+
+/* Callback when userspace salinfo wants to decode oem data via the platform
+ * kernel and/or prom.
+ */
+int sn_salinfo_platform_oemdata(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
+{
+ efi_guid_t guid = *(efi_guid_t *)sect_header;
+ *oemdata_size = 0;
+ sn_oemdata_bufsize = 0;
+ vfree(*oemdata);
+ *oemdata = NULL;
+ if (efi_guidcmp(guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) = 0)
+ return sn_platform_plat_specific_err_print(sect_header, oemdata, oemdata_size);
+ return 0;
+}
+
+static int __init sn_salinfo_init(void)
+{
+ salinfo_platform_oemdata = &sn_salinfo_platform_oemdata;
+ return 0;
+}
+
+module_init(sn_salinfo_init)
reply other threads:[~2003-10-30 8:43 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=marc-linux-ia64-106750344518501@msgid-missing \
--to=kaos@sgi.com \
--cc=linux-ia64@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.