コード例 #1
0
ファイル: sec_log.c プロジェクト: Biktorgj/Android_b2_Kernel
static int __init sec_log_setup(char *str)
{
	unsigned size = memparse(str, &str);
	unsigned long base = 0;
	unsigned *sec_log_mag;

	if (!size || size != roundup_pow_of_two(size) || *str != '@'
	    || kstrtoul(str + 1, 0, &base))
		goto out;

	base = 0x46000000;
	size = 0x200000;

	/* If we encounter any problem parsing str ... */
	if (reserve_bootmem(base - 8, size + 8, BOOTMEM_EXCLUSIVE)) {
		pr_err("%s: failed reserving size %d + 8 " \
		       "at base 0x%lx - 8\n", __func__, size, base);
		goto out;
	}

#ifdef CONFIG_SEC_LOG_NONCACHED
	log_buf_iodesc[0].pfn = __phys_to_pfn((unsigned long)base - 0x100000);
	log_buf_iodesc[0].length = (unsigned long)(size + 0x100000);
	iotable_init(log_buf_iodesc, ARRAY_SIZE(log_buf_iodesc));
	flush_tlb_all();
	sec_log_mag = (S3C_VA_KLOG_BUF + 0x100000) - 8;
	sec_log_ptr = (S3C_VA_KLOG_BUF + 0x100000) - 4;
	sec_log_buf = S3C_VA_KLOG_BUF + 0x100000;
#else
	sec_log_mag = phys_to_virt(base) - 8;
	sec_log_ptr = phys_to_virt(base) - 4;
	sec_log_buf = phys_to_virt(base);
#endif

	sec_log_size = size;
	pr_info("%s: *sec_log_mag:%x *sec_log_ptr:%x " \
		"sec_log_buf:%p sec_log_size:%d\n",
		__func__, *sec_log_mag, *sec_log_ptr, sec_log_buf,
		sec_log_size);

	if (*sec_log_mag != LOG_MAGIC) {
		pr_info("%s: no old log found\n", __func__);
		*sec_log_ptr = 0;
		*sec_log_mag = LOG_MAGIC;
	} else
		sec_log_save_old();

	register_log_char_hook(emit_sec_log_char);

	sec_getlog_supply_kloginfo(phys_to_virt(base));

out:
	return 0;
}
コード例 #2
0
// void printk_remap_nocache(void)
static int __init printk_remap_nocache(void)
{
	unsigned long nocache_base = 0;
	unsigned *sec_log_mag;
	unsigned long flags;
	unsigned start;

	pr_err("%s: sec_log_save_size %d at sec_log_save_base 0x%x \n",
		__func__, sec_log_save_size, (unsigned int)sec_log_save_base);
	pr_err("%s: sec_log_reserve_size %d at sec_log_reserve_base 0x%x \n",
		__func__, sec_log_reserve_size, (unsigned int)sec_log_reserve_base);

	nocache_base = (unsigned long)ioremap_nocache(sec_log_save_base - 4096, sec_log_save_size + 8192);
	nocache_base = nocache_base + 4096;

	sec_log_mag = (unsigned *)(nocache_base - 8);
	sec_log_ptr = (unsigned *)(nocache_base - 4);
	sec_log_buf = (char *)nocache_base;
	sec_log_size = sec_log_save_size;
	sec_log_irq_en = (unsigned int *)(nocache_base - 0xC);

	if (*sec_log_mag != LOG_MAGIC) {
		*sec_log_ptr = 0;
		*sec_log_mag = LOG_MAGIC;
	} else {
		sec_log_save_old();
	}

	spin_lock_irqsave(&logbuf_lock, flags);

	start = min(con_start, log_start);
	while (start != log_end) {
		emit_sec_log_char(__log_buf
				  [start++ & (__LOG_BUF_LEN - 1)]);
	}

	spin_unlock_irqrestore(&logbuf_lock, flags);

	sec_getlog_supply_kloginfo(log_buf);
	
	return 0;
}
コード例 #3
0
static int __init sec_logbuf_conf_memtype(void)
{
#ifdef CONFIG_SEC_LOG_BUF_NOCACHE
	void __iomem *base = 0;
#else
	unsigned long base = 0;
#endif
	unsigned *sec_log_mag;
	unsigned size_of_log_ptr = sizeof(*sec_log_mag);
	unsigned size_of_log_mag = sizeof(*sec_log_ptr);
	unsigned size_struct_sec_log_buffer = sizeof(struct sec_log_buffer);
	
	/* Round-up to 4 byte alignment */
	size_struct_sec_log_buffer = (((size_struct_sec_log_buffer + 4) / 4)* 4);
	pr_info("%s: size_of_log_ptr:%d size_of_log_mag:%d"
		"size_struct_sec_log_buffer:%d\n",
		__func__, size_of_log_ptr, size_of_log_mag,
					size_struct_sec_log_buffer);

	/**********************************************************************
	 ___________________
	|   sec_log_buffer  |   16 bytes,4 byte aligned sec_log_buffer struct
	|___________________|
	|                   |
	|   sec_log_buf     |	1 MB, sec log buffer
	|                   |
	|___________________|
	|   sec_log_ptr	    |	4 bytes,which holds the index of sec_log_buf[]
	|___________________|
	|   sec_log_mag     |	4 bytes, which holds the magic address
	|___________________|

	***********************************************************************/

	if(sec_log_buf_nocache_enable == 1)
	{
		base = ioremap_nocache(sec_logbuf_base_addr, LOG_LENGTH_B);
		if(base == NULL){
			printk("ioremap nocache fail\n");
			return -1;
		}
		sec_log_buffer = base;
		sec_log_mag = base+ size_struct_sec_log_buffer +
							sec_logbuf_size + size_of_log_ptr;
		sec_log_ptr = base + size_struct_sec_log_buffer + sec_logbuf_size;
		sec_log_buf = base + size_struct_sec_log_buffer;
		sec_log_size = sec_logbuf_size;
	}
	else if(sec_log_buf_nocache_enable == 0) {
		base = sec_logbuf_base_addr;
		sec_log_mag = phys_to_virt(base) + size_struct_sec_log_buffer +
							sec_logbuf_size + size_of_log_ptr;
		sec_log_ptr = phys_to_virt(base) + size_struct_sec_log_buffer + sec_logbuf_size;
		sec_log_buffer = phys_to_virt(base);                
		sec_log_buf = phys_to_virt(base) + size_struct_sec_log_buffer;
		sec_log_size = sec_logbuf_size;

	}
	else {
		printk("%s: sec logbuffer fail to alloc both cache and non-cache\n",__func__);
		return -1;
	}

	pr_info("%s: Addresses: struct sec_log_buffer:%p sec_log_buf:%p"
		"sec_log_ptr:%p sec_log_mag:%p\n",
		__func__, sec_log_buffer, sec_log_buf, sec_log_ptr,
		sec_log_mag);

	pr_info("%s: *sec_log_mag:%x *sec_log_ptr:%x "
		"sec_log_buf:%p sec_log_size:%d\n",
		__func__, *sec_log_mag, *sec_log_ptr, sec_log_buf,
		sec_log_size);

	if (*sec_log_mag != LOG_MAGIC) {
		pr_info("%s: no old log found\n", __func__);
		*sec_log_ptr = 0;
		*sec_log_mag = LOG_MAGIC;
	} else {
		if (*sec_log_ptr)
			sec_log_save_old();
		else
			pr_err("%s: unlikely *sec_log_ptr is zero, skip sec_log_save_old\n", __func__);
	}
#ifdef CONFIG_SEC_DEBUG_REG_ACCESS
	sec_debug_set_last_regs_access();
#endif
	sec_log_buffer->sig = RAM_CONSOLE_SIG;
	sec_log_buffer->size = 0;
	sec_log_buffer->start = *sec_log_ptr;
	sec_log_buffer->from = 0;
	sec_log_buffer->to = 0;

	register_log_text_hook(emit_sec_log, sec_log_buf, sec_log_ptr,
		sec_log_size);
		
	sec_getlog_supply_kloginfo(sec_log_buf );

	return 0;
}