ANDROID: vendor hooks: Encrypt snapshot for bootloader based hibernation

Add encryption support to bootloader based hibernation. This will
encrypt the hibernation snapshot image before it is written to the swap
partition.

Bug: 279879797
Change-Id: I07046ad7fb848fc62258871ab41b3e03246c40dc
Signed-off-by: Shreyas K K <quic_shrekk@quicinc.com>
This commit is contained in:
Shreyas K K 2022-12-07 10:02:42 +05:30 committed by Carlos Llamas
parent defdc4d1dd
commit 154b4b9f1a
3 changed files with 30 additions and 3 deletions

View file

@ -297,3 +297,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ctl_dirty_rate);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_hibernation_swap);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_cpu_resume);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_hib_resume_bdev);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_encrypt_page);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_init_aes_encrypt);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_swap_map_write);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_post_image_save);

View file

@ -23,6 +23,22 @@ DECLARE_HOOK(android_vh_save_hib_resume_bdev,
TP_PROTO(struct block_device *hib_resume_bdev),
TP_ARGS(hib_resume_bdev));
DECLARE_HOOK(android_vh_encrypt_page,
TP_PROTO(void *buf),
TP_ARGS(buf));
DECLARE_HOOK(android_vh_init_aes_encrypt,
TP_PROTO(void *unused),
TP_ARGS(unused));
DECLARE_HOOK(android_vh_skip_swap_map_write,
TP_PROTO(bool *skip),
TP_ARGS(skip));
DECLARE_HOOK(android_vh_post_image_save,
TP_PROTO(unsigned short root_swap),
TP_ARGS(root_swap));
#endif /* _TRACE_HOOK_BL_HIB_H */
/* This part must be outside protection */
#include <trace/define_trace.h>

View file

@ -454,6 +454,7 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
{
int error = 0;
sector_t offset;
bool skip = false;
if (!handle->cur)
return -EINVAL;
@ -467,9 +468,12 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
if (!offset)
return -ENOSPC;
handle->cur->next_swap = offset;
error = write_page(handle->cur, handle->cur_swap, hb);
if (error)
goto out;
trace_android_vh_skip_swap_map_write(&skip);
if (!skip) {
error = write_page(handle->cur, handle->cur_swap, hb);
if (error)
goto out;
}
clear_page(handle->cur);
handle->cur_swap = offset;
handle->k = 0;
@ -564,6 +568,7 @@ static int save_image(struct swap_map_handle *handle,
ret = snapshot_read_next(snapshot);
if (ret <= 0)
break;
trace_android_vh_encrypt_page(data_of(*snapshot));
ret = swap_write_page(handle, data_of(*snapshot), &hb);
if (ret)
break;
@ -580,6 +585,7 @@ static int save_image(struct swap_map_handle *handle,
if (!ret)
pr_info("Image saving done\n");
swsusp_show_speed(start, stop, nr_to_write, "Wrote");
trace_android_vh_post_image_save(root_swap);
return ret;
}
@ -923,6 +929,7 @@ int swsusp_write(unsigned int flags)
pr_err("Cannot get swap writer\n");
return error;
}
trace_android_vh_init_aes_encrypt(NULL);
if (flags & SF_NOCOMPRESS_MODE) {
if (!enough_swap(pages)) {
pr_err("Not enough free swap\n");