141c24a46SKip Macy /******************************************************************************
2*40e1d9d4SElliott Mitchell * SPDX-License-Identifier: MIT OR GPL-2.0-only
3*40e1d9d4SElliott Mitchell *
441c24a46SKip Macy * hypercall.h
541c24a46SKip Macy *
641c24a46SKip Macy * Linux-specific hypervisor handling.
741c24a46SKip Macy *
841c24a46SKip Macy * Copyright (c) 2002-2004, K A Fraser
941c24a46SKip Macy *
1041c24a46SKip Macy * This file may be distributed separately from the Linux kernel, or
1141c24a46SKip Macy * incorporated into other software packages, subject to the following license:
1241c24a46SKip Macy *
1341c24a46SKip Macy * Permission is hereby granted, free of charge, to any person obtaining a copy
1441c24a46SKip Macy * of this source file (the "Software"), to deal in the Software without
1541c24a46SKip Macy * restriction, including without limitation the rights to use, copy, modify,
1641c24a46SKip Macy * merge, publish, distribute, sublicense, and/or sell copies of the Software,
1741c24a46SKip Macy * and to permit persons to whom the Software is furnished to do so, subject to
1841c24a46SKip Macy * the following conditions:
1941c24a46SKip Macy *
2041c24a46SKip Macy * The above copyright notice and this permission notice shall be included in
2141c24a46SKip Macy * all copies or substantial portions of the Software.
2241c24a46SKip Macy *
2341c24a46SKip Macy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2441c24a46SKip Macy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2541c24a46SKip Macy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2641c24a46SKip Macy * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2741c24a46SKip Macy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2841c24a46SKip Macy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2941c24a46SKip Macy * IN THE SOFTWARE.
3041c24a46SKip Macy */
3141c24a46SKip Macy
3241c24a46SKip Macy #ifndef __HYPERCALL_H__
3341c24a46SKip Macy #define __HYPERCALL_H__
3441c24a46SKip Macy
3541c24a46SKip Macy #include <sys/systm.h>
36ad7dd514SElliott Mitchell #include <contrib/xen/xen.h>
37ad7dd514SElliott Mitchell #include <contrib/xen/sched.h>
3841c24a46SKip Macy
39bf7313e3SRoger Pau Monné extern char *hypercall_page;
40bf7313e3SRoger Pau Monné
4141c24a46SKip Macy #define __STR(x) #x
4241c24a46SKip Macy #define STR(x) __STR(x)
4341c24a46SKip Macy
4441c24a46SKip Macy #define HYPERCALL_STR(name) \
4541c24a46SKip Macy "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
4641c24a46SKip Macy
4741c24a46SKip Macy #define _hypercall0(type, name) \
4841c24a46SKip Macy ({ \
4941c24a46SKip Macy long __res; \
5041c24a46SKip Macy __asm__ volatile ( \
5141c24a46SKip Macy HYPERCALL_STR(name) \
5241c24a46SKip Macy : "=a" (__res) \
5341c24a46SKip Macy : \
5441c24a46SKip Macy : "memory" ); \
5541c24a46SKip Macy (type)__res; \
5641c24a46SKip Macy })
5741c24a46SKip Macy
5841c24a46SKip Macy #define _hypercall1(type, name, a1) \
5941c24a46SKip Macy ({ \
6041c24a46SKip Macy long __res, __ign1; \
6141c24a46SKip Macy __asm__ volatile ( \
6241c24a46SKip Macy HYPERCALL_STR(name) \
6341c24a46SKip Macy : "=a" (__res), "=b" (__ign1) \
6441c24a46SKip Macy : "1" ((long)(a1)) \
6541c24a46SKip Macy : "memory" ); \
6641c24a46SKip Macy (type)__res; \
6741c24a46SKip Macy })
6841c24a46SKip Macy
6941c24a46SKip Macy #define _hypercall2(type, name, a1, a2) \
7041c24a46SKip Macy ({ \
7141c24a46SKip Macy long __res, __ign1, __ign2; \
7241c24a46SKip Macy __asm__ volatile ( \
7341c24a46SKip Macy HYPERCALL_STR(name) \
7441c24a46SKip Macy : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \
7541c24a46SKip Macy : "1" ((long)(a1)), "2" ((long)(a2)) \
7641c24a46SKip Macy : "memory" ); \
7741c24a46SKip Macy (type)__res; \
7841c24a46SKip Macy })
7941c24a46SKip Macy
8041c24a46SKip Macy #define _hypercall3(type, name, a1, a2, a3) \
8141c24a46SKip Macy ({ \
8241c24a46SKip Macy long __res, __ign1, __ign2, __ign3; \
8341c24a46SKip Macy __asm__ volatile ( \
8441c24a46SKip Macy HYPERCALL_STR(name) \
8541c24a46SKip Macy : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
8641c24a46SKip Macy "=d" (__ign3) \
8741c24a46SKip Macy : "1" ((long)(a1)), "2" ((long)(a2)), \
8841c24a46SKip Macy "3" ((long)(a3)) \
8941c24a46SKip Macy : "memory" ); \
9041c24a46SKip Macy (type)__res; \
9141c24a46SKip Macy })
9241c24a46SKip Macy
9341c24a46SKip Macy #define _hypercall4(type, name, a1, a2, a3, a4) \
9441c24a46SKip Macy ({ \
9541c24a46SKip Macy long __res, __ign1, __ign2, __ign3, __ign4; \
9641c24a46SKip Macy __asm__ volatile ( \
9741c24a46SKip Macy HYPERCALL_STR(name) \
9841c24a46SKip Macy : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
9941c24a46SKip Macy "=d" (__ign3), "=S" (__ign4) \
10041c24a46SKip Macy : "1" ((long)(a1)), "2" ((long)(a2)), \
10141c24a46SKip Macy "3" ((long)(a3)), "4" ((long)(a4)) \
10241c24a46SKip Macy : "memory" ); \
10341c24a46SKip Macy (type)__res; \
10441c24a46SKip Macy })
10541c24a46SKip Macy
10641c24a46SKip Macy #define _hypercall5(type, name, a1, a2, a3, a4, a5) \
10741c24a46SKip Macy ({ \
10841c24a46SKip Macy long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \
10941c24a46SKip Macy __asm__ volatile ( \
11041c24a46SKip Macy HYPERCALL_STR(name) \
11141c24a46SKip Macy : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \
11241c24a46SKip Macy "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \
11341c24a46SKip Macy : "1" ((long)(a1)), "2" ((long)(a2)), \
11441c24a46SKip Macy "3" ((long)(a3)), "4" ((long)(a4)), \
11541c24a46SKip Macy "5" ((long)(a5)) \
11641c24a46SKip Macy : "memory" ); \
11741c24a46SKip Macy (type)__res; \
11841c24a46SKip Macy })
11941c24a46SKip Macy
120bf7313e3SRoger Pau Monné static inline long
privcmd_hypercall(long op,long a1,long a2,long a3,long a4,long a5)121bf7313e3SRoger Pau Monné privcmd_hypercall(long op, long a1, long a2, long a3, long a4, long a5)
122bf7313e3SRoger Pau Monné {
123bf7313e3SRoger Pau Monné long __res, __ign1, __ign2, __ign3, __ign4, __ign5, __call;
124bf7313e3SRoger Pau Monné
125e99c0c8bSDan Carpenter if (op >= PAGE_SIZE / 32)
126e99c0c8bSDan Carpenter return -EINVAL;
127e99c0c8bSDan Carpenter
128bf7313e3SRoger Pau Monné __call = (long)&hypercall_page + (op * 32);
129bf7313e3SRoger Pau Monné __asm__ volatile (
130bf7313e3SRoger Pau Monné "call *%[call]"
131bf7313e3SRoger Pau Monné : "=a" (__res), "=b" (__ign1), "=c" (__ign2),
132bf7313e3SRoger Pau Monné "=d" (__ign3), "=S" (__ign4), "=D" (__ign5)
133bf7313e3SRoger Pau Monné : "1" ((long)(a1)), "2" ((long)(a2)),
134bf7313e3SRoger Pau Monné "3" ((long)(a3)), "4" ((long)(a4)),
135bf7313e3SRoger Pau Monné "5" ((long)(a5)), [call] "a" (__call)
136bf7313e3SRoger Pau Monné : "memory" );
137bf7313e3SRoger Pau Monné
138bf7313e3SRoger Pau Monné return __res;
139bf7313e3SRoger Pau Monné }
140bf7313e3SRoger Pau Monné
14141c24a46SKip Macy static inline int
HYPERVISOR_set_trap_table(trap_info_t * table)14241c24a46SKip Macy HYPERVISOR_set_trap_table(
14341c24a46SKip Macy trap_info_t *table)
14441c24a46SKip Macy {
14541c24a46SKip Macy return _hypercall1(int, set_trap_table, table);
14641c24a46SKip Macy }
14741c24a46SKip Macy
14841c24a46SKip Macy static inline int
HYPERVISOR_mmu_update(mmu_update_t * req,int count,int * success_count,domid_t domid)14941c24a46SKip Macy HYPERVISOR_mmu_update(
15041c24a46SKip Macy mmu_update_t *req, int count, int *success_count, domid_t domid)
15141c24a46SKip Macy {
15241c24a46SKip Macy return _hypercall4(int, mmu_update, req, count, success_count, domid);
15341c24a46SKip Macy }
15441c24a46SKip Macy
15541c24a46SKip Macy static inline int
HYPERVISOR_mmuext_op(mmuext_op_t * op,int count,int * success_count,domid_t domid)15641c24a46SKip Macy HYPERVISOR_mmuext_op(
15741c24a46SKip Macy mmuext_op_t *op, int count, int *success_count, domid_t domid)
15841c24a46SKip Macy {
15941c24a46SKip Macy return _hypercall4(int, mmuext_op, op, count, success_count, domid);
16041c24a46SKip Macy }
16141c24a46SKip Macy
16241c24a46SKip Macy static inline int
HYPERVISOR_set_gdt(unsigned long * frame_list,int entries)16341c24a46SKip Macy HYPERVISOR_set_gdt(
16441c24a46SKip Macy unsigned long *frame_list, int entries)
16541c24a46SKip Macy {
16641c24a46SKip Macy return _hypercall2(int, set_gdt, frame_list, entries);
16741c24a46SKip Macy }
16841c24a46SKip Macy
16941c24a46SKip Macy static inline int
HYPERVISOR_stack_switch(unsigned long ss,unsigned long esp)17041c24a46SKip Macy HYPERVISOR_stack_switch(
17141c24a46SKip Macy unsigned long ss, unsigned long esp)
17241c24a46SKip Macy {
17341c24a46SKip Macy return _hypercall2(int, stack_switch, ss, esp);
17441c24a46SKip Macy }
17541c24a46SKip Macy
17641c24a46SKip Macy static inline int
HYPERVISOR_set_callbacks(unsigned long event_selector,unsigned long event_address,unsigned long failsafe_selector,unsigned long failsafe_address)17741c24a46SKip Macy HYPERVISOR_set_callbacks(
17841c24a46SKip Macy unsigned long event_selector, unsigned long event_address,
17941c24a46SKip Macy unsigned long failsafe_selector, unsigned long failsafe_address)
18041c24a46SKip Macy {
18141c24a46SKip Macy return _hypercall4(int, set_callbacks,
18241c24a46SKip Macy event_selector, event_address,
18341c24a46SKip Macy failsafe_selector, failsafe_address);
18441c24a46SKip Macy }
18541c24a46SKip Macy
18641c24a46SKip Macy static inline int
HYPERVISOR_fpu_taskswitch(int set)18741c24a46SKip Macy HYPERVISOR_fpu_taskswitch(
18841c24a46SKip Macy int set)
18941c24a46SKip Macy {
19041c24a46SKip Macy return _hypercall1(int, fpu_taskswitch, set);
19141c24a46SKip Macy }
19241c24a46SKip Macy
19341c24a46SKip Macy static inline int
HYPERVISOR_sched_op(int cmd,void * arg)19441c24a46SKip Macy HYPERVISOR_sched_op(
19541c24a46SKip Macy int cmd, void *arg)
19641c24a46SKip Macy {
19741c24a46SKip Macy return _hypercall2(int, sched_op, cmd, arg);
19841c24a46SKip Macy }
19941c24a46SKip Macy
20041c24a46SKip Macy static inline long
HYPERVISOR_set_timer_op(uint64_t timeout)20141c24a46SKip Macy HYPERVISOR_set_timer_op(
20241c24a46SKip Macy uint64_t timeout)
20341c24a46SKip Macy {
20441c24a46SKip Macy unsigned long timeout_hi = (unsigned long)(timeout>>32);
20541c24a46SKip Macy unsigned long timeout_lo = (unsigned long)timeout;
20641c24a46SKip Macy return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
20741c24a46SKip Macy }
20871718d3cSRoger Pau Monné
20941c24a46SKip Macy static inline int
HYPERVISOR_platform_op(struct xen_platform_op * platform_op)21041c24a46SKip Macy HYPERVISOR_platform_op(
21141c24a46SKip Macy struct xen_platform_op *platform_op)
21241c24a46SKip Macy {
21341c24a46SKip Macy platform_op->interface_version = XENPF_INTERFACE_VERSION;
21441c24a46SKip Macy return _hypercall1(int, platform_op, platform_op);
21541c24a46SKip Macy }
21671718d3cSRoger Pau Monné
21741c24a46SKip Macy static inline int
HYPERVISOR_set_debugreg(int reg,unsigned long value)21841c24a46SKip Macy HYPERVISOR_set_debugreg(
21941c24a46SKip Macy int reg, unsigned long value)
22041c24a46SKip Macy {
22141c24a46SKip Macy return _hypercall2(int, set_debugreg, reg, value);
22241c24a46SKip Macy }
22341c24a46SKip Macy
22441c24a46SKip Macy static inline unsigned long
HYPERVISOR_get_debugreg(int reg)22541c24a46SKip Macy HYPERVISOR_get_debugreg(
22641c24a46SKip Macy int reg)
22741c24a46SKip Macy {
22841c24a46SKip Macy return _hypercall1(unsigned long, get_debugreg, reg);
22941c24a46SKip Macy }
23041c24a46SKip Macy
23141c24a46SKip Macy static inline int
HYPERVISOR_update_descriptor(uint64_t ma,uint64_t desc)23241c24a46SKip Macy HYPERVISOR_update_descriptor(
23341c24a46SKip Macy uint64_t ma, uint64_t desc)
23441c24a46SKip Macy {
23541c24a46SKip Macy return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
23641c24a46SKip Macy }
23741c24a46SKip Macy
23841c24a46SKip Macy static inline int
HYPERVISOR_memory_op(unsigned int cmd,void * arg)23941c24a46SKip Macy HYPERVISOR_memory_op(
24041c24a46SKip Macy unsigned int cmd, void *arg)
24141c24a46SKip Macy {
24241c24a46SKip Macy return _hypercall2(int, memory_op, cmd, arg);
24341c24a46SKip Macy }
24441c24a46SKip Macy
2452913e88cSRobert Watson static inline int
HYPERVISOR_multicall(void * call_list,int nr_calls)2462913e88cSRobert Watson HYPERVISOR_multicall(
24741c24a46SKip Macy void *call_list, int nr_calls)
24841c24a46SKip Macy {
24941c24a46SKip Macy return _hypercall2(int, multicall, call_list, nr_calls);
25041c24a46SKip Macy }
25141c24a46SKip Macy
25241c24a46SKip Macy static inline int
HYPERVISOR_update_va_mapping(unsigned long va,uint64_t new_val,unsigned long flags)25341c24a46SKip Macy HYPERVISOR_update_va_mapping(
25441c24a46SKip Macy unsigned long va, uint64_t new_val, unsigned long flags)
25541c24a46SKip Macy {
25641c24a46SKip Macy uint32_t hi, lo;
25741c24a46SKip Macy
25841c24a46SKip Macy lo = (uint32_t)(new_val & 0xffffffff);
25941c24a46SKip Macy hi = (uint32_t)(new_val >> 32);
26041c24a46SKip Macy
26141c24a46SKip Macy return _hypercall4(int, update_va_mapping, va,
26241c24a46SKip Macy lo, hi, flags);
26341c24a46SKip Macy }
26441c24a46SKip Macy
26541c24a46SKip Macy static inline int
HYPERVISOR_event_channel_op(int cmd,void * arg)26641c24a46SKip Macy HYPERVISOR_event_channel_op(
26741c24a46SKip Macy int cmd, void *arg)
26841c24a46SKip Macy {
269ecdcad65SElliott Mitchell return _hypercall2(int, event_channel_op, cmd, arg);
27041c24a46SKip Macy }
27141c24a46SKip Macy
27241c24a46SKip Macy static inline int
HYPERVISOR_xen_version(int cmd,void * arg)27341c24a46SKip Macy HYPERVISOR_xen_version(
27441c24a46SKip Macy int cmd, void *arg)
27541c24a46SKip Macy {
27641c24a46SKip Macy return _hypercall2(int, xen_version, cmd, arg);
27741c24a46SKip Macy }
27841c24a46SKip Macy
27941c24a46SKip Macy static inline int
HYPERVISOR_console_io(int cmd,int count,const char * str)28041c24a46SKip Macy HYPERVISOR_console_io(
281a231723cSRoger Pau Monné int cmd, int count, const char *str)
28241c24a46SKip Macy {
28341c24a46SKip Macy return _hypercall3(int, console_io, cmd, count, str);
28441c24a46SKip Macy }
28541c24a46SKip Macy
28641c24a46SKip Macy static inline int
HYPERVISOR_physdev_op(int cmd,void * arg)28741c24a46SKip Macy HYPERVISOR_physdev_op(
28841c24a46SKip Macy int cmd, void *arg)
28941c24a46SKip Macy {
290ecdcad65SElliott Mitchell return _hypercall2(int, physdev_op, cmd, arg);
29141c24a46SKip Macy }
29241c24a46SKip Macy
29341c24a46SKip Macy static inline int
HYPERVISOR_grant_table_op(unsigned int cmd,void * uop,unsigned int count)29441c24a46SKip Macy HYPERVISOR_grant_table_op(
29541c24a46SKip Macy unsigned int cmd, void *uop, unsigned int count)
29641c24a46SKip Macy {
29741c24a46SKip Macy return _hypercall3(int, grant_table_op, cmd, uop, count);
29841c24a46SKip Macy }
29941c24a46SKip Macy
30041c24a46SKip Macy static inline int
HYPERVISOR_update_va_mapping_otherdomain(unsigned long va,uint64_t new_val,unsigned long flags,domid_t domid)30141c24a46SKip Macy HYPERVISOR_update_va_mapping_otherdomain(
30241c24a46SKip Macy unsigned long va, uint64_t new_val, unsigned long flags, domid_t domid)
30341c24a46SKip Macy {
30441c24a46SKip Macy uint32_t hi, lo;
30541c24a46SKip Macy
30641c24a46SKip Macy lo = (uint32_t)(new_val & 0xffffffff);
30741c24a46SKip Macy hi = (uint32_t)(new_val >> 32);
30841c24a46SKip Macy
30941c24a46SKip Macy return _hypercall5(int, update_va_mapping_otherdomain, va,
31041c24a46SKip Macy lo, hi, flags, domid);
31141c24a46SKip Macy }
31241c24a46SKip Macy
31341c24a46SKip Macy static inline int
HYPERVISOR_vm_assist(unsigned int cmd,unsigned int type)31441c24a46SKip Macy HYPERVISOR_vm_assist(
31541c24a46SKip Macy unsigned int cmd, unsigned int type)
31641c24a46SKip Macy {
31741c24a46SKip Macy return _hypercall2(int, vm_assist, cmd, type);
31841c24a46SKip Macy }
31941c24a46SKip Macy
32041c24a46SKip Macy static inline int
HYPERVISOR_vcpu_op(int cmd,int vcpuid,void * extra_args)32141c24a46SKip Macy HYPERVISOR_vcpu_op(
32241c24a46SKip Macy int cmd, int vcpuid, void *extra_args)
32341c24a46SKip Macy {
32441c24a46SKip Macy return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
32541c24a46SKip Macy }
32641c24a46SKip Macy
32741c24a46SKip Macy static inline int
HYPERVISOR_suspend(unsigned long srec)32841c24a46SKip Macy HYPERVISOR_suspend(
32941c24a46SKip Macy unsigned long srec)
33041c24a46SKip Macy {
33141c24a46SKip Macy struct sched_shutdown sched_shutdown = {
33241c24a46SKip Macy .reason = SHUTDOWN_suspend
33341c24a46SKip Macy };
33441c24a46SKip Macy
335ecdcad65SElliott Mitchell return _hypercall3(int, sched_op, SCHEDOP_shutdown,
336ecdcad65SElliott Mitchell &sched_shutdown, srec);
33741c24a46SKip Macy }
33841c24a46SKip Macy
33941c24a46SKip Macy static inline int
HYPERVISOR_callback_op(int cmd,void * arg)34041c24a46SKip Macy HYPERVISOR_callback_op(
34141c24a46SKip Macy int cmd, void *arg)
34241c24a46SKip Macy {
34341c24a46SKip Macy return _hypercall2(int, callback_op, cmd, arg);
34441c24a46SKip Macy }
34541c24a46SKip Macy
34641c24a46SKip Macy static inline unsigned long
HYPERVISOR_hvm_op(int op,void * arg)34741c24a46SKip Macy HYPERVISOR_hvm_op(
34841c24a46SKip Macy int op, void *arg)
34941c24a46SKip Macy {
35041c24a46SKip Macy return _hypercall2(unsigned long, hvm_op, op, arg);
35141c24a46SKip Macy }
35241c24a46SKip Macy
35341c24a46SKip Macy static inline int
HYPERVISOR_xenoprof_op(int op,void * arg)35441c24a46SKip Macy HYPERVISOR_xenoprof_op(
35541c24a46SKip Macy int op, void *arg)
35641c24a46SKip Macy {
35741c24a46SKip Macy return _hypercall2(int, xenoprof_op, op, arg);
35841c24a46SKip Macy }
35941c24a46SKip Macy
36041c24a46SKip Macy static inline int
HYPERVISOR_kexec_op(unsigned long op,void * args)36141c24a46SKip Macy HYPERVISOR_kexec_op(
36241c24a46SKip Macy unsigned long op, void *args)
36341c24a46SKip Macy {
36441c24a46SKip Macy return _hypercall2(int, kexec_op, op, args);
36541c24a46SKip Macy }
366ed78016dSRoger Pau Monne
367ed78016dSRoger Pau Monne static inline int
HYPERVISOR_dm_op(domid_t domid,unsigned int nr_bufs,const void * bufs)368ed78016dSRoger Pau Monne HYPERVISOR_dm_op(
369ed78016dSRoger Pau Monne domid_t domid, unsigned int nr_bufs, const void *bufs)
370ed78016dSRoger Pau Monne {
371ed78016dSRoger Pau Monne return _hypercall3(int, dm_op, domid, nr_bufs, bufs);
372ed78016dSRoger Pau Monne }
37341c24a46SKip Macy #endif /* __HYPERCALL_H__ */
37441c24a46SKip Macy
37541c24a46SKip Macy /*
37641c24a46SKip Macy * Local variables:
37741c24a46SKip Macy * c-file-style: "linux"
37841c24a46SKip Macy * indent-tabs-mode: t
37941c24a46SKip Macy * c-indent-level: 8
38041c24a46SKip Macy * c-basic-offset: 8
38141c24a46SKip Macy * tab-width: 8
38241c24a46SKip Macy * End:
38341c24a46SKip Macy */
384