gs_cb
struct gs_cb *host_gscb;
struct gs_cb *gs_cb; /* Current guarded storage cb */
struct gs_cb *gs_bc_cb; /* Broadcast guarded storage cb */
static inline void load_gs_cb(struct gs_cb *gs_cb)
asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
static inline void store_gs_cb(struct gs_cb *gs_cb)
asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
static inline void save_gs_cb(struct gs_cb *gs_cb)
if (gs_cb)
store_gs_cb(gs_cb);
static inline void restore_gs_cb(struct gs_cb *gs_cb)
if (gs_cb)
load_gs_cb(gs_cb);
long sys_s390_guarded_storage(int command, struct gs_cb __user *);
struct gs_cb __user *, gs_cb)
return gs_set_bc_cb(gs_cb);
kfree(tsk->thread.gs_cb);
struct gs_cb *gs_cb;
if (!current->thread.gs_cb) {
gs_cb = kzalloc_obj(*gs_cb);
if (!gs_cb)
gs_cb->gsd = 25;
load_gs_cb(gs_cb);
current->thread.gs_cb = gs_cb;
if (current->thread.gs_cb) {
kfree(current->thread.gs_cb);
current->thread.gs_cb = NULL;
static int gs_set_bc_cb(struct gs_cb __user *u_gs_cb)
struct gs_cb *gs_cb;
gs_cb = current->thread.gs_bc_cb;
if (!gs_cb) {
gs_cb = kzalloc_obj(*gs_cb);
if (!gs_cb)
current->thread.gs_bc_cb = gs_cb;
if (copy_from_user(gs_cb, u_gs_cb, sizeof(*gs_cb)))
struct gs_cb *gs_cb;
gs_cb = current->thread.gs_bc_cb;
kfree(gs_cb);
struct gs_cb *gs_cb;
gs_cb = current->thread.gs_bc_cb;
if (gs_cb) {
kfree(current->thread.gs_cb);
load_gs_cb(gs_cb);
current->thread.gs_cb = gs_cb;
save_gs_cb((struct gs_cb *) mcesa->guarded_storage_save_area);
dst->thread.gs_cb = NULL;
save_gs_cb(prev->thread.gs_cb);
restore_gs_cb(next->thread.gs_cb);
struct gs_cb *data = target->thread.gs_cb;
return membuf_write(&to, data, sizeof(struct gs_cb));
struct gs_cb gs_cb = { }, *data = NULL;
if (!target->thread.gs_cb) {
if (!target->thread.gs_cb)
gs_cb.gsd = 25;
save_gs_cb(&gs_cb);
gs_cb = *target->thread.gs_cb;
&gs_cb, 0, sizeof(gs_cb));
if (!target->thread.gs_cb)
target->thread.gs_cb = data;
*target->thread.gs_cb = gs_cb;
restore_gs_cb(target->thread.gs_cb);
if (task->thread.gs_cb)
struct gs_cb *data = target->thread.gs_bc_cb;
return membuf_write(&to, data, sizeof(struct gs_cb));
struct gs_cb *data = target->thread.gs_bc_cb;
data, 0, sizeof(struct gs_cb));
.n = sizeof(struct gs_cb) / sizeof(__u64),
.n = sizeof(struct gs_cb) / sizeof(__u64),
save_gs_cb(current->thread.gs_cb);
struct gs_cb *gscb;
gscb = (struct gs_cb *) &kvm_run->s.regs.gscb;
if (current->thread.gs_cb) {
vcpu->arch.host_gscb = current->thread.gs_cb;
current->thread.gs_cb = (struct gs_cb *)
restore_gs_cb(current->thread.gs_cb);
save_gs_cb(current->thread.gs_cb);
current->thread.gs_cb = vcpu->arch.host_gscb;
current->thread.gs_cb = (struct gs_cb *)&vcpu->run->s.regs.gscb;
restore_gs_cb(current->thread.gs_cb);