This causes the device to forget about the request/completion rings. We allocated said rings in EfiBootServicesData type memory, and code executing after ExitBootServices() is permitted to overwrite it. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2567 Reviewed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Liran Alon <liran.alon@oracle.com> Message-Id: <20200328200100.60786-17-liran.alon@oracle.com> Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   Internal definitions for the PVSCSI driver, which produces Extended SCSI
 | |
|   Pass Thru Protocol instances for pvscsi devices.
 | |
| 
 | |
|   Copyright (C) 2020, Oracle and/or its affiliates.
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __PVSCSI_DXE_H_
 | |
| #define __PVSCSI_DXE_H_
 | |
| 
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Protocol/ScsiPassThruExt.h>
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_PHYSICAL_ADDRESS DeviceAddress;
 | |
|   VOID                 *Mapping;
 | |
| } PVSCSI_DMA_DESC;
 | |
| 
 | |
| typedef struct {
 | |
|   PVSCSI_RINGS_STATE   *RingState;
 | |
|   PVSCSI_DMA_DESC      RingStateDmaDesc;
 | |
| 
 | |
|   PVSCSI_RING_REQ_DESC *RingReqs;
 | |
|   PVSCSI_DMA_DESC      RingReqsDmaDesc;
 | |
| 
 | |
|   PVSCSI_RING_CMP_DESC *RingCmps;
 | |
|   PVSCSI_DMA_DESC      RingCmpsDmaDesc;
 | |
| } PVSCSI_RING_DESC;
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // As EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET.SenseDataLength is defined
 | |
|   // as UINT8, defining here SenseData size to MAX_UINT8 will guarantee it
 | |
|   // cannot overflow when passed to device.
 | |
|   //
 | |
|   UINT8     SenseData[MAX_UINT8];
 | |
|   //
 | |
|   // This size of the data is arbitrarily chosen.
 | |
|   // It seems to be sufficient for all I/O requests sent through
 | |
|   // EFI_SCSI_PASS_THRU_PROTOCOL.PassThru() for common boot scenarios.
 | |
|   //
 | |
|   UINT8     Data[0x2000];
 | |
| } PVSCSI_DMA_BUFFER;
 | |
| 
 | |
| #define PVSCSI_SIG SIGNATURE_32 ('P', 'S', 'C', 'S')
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32                          Signature;
 | |
|   EFI_PCI_IO_PROTOCOL             *PciIo;
 | |
|   EFI_EVENT                       ExitBoot;
 | |
|   UINT64                          OriginalPciAttributes;
 | |
|   PVSCSI_RING_DESC                RingDesc;
 | |
|   PVSCSI_DMA_BUFFER               *DmaBuf;
 | |
|   PVSCSI_DMA_DESC                 DmaBufDmaDesc;
 | |
|   UINT8                           MaxTarget;
 | |
|   UINT8                           MaxLun;
 | |
|   UINTN                           WaitForCmpStallInUsecs;
 | |
|   EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;
 | |
|   EFI_EXT_SCSI_PASS_THRU_MODE     PassThruMode;
 | |
| } PVSCSI_DEV;
 | |
| 
 | |
| #define PVSCSI_FROM_PASS_THRU(PassThruPointer) \
 | |
|   CR (PassThruPointer, PVSCSI_DEV, PassThru, PVSCSI_SIG)
 | |
| 
 | |
| #define PVSCSI_DMA_BUF_DEV_ADDR(Dev, MemberName) \
 | |
|   (Dev->DmaBufDmaDesc.DeviceAddress + OFFSET_OF(PVSCSI_DMA_BUFFER, MemberName))
 | |
| 
 | |
| #endif // __PVSCSI_DXE_H_
 |