public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
From: David Mosberger <davidm@napali.hpl.hp.com>
To: linux-ia64@vger.kernel.org
Subject: Re: [Linux-ia64] [patch] 2.4.20-021210 misaligned sal error record
Date: Wed, 05 Mar 2003 00:01:20 +0000	[thread overview]
Message-ID: <marc-linux-ia64-105590709805965@msgid-missing> (raw)
In-Reply-To: <marc-linux-ia64-105590709805925@msgid-missing>

>>>>> On Tue, 25 Feb 2003 12:53:35 +1100, Keith Owens <kaos@sgi.com> said:

  Keith> On Mon, 24 Feb 2003 17:42:48 -0800, David Mosberger
  Keith> <davidm@napali.hpl.hp.com> wrote:
  >>>>>>> On Tue, 25 Feb 2003 11:24:35 +1100, Keith Owens
  >>>>>>> <kaos@sgi.com> said:
  >>
  Keith> - sal_log_mod_error_info_t cache_check_info[16]; -
  Keith> sal_log_mod_error_info_t tlb_check_info[16]; -
  Keith> sal_log_mod_error_info_t bus_check_info[16]; -
  Keith> sal_log_mod_error_info_t reg_file_check_info[16]; -
  Keith> sal_log_mod_error_info_t ms_check_info[16]; +
  Keith> sal_log_mod_error_info_t cache_check_info[0]; +
  Keith> sal_log_mod_error_info_t tlb_check_info[0]; +
  Keith> sal_log_mod_error_info_t bus_check_info[0]; +
  Keith> sal_log_mod_error_info_t reg_file_check_info[0]; +
  Keith> sal_log_mod_error_info_t ms_check_info[0];
  >>  Somehow I doubt a declaration of this form is a good idea.  If
  >> the records are all variable length, wouldn't it be saner to just
  >> declare this with something along the lines of:
  >> 
  Keith> + sal_log_mod_error_info_t check_info[0];
  >>  and then provide separate macros to access the indiviual
  >> portions?

  Keith> Either works, but nobody really cares about the various
  Keith> *check_info sections.  What we care about is the processor
  Keith> static data that comes after these sections and is addressed
  Keith> via the new function.  This was the minimal change to
  Keith> correctly access the processor static data, it is a one line
  Keith> change to mca.c.

  Keith> Replacing the individual *check_info[0] sections with a
  Keith> single check_info[0] means more changes to mca.c to use the
  Keith> new names.  It also diverges from the SAL specification which
  Keith> lists the individual fields.  Since the end result would be
  Keith> exactly the same as the existing code, I went for the minimal
  Keith> change and kept SAL documentation compatibility.  Blame the
  Keith> SAL docs, I do ;).

I don't think the proper solution requires many more changes to mca.c.
If we don't fix it properly, I'm sure it will trip someone again
later on.

Below is a proposed patch (btw: I think your patch had a bug:
addr_processor_static_info() didn't skip the cpuid structure).

The patch breaks mca_test(), which is used only if MCA_TEST is
defined.  But the old code worked for the wrong reasons, so I
think this needs updating anyhow.

Could someone test this to verify it works as intended (it does
compile, but that's as far as I tested it).

Thanks,

	--david

=== arch/ia64/kernel/mca.c 1.17 vs edited ==--- 1.17/arch/ia64/kernel/mca.c	Tue Feb  4 17:06:10 2003
+++ edited/arch/ia64/kernel/mca.c	Tue Mar  4 15:37:15 2003
@@ -825,7 +825,7 @@
 	plog_ptr=(ia64_err_rec_t *)IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_INIT);
 	proc_ptr = &plog_ptr->proc_err;
 
-	ia64_process_min_state_save(&proc_ptr->processor_static_info.min_state_area);
+	ia64_process_min_state_save(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area);
 
 	/* Clear the INIT SAL logs now that they have been saved in the OS buffer */
 	ia64_sal_clear_state_info(SAL_INFO_TYPE_INIT);
@@ -1620,7 +1620,7 @@
 	 *  absent. Also, current implementations only allocate space for number of
 	 *  elements used.  So we walk the data pointer from here on.
 	 */
-	p_data = &slpi->cache_check_info[0];
+	p_data = &slpi->info[0];
 
 	/* Print the cache check information if any*/
 	for (i = 0 ; i < slpi->valid.num_cache_check; i++, p_data++)
=== include/asm-ia64/sal.h 1.13 vs edited ==--- 1.13/include/asm-ia64/sal.h	Thu Feb  6 11:39:47 2003
+++ edited/include/asm-ia64/sal.h	Tue Mar  4 15:48:43 2003
@@ -336,6 +336,11 @@
 	struct ia64_fpreg fr[128];
 } sal_processor_static_info_t;
 
