2012-08-14 18:35:32 -05:00
/*
* Copyright 2012 IBM Corporation
*
2014-12-04 21:01:51 -06:00
* Author : Ashley Lai < ashleydlai @ gmail . com >
2012-08-14 18:35:32 -05:00
*
* Maintained by : < tpmdd - devel @ lists . sourceforge . net >
*
* Read the event log created by the firmware on PPC64
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*
*/
# include <linux/slab.h>
# include <linux/of.h>
# include "tpm.h"
# include "tpm_eventlog.h"
int read_log ( struct tpm_bios_log * log )
{
struct device_node * np ;
const u32 * sizep ;
2015-06-17 18:17:09 -04:00
const u64 * basep ;
2012-08-14 18:35:32 -05:00
if ( log - > bios_event_log ! = NULL ) {
pr_err ( " %s: ERROR - Eventlog already initialized \n " , __func__ ) ;
return - EFAULT ;
}
2015-10-07 20:11:52 -04:00
np = of_find_node_by_name ( NULL , " vtpm " ) ;
2012-08-14 18:35:32 -05:00
if ( ! np ) {
pr_err ( " %s: ERROR - IBMVTPM not supported \n " , __func__ ) ;
return - ENODEV ;
}
sizep = of_get_property ( np , " linux,sml-size " , NULL ) ;
if ( sizep = = NULL ) {
pr_err ( " %s: ERROR - SML size not found \n " , __func__ ) ;
goto cleanup_eio ;
}
if ( * sizep = = 0 ) {
pr_err ( " %s: ERROR - event log area empty \n " , __func__ ) ;
goto cleanup_eio ;
}
basep = of_get_property ( np , " linux,sml-base " , NULL ) ;
if ( basep = = NULL ) {
2015-03-30 22:06:08 +02:00
pr_err ( " %s: ERROR - SML not found \n " , __func__ ) ;
2012-08-14 18:35:32 -05:00
goto cleanup_eio ;
}
log - > bios_event_log = kmalloc ( * sizep , GFP_KERNEL ) ;
if ( ! log - > bios_event_log ) {
pr_err ( " %s: ERROR - Not enough memory for BIOS measurements \n " ,
__func__ ) ;
2015-10-22 22:32:41 +02:00
of_node_put ( np ) ;
2012-08-14 18:35:32 -05:00
return - ENOMEM ;
}
log - > bios_event_log_end = log - > bios_event_log + * sizep ;
2015-06-17 18:17:09 -04:00
memcpy ( log - > bios_event_log , __va ( * basep ) , * sizep ) ;
2015-10-22 22:32:41 +02:00
of_node_put ( np ) ;
2012-08-14 18:35:32 -05:00
return 0 ;
cleanup_eio :
of_node_put ( np ) ;
return - EIO ;
}