From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH 04/11] hvmctl: convert HVMOP_set_pci_link_route Date: Mon, 20 Jun 2016 06:54:24 -0600 Message-ID: <576803A002000078000F6BEA@prv-mh.provo.novell.com> References: <5768002C02000078000F6B8D@prv-mh.provo.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__Part2F191290.3__=" Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bEyjS-0006eK-IE for xen-devel@lists.xenproject.org; Mon, 20 Jun 2016 12:55:14 +0000 In-Reply-To: <5768002C02000078000F6B8D@prv-mh.provo.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel Cc: Stefano Stabellini , Wei Liu , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Paul Durrant , dgdegra@tycho.nsa.gov List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__Part2F191290.3__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Note that this retains the hvmop interface definitions as those had (wrongly) been exposed to non-tool stack consumers (albeit the operation wouldn't have succeeded when requested by a domain for itself). Signed-off-by: Jan Beulich --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -498,27 +498,11 @@ int xc_hvm_set_isa_irq_level( int xc_hvm_set_pci_link_route( xc_interface *xch, domid_t dom, uint8_t link, uint8_t isa_irq) { - DECLARE_HYPERCALL_BUFFER(struct xen_hvm_set_pci_link_route, arg); - int rc; + DECLARE_HVMCTL(set_pci_link_route, dom, + .link =3D link, + .isa_irq =3D isa_irq); =20 - arg =3D xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); - if ( arg =3D=3D NULL ) - { - PERROR("Could not allocate memory for xc_hvm_set_pci_link_route = hypercall"); - return -1; - } - - arg->domid =3D dom; - arg->link =3D link; - arg->isa_irq =3D isa_irq; - - rc =3D xencall2(xch->xcall, __HYPERVISOR_hvm_op, - HVMOP_set_pci_link_route, - HYPERCALL_BUFFER_AS_ARG(arg)); - - xc_hypercall_buffer_free(xch, arg); - - return rc; + return do_hvmctl(xch, &hvmctl); } =20 int xc_hvm_inject_msi( --- a/xen/arch/x86/hvm/control.c +++ b/xen/arch/x86/hvm/control.c @@ -120,6 +120,11 @@ long do_hvmctl(XEN_GUEST_HANDLE_PARAM(xe rc =3D set_isa_irq_level(d, &op.u.set_isa_irq_level); break; =20 + case XEN_HVMCTL_set_pci_link_route: + rc =3D hvm_set_pci_link_route(d, op.u.set_pci_link_route.link, + op.u.set_pci_link_route.isa_irq); + break; + default: rc =3D -EOPNOTSUPP; break; --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4446,39 +4446,6 @@ static void hvm_s3_resume(struct domain } } =20 -static int hvmop_set_pci_link_route( - XEN_GUEST_HANDLE_PARAM(xen_hvm_set_pci_link_route_t) uop) -{ - struct xen_hvm_set_pci_link_route op; - struct domain *d; - int rc; - - if ( copy_from_guest(&op, uop, 1) ) - return -EFAULT; - - if ( (op.link > 3) || (op.isa_irq > 15) ) - return -EINVAL; - - rc =3D rcu_lock_remote_domain_by_id(op.domid, &d); - if ( rc !=3D 0 ) - return rc; - - rc =3D -EINVAL; - if ( !is_hvm_domain(d) ) - goto out; - - rc =3D xsm_hvm_set_pci_link_route(XSM_DM_PRIV, d); - if ( rc ) - goto out; - - rc =3D 0; - hvm_set_pci_link_route(d, op.link, op.isa_irq); - - out: - rcu_unlock_domain(d); - return rc; -} - static int hvmop_inject_msi( XEN_GUEST_HANDLE_PARAM(xen_hvm_inject_msi_t) uop) { @@ -5325,11 +5292,6 @@ long do_hvm_op(unsigned long op, XEN_GUE guest_handle_cast(arg, xen_hvm_inject_msi_t)); break; =20 - case HVMOP_set_pci_link_route: - rc =3D hvmop_set_pci_link_route( - guest_handle_cast(arg, xen_hvm_set_pci_link_route_t)); - break; - case HVMOP_flush_tlbs: rc =3D guest_handle_is_null(arg) ? hvmop_flush_tlb_all() : = -ENOSYS; break; --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -229,13 +229,17 @@ void hvm_assert_evtchn_irq(struct vcpu * hvm_set_callback_irq_level(v); } =20 -void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq) +int hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq) { struct hvm_irq *hvm_irq =3D &d->arch.hvm_domain.irq; u8 old_isa_irq; int i; =20 - ASSERT((link <=3D 3) && (isa_irq <=3D 15)); + if ( link > 3 || isa_irq > 15 ) + return -EINVAL; + + if ( !is_hvm_domain(d) ) + return -EINVAL; =20 spin_lock(&d->arch.hvm_domain.irq_lock); =20 @@ -273,6 +277,8 @@ void hvm_set_pci_link_route(struct domai =20 dprintk(XENLOG_G_INFO, "Dom%u PCI link %u changed %u -> %u\n", d->domain_id, link, old_isa_irq, isa_irq); + + return 0; } =20 int hvm_inject_msi(struct domain *d, uint64_t addr, uint32_t data) --- a/xen/include/public/hvm/control.h +++ b/xen/include/public/hvm/control.h @@ -47,16 +47,26 @@ struct xen_hvm_set_isa_irq_level { uint8_t level; }; =20 +/* XEN_HVMCTL_set_pci_link_route */ +struct xen_hvm_set_pci_link_route { + /* PCI link identifier (0-3). */ + uint8_t link; + /* ISA IRQ (1-15), or 0 (disable link). */ + uint8_t isa_irq; +}; + struct xen_hvmctl { uint16_t interface_version; /* XEN_HVMCTL_INTERFACE_VERSION */ domid_t domain; uint16_t cmd; #define XEN_HVMCTL_set_pci_intx_level 1 #define XEN_HVMCTL_set_isa_irq_level 2 +#define XEN_HVMCTL_set_pci_link_route 3 uint16_t opaque; /* Must be zero on initial invocation. = */ union { struct xen_hvm_set_pci_intx_level set_pci_intx_level; struct xen_hvm_set_isa_irq_level set_isa_irq_level; + struct xen_hvm_set_pci_link_route set_pci_link_route; uint8_t pad[120]; } u; }; --- a/xen/include/public/hvm/hvm_op.h +++ b/xen/include/public/hvm/hvm_op.h @@ -66,8 +66,6 @@ struct xen_hvm_set_isa_irq_level { typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t); =20 -#endif - #define HVMOP_set_pci_link_route 4 struct xen_hvm_set_pci_link_route { /* Domain to be updated. */ @@ -80,6 +78,8 @@ struct xen_hvm_set_pci_link_route { typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); =20 +#endif + /* Flushes all VCPU TLBs: @arg must be NULL. */ #define HVMOP_flush_tlbs 5 =20 --- a/xen/include/xen/hvm/irq.h +++ b/xen/include/xen/hvm/irq.h @@ -122,7 +122,7 @@ void hvm_isa_irq_assert( void hvm_isa_irq_deassert( struct domain *d, unsigned int isa_irq); =20 -void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq); +int hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq); =20 int hvm_inject_msi(struct domain *d, uint64_t addr, uint32_t data); =20 --- a/xen/include/xsm/dummy.h +++ b/xen/include/xsm/dummy.h @@ -609,12 +609,6 @@ static XSM_INLINE int xsm_shadow_control return xsm_default_action(action, current->domain, d); } =20 -static XSM_INLINE int xsm_hvm_set_pci_link_route(XSM_DEFAULT_ARG struct = domain *d) -{ - XSM_ASSERT_ACTION(XSM_DM_PRIV); - return xsm_default_action(action, current->domain, d); -} - static XSM_INLINE int xsm_hvm_inject_msi(XSM_DEFAULT_ARG struct domain = *d) { XSM_ASSERT_ACTION(XSM_DM_PRIV); --- a/xen/xsm/dummy.c +++ b/xen/xsm/dummy.c @@ -145,7 +145,6 @@ void xsm_fixup_ops (struct xsm_operation #ifdef CONFIG_X86 set_to_dummy_if_null(ops, do_mca); set_to_dummy_if_null(ops, shadow_control); - set_to_dummy_if_null(ops, hvm_set_pci_link_route); set_to_dummy_if_null(ops, hvm_inject_msi); set_to_dummy_if_null(ops, hvm_ioreq_server); set_to_dummy_if_null(ops, mem_sharing_op); --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -1196,6 +1196,9 @@ static int flask_hvm_control(struct doma case XEN_HVMCTL_set_isa_irq_level: perm =3D HVM__IRQLEVEL; break; + case XEN_HVMCTL_set_pci_link_route: + perm =3D HVM__PCIROUTE; + break; default: perm =3D HVM__HVMCTL; break; @@ -1520,11 +1523,6 @@ static int flask_ioport_mapping(struct d return flask_ioport_permission(d, start, end, access); } =20 -static int flask_hvm_set_pci_link_route(struct domain *d) -{ - return current_has_perm(d, SECCLASS_HVM, HVM__PCIROUTE); -} - static int flask_hvm_inject_msi(struct domain *d) { return current_has_perm(d, SECCLASS_HVM, HVM__SEND_IRQ); @@ -1803,7 +1801,6 @@ static struct xsm_operations flask_ops =3D #ifdef CONFIG_X86 .do_mca =3D flask_do_mca, .shadow_control =3D flask_shadow_control, - .hvm_set_pci_link_route =3D flask_hvm_set_pci_link_route, .hvm_inject_msi =3D flask_hvm_inject_msi, .hvm_ioreq_server =3D flask_hvm_ioreq_server, .mem_sharing_op =3D flask_mem_sharing_op, --- a/xen/xsm/flask/policy/access_vectors +++ b/xen/xsm/flask/policy/access_vectors @@ -265,7 +265,7 @@ class hvm pcilevel # XEN_HVMCTL_set_isa_irq_level irqlevel -# HVMOP_set_pci_link_route +# XEN_HVMCTL_set_pci_link_route pciroute bind_irq # XEN_DOMCTL_pin_mem_cacheattr --=__Part2F191290.3__= Content-Type: text/plain; name="hvmctl-03.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="hvmctl-03.patch" hvmctl: convert HVMOP_set_pci_link_route=0A=0ANote that this retains the = hvmop interface definitions as those had=0A(wrongly) been exposed to = non-tool stack consumers (albeit the=0Aoperation wouldn't have succeeded = when requested by a domain for=0Aitself).=0A=0ASigned-off-by: Jan Beulich = =0A=0A--- a/tools/libxc/xc_misc.c=0A+++ b/tools/libxc/xc= _misc.c=0A@@ -498,27 +498,11 @@ int xc_hvm_set_isa_irq_level(=0A int = xc_hvm_set_pci_link_route(=0A xc_interface *xch, domid_t dom, uint8_t = link, uint8_t isa_irq)=0A {=0A- DECLARE_HYPERCALL_BUFFER(struct = xen_hvm_set_pci_link_route, arg);=0A- int rc;=0A+ DECLARE_HVMCTL(set_= pci_link_route, dom,=0A+ .link =3D link,=0A+ = .isa_irq =3D isa_irq);=0A =0A- arg =3D xc_hypercall_buffer_allo= c(xch, arg, sizeof(*arg));=0A- if ( arg =3D=3D NULL )=0A- {=0A- = PERROR("Could not allocate memory for xc_hvm_set_pci_link_route = hypercall");=0A- return -1;=0A- }=0A-=0A- arg->domid =3D = dom;=0A- arg->link =3D link;=0A- arg->isa_irq =3D isa_irq;=0A-=0A-= rc =3D xencall2(xch->xcall, __HYPERVISOR_hvm_op,=0A- = HVMOP_set_pci_link_route,=0A- HYPERCALL_BUFFER_AS_ARG(arg)= );=0A-=0A- xc_hypercall_buffer_free(xch, arg);=0A-=0A- return = rc;=0A+ return do_hvmctl(xch, &hvmctl);=0A }=0A =0A int xc_hvm_inject_ms= i(=0A--- a/xen/arch/x86/hvm/control.c=0A+++ b/xen/arch/x86/hvm/control.c=0A= @@ -120,6 +120,11 @@ long do_hvmctl(XEN_GUEST_HANDLE_PARAM(xe=0A = rc =3D set_isa_irq_level(d, &op.u.set_isa_irq_level);=0A break;=0A = =0A+ case XEN_HVMCTL_set_pci_link_route:=0A+ rc =3D hvm_set_pci_l= ink_route(d, op.u.set_pci_link_route.link,=0A+ = op.u.set_pci_link_route.isa_irq);=0A+ break;=0A+=0A = default:=0A rc =3D -EOPNOTSUPP;=0A break;=0A--- a/xen/arch/= x86/hvm/hvm.c=0A+++ b/xen/arch/x86/hvm/hvm.c=0A@@ -4446,39 +4446,6 @@ = static void hvm_s3_resume(struct domain=0A }=0A }=0A =0A-static int = hvmop_set_pci_link_route(=0A- XEN_GUEST_HANDLE_PARAM(xen_hvm_set_pci_lin= k_route_t) uop)=0A-{=0A- struct xen_hvm_set_pci_link_route op;=0A- = struct domain *d;=0A- int rc;=0A-=0A- if ( copy_from_guest(&op, uop, = 1) )=0A- return -EFAULT;=0A-=0A- if ( (op.link > 3) || (op.isa_ir= q > 15) )=0A- return -EINVAL;=0A-=0A- rc =3D rcu_lock_remote_doma= in_by_id(op.domid, &d);=0A- if ( rc !=3D 0 )=0A- return = rc;=0A-=0A- rc =3D -EINVAL;=0A- if ( !is_hvm_domain(d) )=0A- = goto out;=0A-=0A- rc =3D xsm_hvm_set_pci_link_route(XSM_DM_PRIV, = d);=0A- if ( rc )=0A- goto out;=0A-=0A- rc =3D 0;=0A- = hvm_set_pci_link_route(d, op.link, op.isa_irq);=0A-=0A- out:=0A- = rcu_unlock_domain(d);=0A- return rc;=0A-}=0A-=0A static int hvmop_inject= _msi(=0A XEN_GUEST_HANDLE_PARAM(xen_hvm_inject_msi_t) uop)=0A {=0A@@ = -5325,11 +5292,6 @@ long do_hvm_op(unsigned long op, XEN_GUE=0A = guest_handle_cast(arg, xen_hvm_inject_msi_t));=0A break;=0A =0A- = case HVMOP_set_pci_link_route:=0A- rc =3D hvmop_set_pci_link_route= (=0A- guest_handle_cast(arg, xen_hvm_set_pci_link_route_t));=0A-= break;=0A-=0A case HVMOP_flush_tlbs:=0A rc =3D = guest_handle_is_null(arg) ? hvmop_flush_tlb_all() : -ENOSYS;=0A = break;=0A--- a/xen/arch/x86/hvm/irq.c=0A+++ b/xen/arch/x86/hvm/irq.c=0A@@ = -229,13 +229,17 @@ void hvm_assert_evtchn_irq(struct vcpu *=0A = hvm_set_callback_irq_level(v);=0A }=0A =0A-void hvm_set_pci_link_route(stru= ct domain *d, u8 link, u8 isa_irq)=0A+int hvm_set_pci_link_route(struct = domain *d, u8 link, u8 isa_irq)=0A {=0A struct hvm_irq *hvm_irq =3D = &d->arch.hvm_domain.irq;=0A u8 old_isa_irq;=0A int i;=0A =0A- = ASSERT((link <=3D 3) && (isa_irq <=3D 15));=0A+ if ( link > 3 || = isa_irq > 15 )=0A+ return -EINVAL;=0A+=0A+ if ( !is_hvm_domain(d)= )=0A+ return -EINVAL;=0A =0A spin_lock(&d->arch.hvm_domain.irq_= lock);=0A =0A@@ -273,6 +277,8 @@ void hvm_set_pci_link_route(struct = domai=0A =0A dprintk(XENLOG_G_INFO, "Dom%u PCI link %u changed %u -> = %u\n",=0A d->domain_id, link, old_isa_irq, isa_irq);=0A+=0A+ = return 0;=0A }=0A =0A int hvm_inject_msi(struct domain *d, uint64_t addr, = uint32_t data)=0A--- a/xen/include/public/hvm/control.h=0A+++ b/xen/include= /public/hvm/control.h=0A@@ -47,16 +47,26 @@ struct xen_hvm_set_isa_irq_leve= l {=0A uint8_t level;=0A };=0A =0A+/* XEN_HVMCTL_set_pci_link_route = */=0A+struct xen_hvm_set_pci_link_route {=0A+ /* PCI link identifier = (0-3). */=0A+ uint8_t link;=0A+ /* ISA IRQ (1-15), or 0 (disable = link). */=0A+ uint8_t isa_irq;=0A+};=0A+=0A struct xen_hvmctl {=0A = uint16_t interface_version; /* XEN_HVMCTL_INTERFACE_VERSION */=0A = domid_t domain;=0A uint16_t cmd;=0A #define XEN_HVMCTL_set_pci_intx_lev= el 1=0A #define XEN_HVMCTL_set_isa_irq_level = 2=0A+#define XEN_HVMCTL_set_pci_link_route 3=0A uint16_t = opaque; /* Must be zero on initial invocation. */=0A = union {=0A struct xen_hvm_set_pci_intx_level set_pci_intx_level;=0A= struct xen_hvm_set_isa_irq_level set_isa_irq_level;=0A+ = struct xen_hvm_set_pci_link_route set_pci_link_route;=0A uint8_t = pad[120];=0A } u;=0A };=0A--- a/xen/include/public/hvm/hvm_op.h=0A+++ = b/xen/include/public/hvm/hvm_op.h=0A@@ -66,8 +66,6 @@ struct xen_hvm_set_is= a_irq_level {=0A typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_i= rq_level_t;=0A DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);=0A = =0A-#endif=0A-=0A #define HVMOP_set_pci_link_route 4=0A struct xen_hvm_set= _pci_link_route {=0A /* Domain to be updated. */=0A@@ -80,6 +78,8 @@ = struct xen_hvm_set_pci_link_route {=0A typedef struct xen_hvm_set_pci_link_= route xen_hvm_set_pci_link_route_t;=0A DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_= pci_link_route_t);=0A =0A+#endif=0A+=0A /* Flushes all VCPU TLBs: @arg = must be NULL. */=0A #define HVMOP_flush_tlbs 5=0A =0A--- = a/xen/include/xen/hvm/irq.h=0A+++ b/xen/include/xen/hvm/irq.h=0A@@ -122,7 = +122,7 @@ void hvm_isa_irq_assert(=0A void hvm_isa_irq_deassert(=0A = struct domain *d, unsigned int isa_irq);=0A =0A-void hvm_set_pci_link_route= (struct domain *d, u8 link, u8 isa_irq);=0A+int hvm_set_pci_link_route(stru= ct domain *d, u8 link, u8 isa_irq);=0A =0A int hvm_inject_msi(struct = domain *d, uint64_t addr, uint32_t data);=0A =0A--- a/xen/include/xsm/dummy= .h=0A+++ b/xen/include/xsm/dummy.h=0A@@ -609,12 +609,6 @@ static XSM_INLINE= int xsm_shadow_control=0A return xsm_default_action(action, current->d= omain, d);=0A }=0A =0A-static XSM_INLINE int xsm_hvm_set_pci_link_route(XSM= _DEFAULT_ARG struct domain *d)=0A-{=0A- XSM_ASSERT_ACTION(XSM_DM_PRIV);= =0A- return xsm_default_action(action, current->domain, d);=0A-}=0A-=0A = static XSM_INLINE int xsm_hvm_inject_msi(XSM_DEFAULT_ARG struct domain = *d)=0A {=0A XSM_ASSERT_ACTION(XSM_DM_PRIV);=0A--- a/xen/xsm/dummy.c=0A+= ++ b/xen/xsm/dummy.c=0A@@ -145,7 +145,6 @@ void xsm_fixup_ops (struct = xsm_operation=0A #ifdef CONFIG_X86=0A set_to_dummy_if_null(ops, = do_mca);=0A set_to_dummy_if_null(ops, shadow_control);=0A- = set_to_dummy_if_null(ops, hvm_set_pci_link_route);=0A set_to_dummy_if_n= ull(ops, hvm_inject_msi);=0A set_to_dummy_if_null(ops, hvm_ioreq_server= );=0A set_to_dummy_if_null(ops, mem_sharing_op);=0A--- a/xen/xsm/flask/= hooks.c=0A+++ b/xen/xsm/flask/hooks.c=0A@@ -1196,6 +1196,9 @@ static int = flask_hvm_control(struct doma=0A case XEN_HVMCTL_set_isa_irq_level:=0A = perm =3D HVM__IRQLEVEL;=0A break;=0A+ case XEN_HVMCTL_se= t_pci_link_route:=0A+ perm =3D HVM__PCIROUTE;=0A+ break;=0A = default:=0A perm =3D HVM__HVMCTL;=0A break;=0A@@ = -1520,11 +1523,6 @@ static int flask_ioport_mapping(struct d=0A return = flask_ioport_permission(d, start, end, access);=0A }=0A =0A-static int = flask_hvm_set_pci_link_route(struct domain *d)=0A-{=0A- return = current_has_perm(d, SECCLASS_HVM, HVM__PCIROUTE);=0A-}=0A-=0A static int = flask_hvm_inject_msi(struct domain *d)=0A {=0A return current_has_perm(= d, SECCLASS_HVM, HVM__SEND_IRQ);=0A@@ -1803,7 +1801,6 @@ static struct = xsm_operations flask_ops =3D=0A #ifdef CONFIG_X86=0A .do_mca =3D = flask_do_mca,=0A .shadow_control =3D flask_shadow_control,=0A- = .hvm_set_pci_link_route =3D flask_hvm_set_pci_link_route,=0A .hvm_injec= t_msi =3D flask_hvm_inject_msi,=0A .hvm_ioreq_server =3D flask_hvm_iore= q_server,=0A .mem_sharing_op =3D flask_mem_sharing_op,=0A--- a/xen/xsm/= flask/policy/access_vectors=0A+++ b/xen/xsm/flask/policy/access_vectors=0A@= @ -265,7 +265,7 @@ class hvm=0A pcilevel=0A # XEN_HVMCTL_set_isa_irq_le= vel=0A irqlevel=0A-# HVMOP_set_pci_link_route=0A+# XEN_HVMCTL_set_pci_l= ink_route=0A pciroute=0A bind_irq=0A # XEN_DOMCTL_pin_mem_cacheattr= =0A --=__Part2F191290.3__= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwOi8vbGlzdHMueGVuLm9y Zy94ZW4tZGV2ZWwK --=__Part2F191290.3__=--