return erst_write(&rcd.hdr);
}
-size_t apei_read_mce(struct mce *m, u64 *record_id)
+#ifndef NDEBUG /* currently dead code */
+
+ssize_t apei_read_mce(struct mce *m, u64 *record_id)
{
struct cper_mce_record rcd;
- size_t len;
+ ssize_t len;
if (!m || !record_id)
return -EINVAL;
}
/* Check whether there is record in ERST */
-int apei_check_mce(void)
+bool_t apei_check_mce(void)
{
- return erst_get_record_count();
+ return erst_get_record_count() > 0;
}
int apei_clear_mce(u64 record_id)
{
return erst_clear(record_id);
}
+
+#endif /* currently dead code */
return 0;
}
-static size_t __erst_get_record_count(void)
+static ssize_t __erst_get_record_count(void)
{
struct apei_exec_context ctx;
int rc;
+ u64 output;
+ ssize_t count;
erst_exec_ctx_init(&ctx);
rc = apei_exec_run(&ctx, ACPI_ERST_GET_RECORD_COUNT);
if (rc)
return rc;
- return apei_exec_ctx_get_output(&ctx);
+ count = output = apei_exec_ctx_get_output(&ctx);
+ return count >= 0 && count == output ? count : -ERANGE;
}
-size_t erst_get_record_count(void)
+ssize_t erst_get_record_count(void)
{
- size_t count;
+ ssize_t count;
unsigned long flags;
if (!erst_enabled)
return erst_errno(val);
}
+#ifndef NDEBUG /* currently dead code */
+
static int __erst_read_from_storage(u64 record_id, u64 offset)
{
struct apei_exec_context ctx;
return erst_errno(val);
}
+#endif /* currently dead code */
+
/* NVRAM ERST Error Log Address Range is not supported yet */
static int __erst_write_to_nvram(const struct cper_record_header *record)
{
return -ENOSYS;
}
+#ifndef NDEBUG /* currently dead code */
+
static int __erst_read_to_erange_from_nvram(u64 record_id, u64 *offset)
{
printk(KERN_WARNING
return -ENOSYS;
}
+#endif /* currently dead code */
+
int erst_write(const struct cper_record_header *record)
{
int rc;
return rc;
}
+#ifndef NDEBUG /* currently dead code */
+
static int __erst_read_to_erange(u64 record_id, u64 *offset)
{
int rc;
return 0;
}
-static size_t __erst_read(u64 record_id, struct cper_record_header *record,
+static ssize_t __erst_read(u64 record_id, struct cper_record_header *record,
size_t buflen)
{
int rc;
- u64 offset, len = 0;
+ u64 offset;
+ ssize_t len;
struct cper_record_header *rcd_tmp;
rc = __erst_read_to_erange(record_id, &offset);
if (rc)
return rc;
rcd_tmp = erst_erange.vaddr + offset;
+ if (rcd_tmp->record_length > buflen)
+ return -ENOBUFS;
len = rcd_tmp->record_length;
- if (len <= buflen)
- memcpy(record, rcd_tmp, len);
+ memcpy(record, rcd_tmp, len);
- return len;
+ return len >= 0 ? len : -ERANGE;
}
/*
* else if return value < 0, something goes wrong,
* else everything is OK, and return value is record length
*/
-size_t erst_read(u64 record_id, struct cper_record_header *record,
+ssize_t erst_read(u64 record_id, struct cper_record_header *record,
size_t buflen)
{
- size_t len;
+ ssize_t len;
unsigned long flags;
if (!erst_enabled)
* else if return value < 0, something goes wrong,
* else everything is OK, and return value is record length
*/
-size_t erst_read_next(struct cper_record_header *record, size_t buflen)
+ssize_t erst_read_next(struct cper_record_header *record, size_t buflen)
{
int rc;
- size_t len;
+ ssize_t len;
unsigned long flags;
u64 record_id;
return rc;
}
+#endif /* currently dead code */
+
static int __init erst_check_table(struct acpi_table_erst *erst_tab)
{
if (erst_tab->header.length < sizeof(*erst_tab))
#define FIX_APEI_RANGE_MAX 64
int erst_write(const struct cper_record_header *record);
-size_t erst_get_record_count(void);
+ssize_t erst_get_record_count(void);
int erst_get_next_record_id(u64 *record_id);
-size_t erst_read(u64 record_id, struct cper_record_header *record,
+ssize_t erst_read(u64 record_id, struct cper_record_header *record,
size_t buflen);
-size_t erst_read_next(struct cper_record_header *record, size_t buflen);
+ssize_t erst_read_next(struct cper_record_header *record, size_t buflen);
int erst_clear(u64 record_id);
void __iomem *apei_pre_map(paddr_t paddr, unsigned long size);