[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v4 3/3] xen/efi: use directmap to access runtime services table



It is certainly nice to have less users of the direct map. My non-EFI
builds already work without the direct map now but once I start testing
EFI, it is nice to have one less thing to worry about.

How important and performance-critical is this? If we really want to
avoid switching the page table, we could reserve a virtual range and
map it to runtime services in Xen.

Hongyan

On Thu, 2019-10-24 at 05:45 +0200, Marek Marczykowski-Górecki wrote:
> Do not require switching page tables to access (static) information
> in
> the runtime services table itself, use directmap for this. This
> allows
> exiting early from XEN_EFI_query_capsule_capabilities,
> XEN_EFI_update_capsule and XEN_EFI_query_variable_info (in case of
> not
> supported call) without all the impact of page table switch.
> 
> Signed-off-by: Marek Marczykowski-Górecki <
> marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> ---
> New patch in v4. Can be applied independently of the other two.
> Specifically can be defered beyond 4.13.
> I'm also fine with dropping it, if adding directmap users is
> undesired.
> 
> Cc: Juergen Gross <jgross@xxxxxxxx>
> ---
>  xen/common/efi/boot.c    |  1 +
>  xen/common/efi/runtime.c | 19 ++++---------------
>  2 files changed, 5 insertions(+), 15 deletions(-)
> 
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index 9debc5b..89b1c8a 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -1122,6 +1122,7 @@ static void __init efi_exit_boot(EFI_HANDLE
> ImageHandle, EFI_SYSTEM_TABLE *Syste
>  
>      /* Adjust pointers into EFI. */
>      efi_ct = (void *)efi_ct + DIRECTMAP_VIRT_START;
> +    efi_rs = (void *)efi_rs + DIRECTMAP_VIRT_START;
>      efi_memmap = (void *)efi_memmap + DIRECTMAP_VIRT_START;
>      efi_fw_vendor = (void *)efi_fw_vendor + DIRECTMAP_VIRT_START;
>  }
> diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
> index ab53ebc..22fd6c9 100644
> --- a/xen/common/efi/runtime.c
> +++ b/xen/common/efi/runtime.c
> @@ -211,12 +211,7 @@ int efi_get_info(uint32_t idx, union
> xenpf_efi_info *info)
>          break;
>      case XEN_FW_EFI_RT_VERSION:
>      {
> -        struct efi_rs_state state = efi_rs_enter();
> -
> -        if ( !state.cr3 )
> -            return -EOPNOTSUPP;
>          info->version = efi_rs->Hdr.Revision;
> -        efi_rs_leave(&state);
>          break;
>      }
>      case XEN_FW_EFI_CONFIG_TABLE:
> @@ -618,12 +613,11 @@ int efi_runtime_call(struct
> xenpf_efi_runtime_call *op)
>              break;
>          }
>  
> +        if ( (efi_rs->Hdr.Revision >> 16) < 2 )
> +            return -EOPNOTSUPP;
>          state = efi_rs_enter();
> -        if ( !state.cr3 || (efi_rs->Hdr.Revision >> 16) < 2 )
> -        {
> -            efi_rs_leave(&state);
> +        if ( !state.cr3 )
>              return -EOPNOTSUPP;
> -        }
>          status = efi_rs->QueryVariableInfo(
>              op->u.query_variable_info.attr,
>              &op->u.query_variable_info.max_store_size,
> @@ -637,13 +631,8 @@ int efi_runtime_call(struct
> xenpf_efi_runtime_call *op)
>          if ( op->misc )
>              return -EINVAL;
>  
> -        state = efi_rs_enter();
> -        if ( !state.cr3 || (efi_rs->Hdr.Revision >> 16) < 2 )
> -        {
> -            efi_rs_leave(&state);
> +        if ( (efi_rs->Hdr.Revision >> 16) < 2 )
>              return -EOPNOTSUPP;
> -        }
> -        efi_rs_leave(&state);
>          /* XXX fall through for now */
>      default:
>          return -ENOSYS;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.