+struct sal_cpuid_info {
+	u64 regs[5];
+	u64 reserved;
+};
+
 typedef struct sal_log_processor_info {
 	sal_log_section_hdr_t header;
 	struct {
@@ -354,17 +359,34 @@
 	u64 proc_error_map;
 	u64 proc_state_parameter;
 	u64 proc_cr_lid;
-	sal_log_mod_error_info_t cache_check_info[16];
-	sal_log_mod_error_info_t tlb_check_info[16];
-	sal_log_mod_error_info_t bus_check_info[16];
-	sal_log_mod_error_info_t reg_file_check_info[16];
-	sal_log_mod_error_info_t ms_check_info[16];
-	struct {
-		u64 regs[5];
-		u64 reserved;
-	} cpuid_info;
-	sal_processor_static_info_t processor_static_info;
+	/*
+	 * The rest of this structure consists of variable-length arrays, which can't be
+	 * expressed in C.
+	 */
+	sal_log_mod_error_info_t info[0];
+	/*
+	 * This is what the rest looked like if C supported variable-length arrays:
+	 *
+	 * sal_log_mod_error_info_t cache_check_info[.valid.num_cache_check];
+	 * sal_log_mod_error_info_t tlb_check_info[.valid.num_tlb_check];
+	 * sal_log_mod_error_info_t bus_check_info[.valid.num_bus_check];
+	 * sal_log_mod_error_info_t reg_file_check_info[.valid.num_reg_file_check];
+	 * sal_log_mod_error_info_t ms_check_info[.valid.num_ms_check];
+	 * struct sal_cpuid_info cpuid_info;
+	 * sal_processor_static_info_t processor_static_info;
+	 */
 } sal_log_processor_info_t;
+
+/* Given a sal_log_processor_info_t pointer, return a pointer to the processor_static_info: */
+#define SAL_LPI_PSI_INFO(l)								\
+({	sal_log_processor_info_t *_l = (l);						\
+	((sal_processor_static_info_t *)						\
+	 ((char *) _l + ((_l->valid.num_cache_check + _l->valid.num_tlb_check		\
+			  + _l->valid.num_bus_check + _l->valid.num_reg_file_check	\
+			  + _l->valid.num_ms_check) * sizeof(sal_log_mod_error_info_t)	\
+			 + sizeof(struct sal_cpuid_info))));				\
+})
+
 
 /* platform error log structures */
 


  parent reply	other threads:[~2003-03-05  0:01 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-02-25  0:24 [Linux-ia64] [patch] 2.4.20-021210 misaligned sal error record Keith Owens
2003-02-25  1:42 ` David Mosberger
2003-02-25  1:53 ` Keith Owens
2003-03-05  0:01 ` David Mosberger [this message]
2003-03-05  0:33 ` Keith Owens
2003-03-05  0:45 ` David Mosberger
2003-04-17 22:47 ` Bjorn Helgaas

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-105590709805965@msgid-missing \
    --to=davidm@napali.hpl.hp.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox