static int ram_console_lastk_show(struct ram_console_buffer *buffer, struct seq_file *m, void *v)
{
	unsigned int wdt_status;
	if (ram_console_check_header(buffer) && buffer->sz_buffer != 0) {
		pr_err("ram_console: buffer %p, size %x(%x)\n", buffer, buffer->sz_buffer, ram_console_buffer->sz_buffer);
		if (buffer)
			seq_write(m, buffer, ram_console_buffer->sz_buffer);
		else
			seq_printf(m, "NO VALID DATA.\n");
		return 0;
	}
	if (buffer->off_pl == 0 || buffer->off_pl + ALIGN(buffer->sz_pl, 64) != buffer->off_lpl) {
		/* workaround for compatiblity to old preloader & lk (OTA) */
		wdt_status = *((unsigned char*)buffer + 12);
	} else
		wdt_status = LAST_RRPL_BUF_VAL(buffer, wdt_status);
	
	seq_printf(m, "ram console header, hw_status: %u, fiq step %u.\n",
		   wdt_status, LAST_RRR_BUF_VAL(buffer, fiq_step));

	if (buffer->off_console != 0 && buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64) == buffer->off_console
	    && buffer->sz_console == buffer->sz_buffer - buffer->off_console && buffer->log_size <= buffer->sz_console &&
	    buffer->log_start <= buffer->sz_console) {
		seq_write(m, (void*)buffer + buffer->off_console + buffer->log_start, buffer->log_size - buffer->log_start);
		seq_write(m, (void*)buffer + buffer->off_console, buffer->log_start);
	} else {
		seq_printf(m, "header may be corrupted, dump the raw buffer for reference only\n");
		seq_write(m, buffer, ram_console_buffer->sz_buffer);
	}
	return 0;
}
예제 #2
0
static int ram_console_lastk_show(struct ram_console_buffer *buffer, struct seq_file *m, void *v)
{
	unsigned int wdt_status;
	if (ram_console_check_header(buffer) && buffer->sz_buffer != 0) {
		pr_err("ram_console: buffer %p, size %x(%x)\n", buffer, buffer->sz_buffer, ram_console_buffer->sz_buffer);
		if (buffer)
			seq_write(m, buffer, ram_console_buffer->sz_buffer);
		else
			seq_printf(m, "NO VALID DATA.\n");
		return 0;
	}
	if (buffer->off_pl == 0 || buffer->off_pl + ALIGN(buffer->sz_pl, 64) != buffer->off_lpl) {
        pr_err("ram_console OTA: sig(0x%p):0x%x, off_lpl(0x%p):0x%x, off_pl(0x%p):0x%x, sz_pl(0x%p):0x%x, off_lk(0x%p):0x%x, off_llk(0x%p):0x%x,sz_lk(0x%p):0x%x\n", 
            &(buffer->sig), buffer->sig, 
            &(buffer->off_lpl), buffer->off_lpl, 
            &(buffer->off_pl), buffer->off_pl, 
            &(buffer->sz_pl), buffer->sz_pl, 
            &(buffer->off_lk), buffer->off_lk, 
            &(buffer->off_llk), buffer->off_llk,
            &(buffer->sz_lk), buffer->sz_lk);
		/* workaround for compatiblity to old preloader & lk (OTA) */
		wdt_status = *((unsigned char*)buffer + 12);
	} else {
        pr_err("ram_console NON-OTA: sig(0x%p):0x%x, off_lpl(0x%p):0x%x, off_pl(0x%p):0x%x, sz_pl(0x%p):0x%x, off_lk(0x%p):0x%x, off_llk(0x%p):0x%x,sz_lk(0x%p):0x%x\n", 
            &(buffer->sig), buffer->sig, 
            &(buffer->off_lpl), buffer->off_lpl, 
            &(buffer->off_pl), buffer->off_pl, 
            &(buffer->sz_pl), buffer->sz_pl, 
            &(buffer->off_lk), buffer->off_lk, 
            &(buffer->off_llk), buffer->off_llk,
            &(buffer->sz_lk), buffer->sz_lk);
		wdt_status = LAST_RRPL_BUF_VAL(buffer, wdt_status);
    }
	
	seq_printf(m, "ram console header, hw_status: %u, fiq step %u.\n",
		   wdt_status, LAST_RRR_BUF_VAL(buffer, fiq_step));

#ifdef CONFIG_PSTORE_CONSOLE
	pr_err("ram_console: pstore show start\n");
	pstore_console_show(PSTORE_TYPE_CONSOLE, m, v);
	pr_err("ram_console: pstore show end\n");
#else
	if (buffer->off_console != 0 && buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64) == buffer->off_console
	    && buffer->sz_console == buffer->sz_buffer - buffer->off_console && buffer->log_size <= buffer->sz_console &&
	    buffer->log_start <= buffer->sz_console) {
		seq_write(m, (void*)buffer + buffer->off_console + buffer->log_start, buffer->log_size - buffer->log_start);
		seq_write(m, (void*)buffer + buffer->off_console, buffer->log_start);
	} else {
		seq_printf(m, "header may be corrupted, dump the raw buffer for reference only\n");
		seq_write(m, buffer, ram_console_buffer->sz_buffer);
	}
#endif
	return 0;
}