xref: /freebsd-src/contrib/bearssl/T0/WordData.cs (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty using System;
26*0957b409SSimon J. Gerraty using System.Collections.Generic;
27*0957b409SSimon J. Gerraty 
28*0957b409SSimon J. Gerraty class WordData : Word {
29*0957b409SSimon J. Gerraty 
30*0957b409SSimon J. Gerraty 	ConstData blob;
31*0957b409SSimon J. Gerraty 	string baseBlobName;
32*0957b409SSimon J. Gerraty 	int offset;
33*0957b409SSimon J. Gerraty 	bool ongoingResolution;
34*0957b409SSimon J. Gerraty 
WordData(T0Comp owner, string name, ConstData blob, int offset)35*0957b409SSimon J. Gerraty 	internal WordData(T0Comp owner, string name,
36*0957b409SSimon J. Gerraty 		ConstData blob, int offset)
37*0957b409SSimon J. Gerraty 		: base(owner, name)
38*0957b409SSimon J. Gerraty 	{
39*0957b409SSimon J. Gerraty 		this.blob = blob;
40*0957b409SSimon J. Gerraty 		this.offset = offset;
41*0957b409SSimon J. Gerraty 		StackEffect = new SType(0, 1);
42*0957b409SSimon J. Gerraty 	}
43*0957b409SSimon J. Gerraty 
WordData(T0Comp owner, string name, string baseBlobName, int offset)44*0957b409SSimon J. Gerraty 	internal WordData(T0Comp owner, string name,
45*0957b409SSimon J. Gerraty 		string baseBlobName, int offset)
46*0957b409SSimon J. Gerraty 		: base(owner, name)
47*0957b409SSimon J. Gerraty 	{
48*0957b409SSimon J. Gerraty 		this.baseBlobName = baseBlobName;
49*0957b409SSimon J. Gerraty 		this.offset = offset;
50*0957b409SSimon J. Gerraty 		StackEffect = new SType(0, 1);
51*0957b409SSimon J. Gerraty 	}
52*0957b409SSimon J. Gerraty 
Resolve()53*0957b409SSimon J. Gerraty 	internal override void Resolve()
54*0957b409SSimon J. Gerraty 	{
55*0957b409SSimon J. Gerraty 		if (blob != null) {
56*0957b409SSimon J. Gerraty 			return;
57*0957b409SSimon J. Gerraty 		}
58*0957b409SSimon J. Gerraty 		if (ongoingResolution) {
59*0957b409SSimon J. Gerraty 			throw new Exception(String.Format(
60*0957b409SSimon J. Gerraty 				"circular reference in blobs ({0})", Name));
61*0957b409SSimon J. Gerraty 		}
62*0957b409SSimon J. Gerraty 		ongoingResolution = true;
63*0957b409SSimon J. Gerraty 		WordData wd = TC.Lookup(baseBlobName) as WordData;
64*0957b409SSimon J. Gerraty 		if (wd == null) {
65*0957b409SSimon J. Gerraty 			throw new Exception(String.Format(
66*0957b409SSimon J. Gerraty 				"data word '{0}' based on non-data word '{1}'",
67*0957b409SSimon J. Gerraty 				Name, baseBlobName));
68*0957b409SSimon J. Gerraty 		}
69*0957b409SSimon J. Gerraty 		wd.Resolve();
70*0957b409SSimon J. Gerraty 		blob = wd.blob;
71*0957b409SSimon J. Gerraty 		offset += wd.offset;
72*0957b409SSimon J. Gerraty 		ongoingResolution = false;
73*0957b409SSimon J. Gerraty 	}
74*0957b409SSimon J. Gerraty 
Run(CPU cpu)75*0957b409SSimon J. Gerraty 	internal override void Run(CPU cpu)
76*0957b409SSimon J. Gerraty 	{
77*0957b409SSimon J. Gerraty 		Resolve();
78*0957b409SSimon J. Gerraty 		cpu.Push(new TValue(offset, new TPointerBlob(blob)));
79*0957b409SSimon J. Gerraty 	}
80*0957b409SSimon J. Gerraty 
GetDataBlocks()81*0957b409SSimon J. Gerraty 	internal override List<ConstData> GetDataBlocks()
82*0957b409SSimon J. Gerraty 	{
83*0957b409SSimon J. Gerraty 		Resolve();
84*0957b409SSimon J. Gerraty 		List<ConstData> r = new List<ConstData>();
85*0957b409SSimon J. Gerraty 		r.Add(blob);
86*0957b409SSimon J. Gerraty 		return r;
87*0957b409SSimon J. Gerraty 	}
88*0957b409SSimon J. Gerraty 
GenerateCodeElements(List<CodeElement> dst)89*0957b409SSimon J. Gerraty 	internal override void GenerateCodeElements(List<CodeElement> dst)
90*0957b409SSimon J. Gerraty 	{
91*0957b409SSimon J. Gerraty 		Resolve();
92*0957b409SSimon J. Gerraty 		dst.Add(new CodeElementUInt(0));
93*0957b409SSimon J. Gerraty 		dst.Add(new CodeElementUIntInt(1, blob.Address + offset));
94*0957b409SSimon J. Gerraty 		dst.Add(new CodeElementUInt(0));
95*0957b409SSimon J. Gerraty 	}
96*0957b409SSimon J. Gerraty }
97