mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 06:18:54 +00:00 
			
		
		
		
	 9547737799
			
		
	
	
		9547737799
		
	
	
	
	
		
			
			The VIA Padlock device requires the input and output buffers to be aligned on 16-byte boundaries. This patch adds the alignmask attribute for low-level cipher implementations to indicate their alignment requirements. The mid-level crypt() function will copy the input/output buffers if they are not aligned correctly before they are passed to the low-level implementation. Strictly speaking, some of the software implementations require the buffers to be aligned on 4-byte boundaries as they do 32-bit loads. However, it is not clear whether it is better to copy the buffers or pay the penalty for unaligned loads/stores. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Cryptographic API.
 | |
|  *
 | |
|  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
 | |
|  * Copyright (c) 2002 Adam J. Richter <adam@yggdrasil.com>
 | |
|  * Copyright (c) 2004 Jean-Luc Cooke <jlcooke@certainkey.com>
 | |
|  *
 | |
|  * 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.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _CRYPTO_SCATTERWALK_H
 | |
| #define _CRYPTO_SCATTERWALK_H
 | |
| #include <linux/mm.h>
 | |
| #include <asm/scatterlist.h>
 | |
| 
 | |
| struct scatter_walk {
 | |
| 	struct scatterlist	*sg;
 | |
| 	struct page		*page;
 | |
| 	void			*data;
 | |
| 	unsigned int		len_this_page;
 | |
| 	unsigned int		len_this_segment;
 | |
| 	unsigned int		offset;
 | |
| };
 | |
| 
 | |
| /* Define sg_next is an inline routine now in case we want to change
 | |
|    scatterlist to a linked list later. */
 | |
| static inline struct scatterlist *sg_next(struct scatterlist *sg)
 | |
| {
 | |
| 	return sg + 1;
 | |
| }
 | |
| 
 | |
| static inline int scatterwalk_samebuf(struct scatter_walk *walk_in,
 | |
| 				      struct scatter_walk *walk_out)
 | |
| {
 | |
| 	return walk_in->page == walk_out->page &&
 | |
| 	       walk_in->offset == walk_out->offset;
 | |
| }
 | |
| 
 | |
| static inline unsigned int scatterwalk_clamp(struct scatter_walk *walk,
 | |
| 					     unsigned int nbytes)
 | |
| {
 | |
| 	return nbytes > walk->len_this_page ? walk->len_this_page : nbytes;
 | |
| }
 | |
| 
 | |
| static inline void scatterwalk_advance(struct scatter_walk *walk,
 | |
| 				       unsigned int nbytes)
 | |
| {
 | |
| 	walk->data += nbytes;
 | |
| 	walk->offset += nbytes;
 | |
| 	walk->len_this_page -= nbytes;
 | |
| 	walk->len_this_segment -= nbytes;
 | |
| }
 | |
| 
 | |
| static inline unsigned int scatterwalk_aligned(struct scatter_walk *walk,
 | |
| 					       unsigned int alignmask)
 | |
| {
 | |
| 	return !(walk->offset & alignmask);
 | |
| }
 | |
| 
 | |
| void scatterwalk_start(struct scatter_walk *walk, struct scatterlist *sg);
 | |
| int scatterwalk_copychunks(void *buf, struct scatter_walk *walk, size_t nbytes, int out);
 | |
| void scatterwalk_map(struct scatter_walk *walk, int out);
 | |
| void scatterwalk_done(struct scatter_walk *walk, int out, int more);
 | |
| 
 | |
| #endif  /* _CRYPTO_SCATTERWALK_H */
 |